diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index d9dbf33c..12aaf355 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -1,2 +1,5 @@ # Initial format commit -245bc11c93fcff5cbaceddb799de5e1fad132d3e \ No newline at end of file +245bc11c93fcff5cbaceddb799de5e1fad132d3e + +# Replatform format commit +abe8637ab83416cd9927e5e5e1c121144fbc3969 \ No newline at end of file diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index b332ae88..75bd5acb 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -13,7 +13,7 @@ on: # However, do NOT cancel in-progress runs as we want to allow these deployments to complete. # This shouldn't be necessary for most cases, but it can help avoid conflicts if multiple pushes happen in quick succession. concurrency: - group: "pages" + group: 'pages' cancel-in-progress: false jobs: @@ -93,7 +93,6 @@ jobs: name: github-pages url: ${{ steps.deployment.outputs.page_url }} - steps: - name: Deploy to GitHub Pages id: deployment diff --git a/.gitignore b/.gitignore index 995b9d4e..df64bbf2 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,29 @@ bin-release/ .idea/modules.xml .idea/vcs.xml -node_modules \ No newline at end of file +node_modules + +# Site .gitignore so its picked up by prettier +# Dependencies +site/node_modules + +# Production +site/build + +# Latest (/docs/) is a build time copy of the latest version +site/docs + +# Generated files +site/.docusaurus +site/.cache-loader + +# Misc +site/.DS_Store +site/.env.local +site/.env.development.local +site/.env.test.local +site/.env.production.local + +site/npm-debug.log* +site/yarn-debug.log* +site/yarn-error.log* diff --git a/docs/administration/_category_.json b/docs/administration/_category_.json index 828e0998..59c33ea4 100644 --- a/docs/administration/_category_.json +++ b/docs/administration/_category_.json @@ -1,12 +1,10 @@ { - "label": "Administration", - "position": 2, - "link": { - "type": "generated-index", - "title": "Administration Documentation", - "description": "Guides for managing and administering HarperDB instances", - "keywords": [ - "administration" - ] - } -} \ No newline at end of file + "label": "Administration", + "position": 2, + "link": { + "type": "generated-index", + "title": "Administration Documentation", + "description": "Guides for managing and administering HarperDB instances", + "keywords": ["administration"] + } +} diff --git a/docs/administration/harper-studio/instances.md b/docs/administration/harper-studio/instances.md index 40479334..e53403a9 100644 --- a/docs/administration/harper-studio/instances.md +++ b/docs/administration/harper-studio/instances.md @@ -40,11 +40,11 @@ A summary view of all instances within an organization can be viewed by clicking 1. Select Instance Specs 1. Select Instance RAM - _Harper Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance._ _More on instance specs__._ + _Harper Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance._ _More on instance specs\_\_._ 1. Select Storage Size - _Each instance has a mounted storage volume where your Harper data will reside. Storage is provisioned based on space and IOPS._ _More on IOPS Impact on Performance__._ + _Each instance has a mounted storage volume where your Harper data will reside. Storage is provisioned based on space and IOPS._ _More on IOPS Impact on Performance\_\_._ 1. Select Instance Region diff --git a/docs/custom-functions/create-project.md b/docs/custom-functions/create-project.md index f7c80d7c..3353e666 100644 --- a/docs/custom-functions/create-project.md +++ b/docs/custom-functions/create-project.md @@ -10,7 +10,7 @@ Otherwise, to create a project, you have the following options: 1. **Use the add_custom_function_project operation** - This operation creates a new project folder, and populates it with templates for the routes, helpers, and static subfolders. + This operation creates a new project folder, and populates it with templates for the routes, helpers, and static subfolders. ```json { diff --git a/docs/deployments/_category_.json b/docs/deployments/_category_.json index 8fdd6e17..95644c6b 100644 --- a/docs/deployments/_category_.json +++ b/docs/deployments/_category_.json @@ -1,12 +1,10 @@ { - "label": "Deployments", - "position": 3, - "link": { - "type": "generated-index", - "title": "Deployments Documentation", - "description": "Installation and deployment guides for HarperDB", - "keywords": [ - "deployments" - ] - } -} \ No newline at end of file + "label": "Deployments", + "position": 3, + "link": { + "type": "generated-index", + "title": "Deployments Documentation", + "description": "Installation and deployment guides for HarperDB", + "keywords": ["deployments"] + } +} diff --git a/docs/deployments/configuration.md b/docs/deployments/configuration.md index 6a67c618..f631e48f 100644 --- a/docs/deployments/configuration.md +++ b/docs/deployments/configuration.md @@ -583,9 +583,9 @@ To access the audit logs, use the API operation `read_audit_log`. It will provid ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog" + "operation": "read_audit_log", + "schema": "dev", + "table": "dog" } ``` @@ -728,7 +728,7 @@ This section defines log configuration for HTTP logging. By default, HTTP reques - `timing` - This will log timing information - `headers` - This will log the headers in each request (which can be very verbose) - `id` - This will assign a unique id to each request and log it in the entry for each request. This is assigned as the `request.requestId` property and can be used to by other logging to track a request. -Note that the `level` will determine which HTTP requests are logged: + Note that the `level` will determine which HTTP requests are logged: - `info` (or more verbose) - All HTTP requests - `warn` - HTTP requests with a status code of 400 or above - `error` - HTTP requests with a status code of 500 @@ -737,10 +737,10 @@ For example: ```yaml http: - logging: + logging: timing: true level: info - path: ~/hdb/log/http.log + path: ~/hdb/log/http.log ... rest of http config ``` diff --git a/docs/deployments/harper-cloud/alarms.md b/docs/deployments/harper-cloud/alarms.md index 8b695c37..372807e5 100644 --- a/docs/deployments/harper-cloud/alarms.md +++ b/docs/deployments/harper-cloud/alarms.md @@ -13,8 +13,8 @@ Harper Cloud instance alarms are triggered when certain conditions are met. Once - **Intervals**: The number of occurrences before an alarm is triggered and the period that the metric is evaluated over. - **Proposed Remedy**: Recommended solution to avoid the alert in the future. -| Alarm | Threshold | Intervals | Proposed Remedy | -| ------- | ---------- | --------- | ------------------------------------------------------------------------------------------------------------------------------ | +| Alarm | Threshold | Intervals | Proposed Remedy | +| ------- | ---------- | --------- | --------------------------------------------------------------------------------------------------------------------------- | | Storage | > 90% Disk | 1 x 5min | [Increased storage volume](../../administration/harper-studio/instance-configuration#update-instance-storage) | | CPU | > 90% Avg | 2 x 5min | [Increase instance size for additional CPUs](../../administration/harper-studio/instance-configuration#update-instance-ram) | | Memory | > 90% RAM | 2 x 5min | [Increase instance size](../../administration/harper-studio/instance-configuration#update-instance-ram) | diff --git a/docs/deployments/upgrade-hdb-instance.md b/docs/deployments/upgrade-hdb-instance.md index 3e11fc47..da1c885f 100644 --- a/docs/deployments/upgrade-hdb-instance.md +++ b/docs/deployments/upgrade-hdb-instance.md @@ -12,11 +12,11 @@ Upgrading Harper is a two-step process. First the latest version of Harper must 1. Install the latest version of Harper using `npm install -g harperdb`. - Note `-g` should only be used if you installed Harper globally (which is recommended). + Note `-g` should only be used if you installed Harper globally (which is recommended). 1. Run `harperdb` to initiate the upgrade process. - Harper will then prompt you for all appropriate inputs and then run the upgrade directives. + Harper will then prompt you for all appropriate inputs and then run the upgrade directives. ## Node Version Manager (nvm) @@ -130,7 +130,7 @@ replication: { "operation": "add_node", "hostname:": "node-1", - "url": "wss://my-cluster-node-1:9925" + "url": "wss://my-cluster-node-1:9925" } ``` diff --git a/docs/developers/_category_.json b/docs/developers/_category_.json index 9fe399bf..fdc723e5 100644 --- a/docs/developers/_category_.json +++ b/docs/developers/_category_.json @@ -1,12 +1,10 @@ { - "label": "Developers", - "position": 1, - "link": { - "type": "generated-index", - "title": "Developers Documentation", - "description": "Comprehensive guides and references for building applications with HarperDB", - "keywords": [ - "developers" - ] - } -} \ No newline at end of file + "label": "Developers", + "position": 1, + "link": { + "type": "generated-index", + "title": "Developers Documentation", + "description": "Comprehensive guides and references for building applications with HarperDB", + "keywords": ["developers"] + } +} diff --git a/docs/developers/applications/caching.md b/docs/developers/applications/caching.md index 1f941d8a..0a42d6f0 100644 --- a/docs/developers/applications/caching.md +++ b/docs/developers/applications/caching.md @@ -33,8 +33,8 @@ Next, you need to define the source for your cache. External data sources could ```javascript class ThirdPartyAPI extends Resource { async get() { - return (await fetch(`https://some-api.com/${this.getId()}`)).json(); - } + return (await fetch(`https://some-api.com/${this.getId()}`)).json(); + } } ``` @@ -69,11 +69,11 @@ In the example above, we simply retrieved data to fulfill a cache request. We ma ```javascript class ThirdPartyAPI extends Resource { - async get() { - let response = await fetch(`https://some-api.com/${this.getId()}`); - this.getContext().lastModified = response.headers.get('Last-Modified'); - return response.json(); - } + async get() { + let response = await fetch(`https://some-api.com/${this.getId()}`); + this.getContext().lastModified = response.headers.get('Last-Modified'); + return response.json(); + } } ``` @@ -109,11 +109,11 @@ One way to provide more active caching is to specifically invalidate individual ```javascript const { MyTable } = tables; export class MyTableEndpoint extends MyTable { - async post(data) { - if (data.invalidate) - // use this flag as a marker - this.invalidate(); - } + async post(data) { + if (data.invalidate) + // use this flag as a marker + this.invalidate(); + } } ``` @@ -176,13 +176,13 @@ An alternative to using asynchronous generators is to use a subscription stream ```javascript class ThirdPartyAPI extends Resource { - subscribe() { - const subscription = super.subscribe(); - setupListeningToRemoteService().on('update', (event) => { - subscription.send(event); - }); - return subscription; - } + subscribe() { + const subscription = super.subscribe(); + setupListeningToRemoteService().on('update', (event) => { + subscription.send(event); + }); + return subscription; + } } ``` @@ -218,12 +218,12 @@ When you are using a caching table, it is important to remember that any resourc ```javascript class MyCache extends tables.MyCache { - async post(data) { - // if the data is not cached locally, retrieves from source: - await this.ensuredLoaded(); - // now we can be sure that the data is loaded, and can access properties - this.quantity = this.quantity - data.purchases; - } + async post(data) { + // if the data is not cached locally, retrieves from source: + await this.ensuredLoaded(); + // now we can be sure that the data is loaded, and can access properties + this.quantity = this.quantity - data.purchases; + } } ``` diff --git a/docs/developers/applications/data-loader.md b/docs/developers/applications/data-loader.md index 488b7b19..9aed9546 100644 --- a/docs/developers/applications/data-loader.md +++ b/docs/developers/applications/data-loader.md @@ -27,22 +27,22 @@ Create a data file in your component's data directory (one table per file): ```json { - "database": "myapp", - "table": "users", - "records": [ - { - "id": 1, - "username": "admin", - "email": "admin@example.com", - "role": "administrator" - }, - { - "id": 2, - "username": "user1", - "email": "user1@example.com", - "role": "standard" - } - ] + "database": "myapp", + "table": "users", + "records": [ + { + "id": 1, + "username": "admin", + "email": "admin@example.com", + "role": "administrator" + }, + { + "id": 2, + "username": "user1", + "email": "user1@example.com", + "role": "standard" + } + ] } ``` @@ -51,21 +51,23 @@ Create a data file in your component's data directory (one table per file): To load data into multiple tables, create separate data files for each table: **users.json:** + ```json { - "database": "myapp", - "table": "users", - "records": [ - { - "id": 1, - "username": "admin", - "email": "admin@example.com" - } - ] + "database": "myapp", + "table": "users", + "records": [ + { + "id": 1, + "username": "admin", + "email": "admin@example.com" + } + ] } ``` **settings.yaml:** + ```yaml database: myapp table: settings @@ -75,7 +77,7 @@ records: setting_value: My Application - id: 2 setting_name: version - setting_value: "1.0.0" + setting_value: '1.0.0' ``` ## File Organization @@ -83,21 +85,24 @@ records: You can organize your data files in various ways: ### Single File Pattern + ```yaml dataLoader: files: 'data/seed-data.json' ``` ### Multiple Files Pattern + ```yaml dataLoader: - files: + files: - 'data/users.json' - 'data/settings.yaml' - 'data/initial-products.json' ``` ### Glob Pattern + ```yaml dataLoader: files: 'data/**/*.{json,yaml,yml}' @@ -173,4 +178,4 @@ rest: true - [Built-In Components](../../technical-details/reference/components/built-in-extensions) - [Extensions](../../technical-details/reference/components/extensions) -- [Bulk Operations](../operations-api/bulk-operations) - For loading data via the Operations API \ No newline at end of file +- [Bulk Operations](../operations-api/bulk-operations) - For loading data via the Operations API diff --git a/docs/developers/applications/index.md b/docs/developers/applications/index.md index eddd2a44..2f45ab8b 100644 --- a/docs/developers/applications/index.md +++ b/docs/developers/applications/index.md @@ -202,7 +202,7 @@ const { Breed } = tables; // our Breed table class BreedSource extends Resource { // define a data source async get(target) { - return (await fetch(`https://best-dog-site.com/${target}`)).json(); + return (await fetch(`https://best-dog-site.com/${target}`)).json(); } } // define that our breed table is a cache of data from the data source above, with a specified expiration diff --git a/docs/developers/operations-api/advanced-json-sql-examples.md b/docs/developers/operations-api/advanced-json-sql-examples.md index 9613d0fb..ec300e2e 100644 --- a/docs/developers/operations-api/advanced-json-sql-examples.md +++ b/docs/developers/operations-api/advanced-json-sql-examples.md @@ -90,7 +90,7 @@ Inserts data from a hosted CSV file into the "movie" table using the 'csv_url_lo "operation": "csv_url_load", "database": "movies", "table": "movie", - "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/movie.csv" + "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/movie.csv" } ``` @@ -98,7 +98,7 @@ Inserts data from a hosted CSV file into the "movie" table using the 'csv_url_lo ```json { - "message": "Starting job with id 1889eee4-23c1-4945-9bb7-c805fc20726c" + "message": "Starting job with id 1889eee4-23c1-4945-9bb7-c805fc20726c" } ``` @@ -112,10 +112,10 @@ Inserts data from a hosted CSV file into the "credits" table using the 'csv_url_ ```json { - "operation": "csv_url_load", - "database": "movies", - "table": "credits", - "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/credits.csv" + "operation": "csv_url_load", + "database": "movies", + "table": "credits", + "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/credits.csv" } ``` diff --git a/docs/developers/operations-api/analytics.md b/docs/developers/operations-api/analytics.md index d3880f0c..2057d1b9 100644 --- a/docs/developers/operations-api/analytics.md +++ b/docs/developers/operations-api/analytics.md @@ -5,31 +5,32 @@ title: Analytics Operations # Analytics Operations ## get_analytics + Retrieves analytics data from the server. -* operation _(required)_ - must always be `get_analytics` -* metric _(required)_ - any value returned by `list_metrics` -* start_time _(optional)_ - Unix timestamp in seconds -* end_time _(optional)_ - Unix timestamp in seconds -* get_attributes _(optional)_ - array of attribute names to retrieve -* conditions _(optional)_ - array of conditions to filter results (see [search_by_conditions docs](developers/operations-api/nosql-operations) for details) +- operation _(required)_ - must always be `get_analytics` +- metric _(required)_ - any value returned by `list_metrics` +- start*time *(optional)\_ - Unix timestamp in seconds +- end*time *(optional)\_ - Unix timestamp in seconds +- get*attributes *(optional)\_ - array of attribute names to retrieve +- conditions _(optional)_ - array of conditions to filter results (see [search_by_conditions docs](developers/operations-api/nosql-operations) for details) ### Body ```json { - "operation": "get_analytics", - "metric": "resource-usage", - "start_time": 1609459200, - "end_time": 1609545600, - "get_attributes": ["id", "metric", "userCPUTime", "systemCPUTime"], - "conditions": [ - { - "attribute": "node", - "operator": "equals", - "value": "node1.example.com" - } - ] + "operation": "get_analytics", + "metric": "resource-usage", + "start_time": 1609459200, + "end_time": 1609545600, + "get_attributes": ["id", "metric", "userCPUTime", "systemCPUTime"], + "conditions": [ + { + "attribute": "node", + "operator": "equals", + "value": "node1.example.com" + } + ] } ``` @@ -37,61 +38,56 @@ Retrieves analytics data from the server. ```json [ - { - "id": "12345", - "metric": "resource-usage", - "userCPUTime": 100, - "systemCPUTime": 50 - }, - { - "id": "67890", - "metric": "resource-usage", - "userCPUTime": 150, - "systemCPUTime": 75 - } + { + "id": "12345", + "metric": "resource-usage", + "userCPUTime": 100, + "systemCPUTime": 50 + }, + { + "id": "67890", + "metric": "resource-usage", + "userCPUTime": 150, + "systemCPUTime": 75 + } ] ``` ## list_metrics + Returns a list of available metrics that can be queried. -* operation _(required)_ - must always be `list_metrics` -* metric_types _(optional)_ - array of metric types to filter results; one or both of `custom` and `builtin`; default is `builtin` +- operation _(required)_ - must always be `list_metrics` +- metric*types *(optional)\_ - array of metric types to filter results; one or both of `custom` and `builtin`; default is `builtin` ### Body ```json { - "operation": "list_metrics", - "metric_types": ["custom", "builtin"] + "operation": "list_metrics", + "metric_types": ["custom", "builtin"] } ``` ### Response 200 ```json -[ - "resource-usage", - "table-size", - "database-size", - "main-thread-utilization", - "utilization", - "storage-volume" -] +["resource-usage", "table-size", "database-size", "main-thread-utilization", "utilization", "storage-volume"] ``` ## describe_metric + Provides detailed information about a specific metric, including its structure and available parameters. -* operation _(required)_ - must always be `describe_metric` -* metric _(required)_ - name of the metric to describe +- operation _(required)_ - must always be `describe_metric` +- metric _(required)_ - name of the metric to describe ### Body ```json { - "operation": "describe_metric", - "metric": "resource-usage" + "operation": "describe_metric", + "metric": "resource-usage" } ``` @@ -99,27 +95,27 @@ Provides detailed information about a specific metric, including its structure a ```json { - "attributes": [ - { - "name": "id", - "type": "number" - }, - { - "name": "metric", - "type": "string" - }, - { - "name": "userCPUTime", - "type": "number" - }, - { - "name": "systemCPUTime", - "type": "number" - }, - { - "name": "node", - "type": "string" - } - ] + "attributes": [ + { + "name": "id", + "type": "number" + }, + { + "name": "metric", + "type": "string" + }, + { + "name": "userCPUTime", + "type": "number" + }, + { + "name": "systemCPUTime", + "type": "number" + }, + { + "name": "node", + "type": "string" + } + ] } ``` diff --git a/docs/developers/operations-api/bulk-operations.md b/docs/developers/operations-api/bulk-operations.md index 95a962f6..2e7d7f45 100644 --- a/docs/developers/operations-api/bulk-operations.md +++ b/docs/developers/operations-api/bulk-operations.md @@ -56,7 +56,7 @@ Ingests CSV data, provided directly in the operation as an `insert`, `update` or "database": "dev", "action": "insert", "table": "breed", - "data": "id,name,section,country,image\n1,ENGLISH POINTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/001g07.jpg\n2,ENGLISH SETTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/002g07.jpg\n3,KERRY BLUE TERRIER,Large and medium sized Terriers,IRELAND,\n" + "data": "id,name,section,country,image\n1,ENGLISH POINTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/001g07.jpg\n2,ENGLISH SETTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/002g07.jpg\n3,KERRY BLUE TERRIER,Large and medium sized Terriers,IRELAND,\n" } ``` @@ -124,7 +124,7 @@ Ingests CSV data, provided via URL, as an `insert`, `update` or `upsert` into th "action": "insert", "database": "dev", "table": "breed", - "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" + "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" } ``` diff --git a/docs/developers/operations-api/clustering.md b/docs/developers/operations-api/clustering.md index 8a03b47e..4a19cbf2 100644 --- a/docs/developers/operations-api/clustering.md +++ b/docs/developers/operations-api/clustering.md @@ -16,7 +16,7 @@ _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `add_node` - hostname or url _(required)_ - one of these fields is required. You must provide either the `hostname` or the `url` of the node you want to add -- verify_tls _(optional)_ - a boolean which determines if the TLS certificate should be verified. This will allow the Harper default self-signed certificates to be accepted. Defaults to `true` +- verify*tls *(optional)\_ - a boolean which determines if the TLS certificate should be verified. This will allow the Harper default self-signed certificates to be accepted. Defaults to `true` - authorization _(optional)_ - an object or a string which contains the authorization information for the node being added. If it is an object, it should contain `username` and `password` fields. If it is a string, it should use HTTP `Authorization` style credentials - retain*authorization *(optional)\_ - a boolean which determines if the authorization credentials should be retained/stored and used everytime a connection is made to this node. If `true`, the authorization will be stored on the node record. Generally this should not be used, as mTLS/certificate based authorization is much more secure and safe, and avoids the need for storing credentials. Defaults to `false`. - revoked*certificates *(optional)\_ - an array of revoked certificates serial numbers. If a certificate is revoked, it will not be accepted for any connections. @@ -260,12 +260,12 @@ _Operation is restricted to super_user roles only_ { "operation": "cluster_set_routes", "routes": [ - "wss://server-two:9925", - { - "hostname": "server-three", - "port": 9930 - } - ] + "wss://server-two:9925", + { + "hostname": "server-three", + "port": 9930 + } + ] } ``` @@ -273,15 +273,15 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "cluster routes successfully set", - "set": [ - "wss://server-two:9925", - { - "hostname": "server-three", - "port": 9930 - } - ], - "skipped": [] + "message": "cluster routes successfully set", + "set": [ + "wss://server-two:9925", + { + "hostname": "server-three", + "port": 9930 + } + ], + "skipped": [] } ``` @@ -299,7 +299,7 @@ _Operation is restricted to super_user roles only_ ```json { - "operation": "cluster_get_routes" + "operation": "cluster_get_routes" } ``` @@ -307,7 +307,7 @@ _Operation is restricted to super_user roles only_ ```json [ - "wss://server-two:9925", + "wss://server-two:9925", { "hostname": "server-three", "port": 9930 diff --git a/docs/developers/operations-api/components.md b/docs/developers/operations-api/components.md index 679a5c50..6801a941 100644 --- a/docs/developers/operations-api/components.md +++ b/docs/developers/operations-api/components.md @@ -81,7 +81,7 @@ _Operation is restricted to super_user roles only_ - payload _(optional)_ - a base64-encoded string representation of the .tar file. Must be a string - restart _(optional)_ - must be either a boolean or the string `rolling`. If set to `rolling`, a rolling restart will be triggered after the component is deployed, meaning that each node in the cluster will be sequentially restarted (waiting for the last restart to start the next). If set to `true`, the restart will not be rolling, all nodes will be restarted in parallel. If `replicated` is `true`, the restart operations will be replicated across the cluster. - replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. -- install_command _(optional)_ - A command to use when installing the component. Must be a string. This can be used to install dependencies with pnpm or yarn, for example, like: `"install_command": "npm install -g pnpm && pnpm install"` +- install*command *(optional)\_ - A command to use when installing the component. Must be a string. This can be used to install dependencies with pnpm or yarn, for example, like: `"install_command": "npm install -g pnpm && pnpm install"` ### Body @@ -120,7 +120,7 @@ _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `package_component` - project _(required)_ - the name of the project you wish to package -- skip_node_modules _(optional)_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean +- skip*node_modules *(optional)\_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean ### Body @@ -334,7 +334,7 @@ _Operation is restricted to super_user roles only_ - key _(required)_ - the private key contents. Must be an ed25519 key. Line breaks must be delimited with `\n` and have a trailing `\n` - host _(required)_ - the host for the ssh config (see below). Used as part of the `package` url when deploying a component using this key. - hostname _(required)_ - the hostname for the ssh config (see below). Used to map `host` to an actual domain (e.g. `github.com`) -- known_hosts _(optional)_ - the public SSH keys of the host your component will be retrieved from. If `hostname` is `github.com` this will be retrieved automatically. Line breaks must be delimited with `\n` +- known*hosts *(optional)\_ - the public SSH keys of the host your component will be retrieved from. If `hostname` is `github.com` this will be retrieved automatically. Line breaks must be delimited with `\n` - replicated _(optional)_ - if true, HarperDB will replicate the key to all nodes in the cluster. Must be a boolean. ### Body @@ -389,7 +389,7 @@ _Operation is restricted to super_user roles only_ - key _(required)_ - the private key contents. Must be an ed25519 key. Line breaks must be delimited with `\n` and have a trailing `\n` - host _(required)_ - the host for the ssh config (see below). Used as part of the `package` url when deploying a component using this key. - hostname _(required)_ - the hostname for the ssh config (see below). Used to map `host` to an actual domain (e.g. `github.com`) -- known_hosts _(optional)_ - the public SSH keys of the host your component will be retrieved from. If `hostname` is `github.com` this will be retrieved automatically. Line breaks must be delimited with `\n` +- known*hosts *(optional)\_ - the public SSH keys of the host your component will be retrieved from. If `hostname` is `github.com` this will be retrieved automatically. Line breaks must be delimited with `\n` - replicated _(optional)_ - if true, HarperDB will replicate the key to all nodes in the cluster. Must be a boolean. ### Body @@ -476,7 +476,7 @@ Sets the SSH known_hosts file. This will overwrite the file. _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `set_ssh_known_hosts` -- known_hosts _(required)_ - The contents to set the known_hosts to. Line breaks must be delimite d with +- known*hosts *(required)\_ - The contents to set the known_hosts to. Line breaks must be delimite d with - replicated _(optional)_ - if true, Harper will replicate the known hosts to all nodes in the cluster. Must be a boolean. ### Body diff --git a/docs/developers/operations-api/configuration.md b/docs/developers/operations-api/configuration.md index 98686029..99599843 100644 --- a/docs/developers/operations-api/configuration.md +++ b/docs/developers/operations-api/configuration.md @@ -77,7 +77,7 @@ _Operation is restricted to super_user roles only_ "hostname": "node1", "databases": "*", "routes": null, - "url": "wss://127.0.0.1:9925" + "url": "wss://127.0.0.1:9925" }, "componentsRoot": "/Users/hdb/components", "localStudio": { diff --git a/docs/developers/operations-api/index.md b/docs/developers/operations-api/index.md index abaa360d..913ae8c7 100644 --- a/docs/developers/operations-api/index.md +++ b/docs/developers/operations-api/index.md @@ -19,24 +19,24 @@ Content-Type: application/json The operations API reference is available below and categorized by topic: -* [Quick Start Examples](quickstart-examples) -* [Databases and Tables](databases-and-tables) -* [NoSQL Operations](nosql-operations) -* [Bulk Operations](bulk-operations) -* [Users and Roles](users-and-roles) -* [Clustering](clustering) -* [Clustering with NATS](clustering-nats) -* [Components](components) -* [Registration](registration) -* [Jobs](jobs) -* [Logs](logs) -* [System Operations](system-operations) -* [Configuration](configuration) -* [Certificate Management](certificate-management) -* [Token Authentication](token-authentication) -* [SQL Operations](sql-operations) -* [Advanced JSON SQL Examples](advanced-json-sql-examples) -* [Analytics](analytics) +- [Quick Start Examples](quickstart-examples) +- [Databases and Tables](databases-and-tables) +- [NoSQL Operations](nosql-operations) +- [Bulk Operations](bulk-operations) +- [Users and Roles](users-and-roles) +- [Clustering](clustering) +- [Clustering with NATS](clustering-nats) +- [Components](components) +- [Registration](registration) +- [Jobs](jobs) +- [Logs](logs) +- [System Operations](system-operations) +- [Configuration](configuration) +- [Certificate Management](certificate-management) +- [Token Authentication](token-authentication) +- [SQL Operations](sql-operations) +- [Advanced JSON SQL Examples](advanced-json-sql-examples) +- [Analytics](analytics) • [Past Release API Documentation](https://olddocs.harperdb.io) diff --git a/docs/developers/operations-api/logs.md b/docs/developers/operations-api/logs.md index 4efeb27f..8fb1bb8e 100644 --- a/docs/developers/operations-api/logs.md +++ b/docs/developers/operations-api/logs.md @@ -306,8 +306,8 @@ _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `read_audit_log` - schema _(required)_ - schema under which the transaction log resides - table _(required)_ - table under which the transaction log resides -- search_type _(optional)_ - possibilities are `hash_value`, `timestamp` and `username` -- search_values _(optional)_ - an array of string or numbers relating to search_type +- search*type *(optional)\_ - possibilities are `hash_value`, `timestamp` and `username` +- search*values *(optional)\_ - an array of string or numbers relating to search_type ### Body @@ -401,8 +401,8 @@ _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `read_audit_log` - schema _(required)_ - schema under which the transaction log resides - table _(required)_ - table under which the transaction log resides -- search_type _(optional)_ - timestamp -- search_values _(optional)_ - an array containing a maximum of two values \[`from_timestamp`, `to_timestamp`] defining the range of transactions you would like to view. +- search*type *(optional)\_ - timestamp +- search*values *(optional)\_ - an array containing a maximum of two values \[`from_timestamp`, `to_timestamp`] defining the range of transactions you would like to view. - Timestamp format is millisecond-based epoch in UTC - If no items are supplied then all transactions are returned - If only one entry is supplied then all transactions after the supplied timestamp will be returned @@ -522,8 +522,8 @@ _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `read_audit_log` - schema _(required)_ - schema under which the transaction log resides - table _(required)_ - table under which the transaction log resides -- search_type _(optional)_ - username -- search_values _(optional)_ - the Harper user for whom you would like to view transactions +- search*type *(optional)\_ - username +- search*values *(optional)\_ - the Harper user for whom you would like to view transactions ### Body @@ -642,8 +642,8 @@ _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `read_audit_log` - schema _(required)_ - schema under which the transaction log resides - table _(required)_ - table under which the transaction log resides -- search_type _(optional)_ - hash_value -- search_values _(optional)_ - an array of hash_attributes for which you wish to see transaction logs +- search*type *(optional)\_ - hash_value +- search*values *(optional)\_ - an array of hash_attributes for which you wish to see transaction logs ### Body diff --git a/docs/developers/operations-api/quickstart-examples.md b/docs/developers/operations-api/quickstart-examples.md index 93660289..a6c8f637 100644 --- a/docs/developers/operations-api/quickstart-examples.md +++ b/docs/developers/operations-api/quickstart-examples.md @@ -240,9 +240,9 @@ Each header in a column will be considered as an attribute, and each row in the ```json { - "operation": "csv_url_load", - "table": "breed", - "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" + "operation": "csv_url_load", + "table": "breed", + "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" } ``` diff --git a/docs/developers/operations-api/registration.md b/docs/developers/operations-api/registration.md index cd7bc61f..0b941400 100644 --- a/docs/developers/operations-api/registration.md +++ b/docs/developers/operations-api/registration.md @@ -35,6 +35,7 @@ Returns the registration data of the Harper instance. Install a Harper license for a block of usage. Multiple usage blocks may be installed, and they will be used up sequentially, with the earliest installed blocks used first. A license is installed by creating a string that consists of three base64url encoded blocks, separated by dots. The three blocks consist of: + - `header`: This is a JSON object with two properties: - `typ`: should be "Harper-License" - `alg`: should be "EdDSA" @@ -58,6 +59,7 @@ This JSON object should be converted to base64url (conversion from utf-8 to base This JSON object should be converted to base64url (conversion from utf-8 to base64url) and is the second base64url block. For example: + ```json { "id": "license-717b-4c6c-b69d-b29014054ab7", @@ -87,7 +89,7 @@ The three base64url blocks are combined to form the `license` property value in ```json { "operation": "install_usage_license", - "license": "abc...0123.abc...0123.abc...0123", + "license": "abc...0123.abc...0123.abc...0123" } ``` @@ -187,7 +189,6 @@ This will retrieve and return all active usage licenses, with counts of how much --- - ## Get Fingerprint (Deprecated) diff --git a/docs/developers/rest.md b/docs/developers/rest.md index 76a118d7..a7e17500 100644 --- a/docs/developers/rest.md +++ b/docs/developers/rest.md @@ -81,13 +81,13 @@ Generally the POST method can be used for custom actions since POST has the broa This is handled by the Resource method `post(data)`, which is a good method to extend to make various other types of modifications. Also, with a table you can create a new record without specifying a primary key, for example: -````http +`````http ````http POST /MyTable/ Content-Type: application/json `{ "name": "some data" }` -```` +````` This will create a new record, auto-assigning a primary key, which will be returned in the `Location` header. @@ -402,3 +402,4 @@ Content-Type: image/gif ...image data... ``` +```` diff --git a/docs/developers/security/basic-auth.md b/docs/developers/security/basic-auth.md index 5a04f8ef..96d5d28a 100644 --- a/docs/developers/security/basic-auth.md +++ b/docs/developers/security/basic-auth.md @@ -6,7 +6,7 @@ title: Basic Authentication Harper uses Basic Auth and JSON Web Tokens (JWTs) to secure our HTTP requests. In the context of an HTTP transaction, **basic access authentication** is a method for an HTTP user agent to provide a username and password when making a request. -** _**You do not need to log in separately. Basic Auth is added to each HTTP request like create_database, create_table, insert etc… via headers.**_ ** +** \_**You do not need to log in separately. Basic Auth is added to each HTTP request like create*database, create_table, insert etc… via headers.\*\** \*\* A header is added to each HTTP request. The header key is **“Authorization”** the header value is **“Basic <<your username and password buffer token>>”** diff --git a/docs/developers/sql-guide/json-search.md b/docs/developers/sql-guide/json-search.md index 13bd3b90..507473f3 100644 --- a/docs/developers/sql-guide/json-search.md +++ b/docs/developers/sql-guide/json-search.md @@ -12,7 +12,7 @@ Harper automatically indexes all top level attributes in a row / object written ## Syntax -SEARCH_JSON(_expression, attribute_) +SEARCH*JSON(\_expression, attribute*) Executes the supplied string _expression_ against data of the defined top level _attribute_ for each row. The expression both filters and defines output from the JSON document. diff --git a/docs/technical-details/_category_.json b/docs/technical-details/_category_.json index 69ce80a6..b965ef06 100644 --- a/docs/technical-details/_category_.json +++ b/docs/technical-details/_category_.json @@ -1,12 +1,10 @@ { - "label": "Technical Details", - "position": 4, - "link": { - "type": "generated-index", - "title": "Technical Details Documentation", - "description": "Reference documentation and technical specifications", - "keywords": [ - "technical-details" - ] - } -} \ No newline at end of file + "label": "Technical Details", + "position": 4, + "link": { + "type": "generated-index", + "title": "Technical Details Documentation", + "description": "Reference documentation and technical specifications", + "keywords": ["technical-details"] + } +} diff --git a/docs/technical-details/reference/components/applications.md b/docs/technical-details/reference/components/applications.md index 31daf0e1..0f8a659e 100644 --- a/docs/technical-details/reference/components/applications.md +++ b/docs/technical-details/reference/components/applications.md @@ -166,7 +166,7 @@ Harper will generate a `package.json` like: "myNPMComponent": "npm:harperdb", "myTarBall": "file:/Users/harper/cool-component.tar", "myLocal": "file:/Users/harper/local", - "myWebsite": "https://harperdb-component" + "myWebsite": "https://harperdb-component" } } ``` diff --git a/docs/technical-details/reference/resources/index.md b/docs/technical-details/reference/resources/index.md index 59a5fef3..4c54e76f 100644 --- a/docs/technical-details/reference/resources/index.md +++ b/docs/technical-details/reference/resources/index.md @@ -420,11 +420,11 @@ This will return the number of records in the table. By default, this will retur This is called by static methods when they are responding to a URL (from HTTP request, for example), and translates the path to an id. By default, this will parse `.property` suffixes for accessing properties and specifying preferred content type in the URL (and for older tables it will convert a multi-segment path to multipart an array id). However, in some situations you may wish to preserve the path directly as a string. You can override `parsePath` for simpler path to id preservation: -````javascript +```javascript static parsePath(path) { return path; // return the path as the id } -```` +``` ### `getRecordCount: Promise<{}>` diff --git a/docs/technical-details/release-notes/v4-tucker/4.5.11.md b/docs/technical-details/release-notes/v4-tucker/4.5.11.md index cba2d019..d3f9d8fa 100644 --- a/docs/technical-details/release-notes/v4-tucker/4.5.11.md +++ b/docs/technical-details/release-notes/v4-tucker/4.5.11.md @@ -4,7 +4,8 @@ sidebar_position: 59488 --- ### HarperDB 4.5.11 + 6/27/2025 -* Fix bug (workaround Node.js bug) with assigning the ciphers to a server and applying to TLS connections -* Fix for handling TLS array when checking certificates configuration \ No newline at end of file +- Fix bug (workaround Node.js bug) with assigning the ciphers to a server and applying to TLS connections +- Fix for handling TLS array when checking certificates configuration diff --git a/docs/technical-details/release-notes/v4-tucker/4.5.12.md b/docs/technical-details/release-notes/v4-tucker/4.5.12.md index 6353bfc2..2312329e 100644 --- a/docs/technical-details/release-notes/v4-tucker/4.5.12.md +++ b/docs/technical-details/release-notes/v4-tucker/4.5.12.md @@ -4,10 +4,11 @@ sidebar_position: 59487 --- ### HarperDB 4.5.12 + 7/9/2025 - Fix for dynamically setting `harperdb` package symlink on deploy - Assign shard numbers from each node's config rather than from routes - Handle certificates without a common name, falling back to the SANs -- Properly clean up blobs that are only transiently used for replication +- Properly clean up blobs that are only transiently used for replication - Ensure that we always set up server.shards even when there are no TLS connections diff --git a/docs/technical-details/release-notes/v4-tucker/4.5.13.md b/docs/technical-details/release-notes/v4-tucker/4.5.13.md index 2b8a6149..d4ef7ac7 100644 --- a/docs/technical-details/release-notes/v4-tucker/4.5.13.md +++ b/docs/technical-details/release-notes/v4-tucker/4.5.13.md @@ -4,6 +4,7 @@ sidebar_position: 59486 --- ### HarperDB 4.5.13 + 7/12/2025 - Fix cleaning out audit entries when a blob has been removed diff --git a/docs/technical-details/release-notes/v4-tucker/4.5.14.md b/docs/technical-details/release-notes/v4-tucker/4.5.14.md index 0ad8f235..d50482a6 100644 --- a/docs/technical-details/release-notes/v4-tucker/4.5.14.md +++ b/docs/technical-details/release-notes/v4-tucker/4.5.14.md @@ -4,6 +4,7 @@ sidebar_position: 59485 --- ### HarperDB 4.5.14 + 7/15/2025 - Use proper back-pressure when copying a table for initial database sync diff --git a/docs/technical-details/release-notes/v4-tucker/4.5.15.md b/docs/technical-details/release-notes/v4-tucker/4.5.15.md index 4595878d..d2158571 100644 --- a/docs/technical-details/release-notes/v4-tucker/4.5.15.md +++ b/docs/technical-details/release-notes/v4-tucker/4.5.15.md @@ -1,4 +1,5 @@ ### HarperDB 4.5.15 + 7/21/2025 - Removed the `copyTablesToCatchUp` option and instead utilized the clone node designation of the leader node to copy tables diff --git a/docs/technical-details/release-notes/v4-tucker/4.5.16.md b/docs/technical-details/release-notes/v4-tucker/4.5.16.md index d2401c85..d9b80237 100644 --- a/docs/technical-details/release-notes/v4-tucker/4.5.16.md +++ b/docs/technical-details/release-notes/v4-tucker/4.5.16.md @@ -1,4 +1,5 @@ ### HarperDB 4.5.16 + 7/30/2025 -- Do not free/remove the shared user buffer that is used by all threads as an atomic counter for ids (for blobs and incremented ids), but retain it as a stable allocated buffer +- Do not free/remove the shared user buffer that is used by all threads as an atomic counter for ids (for blobs and incremented ids), but retain it as a stable allocated buffer diff --git a/docs/technical-details/release-notes/v4-tucker/4.6.0.md b/docs/technical-details/release-notes/v4-tucker/4.6.0.md index e31c1ad6..f1416c54 100644 --- a/docs/technical-details/release-notes/v4-tucker/4.6.0.md +++ b/docs/technical-details/release-notes/v4-tucker/4.6.0.md @@ -20,12 +20,12 @@ Harper 4.6 now includes support for vector indexing, which allows for efficient ### Logging Improvements 4.6 includes significant expansions to logging configurability, allowing for specific logging configurations of individual components. This also leverages the new extension API to allow for dynamic reloading of logging configuration. With the more granular logging, logs can be directed to different files and/or different log levels. -The logger includes support for HTTP logging, which configurability for logging standard HTTP methods and paths as well headers, ids, and timing information. It also supports distinct logging configuration for different components. +The logger includes support for HTTP logging, which configurability for logging standard HTTP methods and paths as well headers, ids, and timing information. It also supports distinct logging configuration for different components. The new logger is now based on the Node.js Console API, with improved the formatting of log messages for various types of objects. An important change is that logging to standard out/error will _not_ include the timestamp. And console logging does not get logged to the log files by default. - ### Data Loader + 4.6 includes a new [data loader](../../../developers/applications/data-loader) that can be used to load data into HarperDB as part of a component. The data loader can be used to load data from JSON file and can be deployed and distributed with a component to provide a reliable mechanism for ensuring specific records are loaded into Harper. ### Resource API Upgrades @@ -33,4 +33,5 @@ An important change is that logging to standard out/error will _not_ include the 4.6 includes an upgraded form of the Resource API that can be selected with significant improvements in ease of use. ### only-if-cached behavior -Previously when the `only-in-cached` caching directive was used and the entry was not cached, Harper would return a 504, but still make a request to origin in the background. Now, Harper will no longer a request to origin for `only-if-cached`. \ No newline at end of file + +Previously when the `only-in-cached` caching directive was used and the entry was not cached, Harper would return a 504, but still make a request to origin in the background. Now, Harper will no longer a request to origin for `only-if-cached`. diff --git a/docs/technical-details/release-notes/v4-tucker/4.6.1.md b/docs/technical-details/release-notes/v4-tucker/4.6.1.md index cf8ccd2c..c073d5a2 100644 --- a/docs/technical-details/release-notes/v4-tucker/4.6.1.md +++ b/docs/technical-details/release-notes/v4-tucker/4.6.1.md @@ -4,6 +4,7 @@ sidebar_position: 59398 --- # 4.6.1 + 7/10/2025 - Plugin API updates to use plugin nomenclature diff --git a/docs/technical-details/release-notes/v4-tucker/4.6.2.md b/docs/technical-details/release-notes/v4-tucker/4.6.2.md index 579f26df..147dad18 100644 --- a/docs/technical-details/release-notes/v4-tucker/4.6.2.md +++ b/docs/technical-details/release-notes/v4-tucker/4.6.2.md @@ -4,8 +4,9 @@ sidebar_position: 59397 --- # 4.6.2 + 7/15/2025 - Use proper back-pressure when copying a table for initial database sync - Fix cleaning out audit entries when a blob has been removed -- Fix for running CLI operations when a Harper DB is not installed \ No newline at end of file +- Fix for running CLI operations when a Harper DB is not installed diff --git a/docs/technical-details/release-notes/v4-tucker/4.6.3.md b/docs/technical-details/release-notes/v4-tucker/4.6.3.md index 5a1a837a..09b31eb0 100644 --- a/docs/technical-details/release-notes/v4-tucker/4.6.3.md +++ b/docs/technical-details/release-notes/v4-tucker/4.6.3.md @@ -1,4 +1,5 @@ # 4.6.3 + 7/30/2025 - Fix for calling table.operation() diff --git a/package.json b/package.json index 14a5efff..54d93152 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@harperdb/documentation", "private": true, "scripts": { - "format": "prettier --write 'docs/**/*' package.json", + "format": "prettier --write .", "site:install": "cd site && npm install", "site:dev": "cd site && npm run start", "site:build": "cd site && npm run build", diff --git a/site/README.md b/site/README.md index fc06acbb..832f3cd0 100644 --- a/site/README.md +++ b/site/README.md @@ -79,6 +79,7 @@ npm run version ``` After cutting a version: + 1. The current `/docs` becomes the new "next" version 2. The previous latest version is archived 3. Update `docusaurus.config.ts` to set the new `lastVersion` @@ -106,4 +107,4 @@ npm run clear ## 🚢 Deployment -The site builds to static HTML/CSS/JS files that can be deployed to any static hosting service. The production build is in the `build/` directory after running `npm run build`. \ No newline at end of file +The site builds to static HTML/CSS/JS files that can be deployed to any static hosting service. The production build is in the `build/` directory after running `npm run build`. diff --git a/site/package-lock.json b/site/package-lock.json index 5ebcdfd6..e76f51cd 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -1,19104 +1,19104 @@ { - "name": "site", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "site", - "version": "0.0.0", - "dependencies": { - "@docusaurus/core": "^3.8.1", - "@docusaurus/plugin-client-redirects": "^3.8.1", - "@docusaurus/preset-classic": "^3.8.1", - "@docusaurus/remark-plugin-npm2yarn": "^3.8.1", - "@docusaurus/theme-mermaid": "^3.8.1", - "@easyops-cn/docusaurus-search-local": "^0.52.1", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "prism-react-renderer": "^2.3.0", - "react": "^19.1.1", - "react-dom": "^19.1.1" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "^3.8.1", - "@docusaurus/tsconfig": "^3.8.1", - "@docusaurus/types": "^3.8.1", - "typescript": "^5.9.2" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", - "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.17.9", - "@algolia/autocomplete-shared": "1.17.9" - } - }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz", - "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.9" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz", - "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.9" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", - "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", - "license": "MIT", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/client-abtesting": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.30.0.tgz", - "integrity": "sha512-Q3OQXYlTNqVUN/V1qXX8VIzQbLjP3yrRBO9m6NRe1CBALmoGHh9JrYosEGvfior28+DjqqU3Q+nzCSuf/bX0Gw==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.30.0.tgz", - "integrity": "sha512-/b+SAfHjYjx/ZVeVReCKTTnFAiZWOyvYLrkYpeNMraMT6akYRR8eC1AvFcvR60GLG/jytxcJAp42G8nN5SdcLg==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.30.0.tgz", - "integrity": "sha512-tbUgvkp2d20mHPbM0+NPbLg6SzkUh0lADUUjzNCF+HiPkjFRaIW3NGMlESKw5ia4Oz6ZvFzyREquUX6rdkdJcQ==", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-insights": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.30.0.tgz", - "integrity": "sha512-caXuZqJK761m32KoEAEkjkE2WF/zYg1McuGesWXiLSgfxwZZIAf+DljpiSToBUXhoPesvjcLtINyYUzbkwE0iw==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.30.0.tgz", - "integrity": "sha512-7K6P7TRBHLX1zTmwKDrIeBSgUidmbj6u3UW/AfroLRDGf9oZFytPKU49wg28lz/yulPuHY0nZqiwbyAxq9V17w==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-query-suggestions": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.30.0.tgz", - "integrity": "sha512-WMjWuBjYxJheRt7Ec5BFr33k3cV0mq2WzmH9aBf5W4TT8kUp34x91VRsYVaWOBRlxIXI8o/WbhleqSngiuqjLA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.30.0.tgz", - "integrity": "sha512-puc1/LREfSqzgmrOFMY5L/aWmhYOlJ0TTpa245C0ZNMKEkdOkcimFbXTXQ8lZhzh+rlyFgR7cQGNtXJ5H0XgZg==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", - "license": "MIT" - }, - "node_modules/@algolia/ingestion": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.30.0.tgz", - "integrity": "sha512-NfqiIKVgGKTLr6T9F81oqB39pPiEtILTy0z8ujxPKg2rCvI/qQeDqDWFBmQPElCfUTU6kk67QAgMkQ7T6fE+gg==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/monitoring": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.30.0.tgz", - "integrity": "sha512-/eeM3aqLKro5KBZw0W30iIA6afkGa+bcpvEM0NDa92m5t3vil4LOmJI9FkgzfmSkF4368z/SZMOTPShYcaVXjA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/recommend": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.30.0.tgz", - "integrity": "sha512-iWeAUWqw+xT+2IyUyTqnHCK+cyCKYV5+B6PXKdagc9GJJn6IaPs8vovwoC0Za5vKCje/aXQ24a2Z1pKpc/tdHg==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.30.0.tgz", - "integrity": "sha512-alo3ly0tdNLjfMSPz9dmNwYUFHx7guaz5dTGlIzVGnOiwLgIoM6NgA+MJLMcH6e1S7OpmE2AxOy78svlhst2tQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.30.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-fetch": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.30.0.tgz", - "integrity": "sha512-WOnTYUIY2InllHBy6HHMpGIOo7Or4xhYUx/jkoSK/kPIa1BRoFEHqa8v4pbKHtoG7oLvM2UAsylSnjVpIhGZXg==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.30.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-node-http": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.30.0.tgz", - "integrity": "sha512-uSTUh9fxeHde1c7KhvZKUrivk90sdiDftC+rSKNFKKEU9TiIKAGA7B2oKC+AoMCqMymot1vW9SGbeESQPTZd0w==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.30.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@antfu/install-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", - "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", - "license": "MIT", - "dependencies": { - "package-manager-detector": "^1.3.0", - "tinyexec": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@antfu/utils": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", - "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.7.tgz", - "integrity": "sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", - "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.27.7", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", - "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", - "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", - "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.7.tgz", - "integrity": "sha512-CuLkokN1PEZ0Fsjtq+001aog/C2drDK9nTfK/NRK0n6rBin6cBrvM+zfQjDE+UllhR6/J4a6w8Xq9i4yi3mQrw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.7", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.7.tgz", - "integrity": "sha512-pg3ZLdIKWCP0CrJm0O4jYjVthyBeioVfvz9nwt6o5paUxsgJ/8GucSMAIaj6M7xA4WY+SrvtGu2LijzkdyecWQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.7.tgz", - "integrity": "sha512-201B1kFTWhckclcXpWHc8uUpYziDX/Pl4rxl0ZX0DiCZ3jknwfSUALL3QCYeeXXB37yWxJbo+g+Vfq8pAaHi3w==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.7", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.27.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", - "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", - "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", - "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", - "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.4.tgz", - "integrity": "sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", - "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", - "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.27.1", - "@babel/plugin-transform-async-to-generator": "^7.27.1", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.27.1", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.27.1", - "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", - "@babel/plugin-transform-dotall-regex": "^7.27.1", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.27.2", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.27.1", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", - "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.27.1", - "@babel/plugin-transform-react-jsx": "^7.27.1", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", - "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.6.tgz", - "integrity": "sha512-vDVrlmRAY8z9Ul/HxT+8ceAru95LQgkSKiXkSYZvqtbkPSfhZJgpRp45Cldbh1GJ1kxzQkI70AqyrTI58KpaWQ==", - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.30.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", - "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/parser": "^7.27.7", - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz", - "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", - "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", - "license": "MIT" - }, - "node_modules/@chevrotain/cst-dts-gen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", - "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/gast": "11.0.3", - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/gast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", - "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/regexp-to-ast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", - "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/types": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", - "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/utils": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", - "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", - "license": "Apache-2.0" - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@csstools/cascade-layer-name-parser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", - "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", - "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", - "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.0.2", - "@csstools/css-calc": "^2.1.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/media-query-list-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", - "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", - "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.10.tgz", - "integrity": "sha512-4dY0NBu7NVIpzxZRgh/Q/0GPSz/jLSw0i/u3LTUor0BkQcz/fNhN10mSWBDsL0p9nDb0Ky1PD6/dcGbhACuFTQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.0.10", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-function": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.10.tgz", - "integrity": "sha512-P0lIbQW9I4ShE7uBgZRib/lMTf9XMjJkFl/d6w4EMNHu2qvQ6zljJGEcBkw/NsBtq/6q3WrmgxSS8kHtPMkK4Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.0.10", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.0.tgz", - "integrity": "sha512-Z5WhouTyD74dPFPrVE7KydgNS9VvnjB8qcdes9ARpCOItb4jTnm7cHp4FhxCRUoyhabD0WVv43wbkJ4p8hLAlQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.0.10", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-content-alt-text": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.6.tgz", - "integrity": "sha512-eRjLbOjblXq+byyaedQRSrAejKGNAFued+LcbzT+LCL78fabxHkxYjBbxkroONxHHYu2qxhFK2dBStTLPG3jpQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-exponential-functions": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", - "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", - "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gamut-mapping": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.10.tgz", - "integrity": "sha512-QDGqhJlvFnDlaPAfCYPsnwVA6ze+8hhrwevYWlnUeSjkkZfBpcCO42SaUD8jiLlq7niouyLgvup5lh+f1qessg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.0.10", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.10.tgz", - "integrity": "sha512-HHPauB2k7Oits02tKFUeVFEU2ox/H3OQVrP3fSOKDxvloOikSal+3dzlyTZmYsb9FlY9p5EUpBtz0//XBmy+aw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.0.10", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.10.tgz", - "integrity": "sha512-nOKKfp14SWcdEQ++S9/4TgRKchooLZL0TUFdun3nI4KPwCjETmhjta1QT4ICQcGVWQTvrsgMM/aLB5We+kMHhQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.0.10", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.2.tgz", - "integrity": "sha512-lrK2jjyZwh7DbxaNnIUjkeDmU8Y6KyzRBk91ZkI5h8nb1ykEfZrtIVArdIjX4DHMIBGpdHrgP0n4qXDr7OHaKA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-initial": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", - "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", - "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-light-dark-function": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.9.tgz", - "integrity": "sha512-1tCZH5bla0EAkFAI2r0H33CDnIBeLUaJh1p+hvvsylJ4svsv2wOmJjJn+OXwUZLXef37GYbRIVKX+X+g6m+3CQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-float-and-clear": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", - "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-overflow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", - "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-overscroll-behavior": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", - "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-resize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", - "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", - "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-minmax": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", - "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", - "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", - "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", - "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.10.tgz", - "integrity": "sha512-ZzZUTDd0fgNdhv8UUjGCtObPD8LYxMH+MJsW9xlZaWTV8Ppr4PtxlHYNMmF4vVWGl0T6f8tyWAKjoI6vePSgAg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.0.10", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.1.0.tgz", - "integrity": "sha512-YrkI9dx8U4R8Sz2EJaoeD9fI7s7kmeEBfmO+UURNeL6lQI7VxF6sBE+rSqdCBn4onwqmxFdBU3lTwyYb/lCmxA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-random-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", - "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.10.tgz", - "integrity": "sha512-8+0kQbQGg9yYG8hv0dtEpOMLwB9M+P7PhacgIzVzJpixxV4Eq9AUQtQw8adMmAJU1RBBmIlpmtmm3XTRd/T00g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.0.10", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", - "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-sign-functions": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", - "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", - "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz", - "integrity": "sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/color-helpers": "^5.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", - "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", - "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/utilities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", - "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/css": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz", - "integrity": "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==", - "license": "MIT" - }, - "node_modules/@docsearch/react": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz", - "integrity": "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-core": "1.17.9", - "@algolia/autocomplete-preset-algolia": "1.17.9", - "@docsearch/css": "3.9.0", - "algoliasearch": "^5.14.2" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } - } - }, - "node_modules/@docusaurus/babel": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.8.1.tgz", - "integrity": "sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.25.9", - "@babel/preset-env": "^7.25.9", - "@babel/preset-react": "^7.25.9", - "@babel/preset-typescript": "^7.25.9", - "@babel/runtime": "^7.25.9", - "@babel/runtime-corejs3": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.8.1", - "@docusaurus/utils": "3.8.1", - "babel-plugin-dynamic-import-node": "^2.3.3", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/bundler": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.8.1.tgz", - "integrity": "sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.8.1", - "@docusaurus/cssnano-preset": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "babel-loader": "^9.2.1", - "clean-css": "^5.3.3", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.11.0", - "css-minimizer-webpack-plugin": "^5.0.1", - "cssnano": "^6.1.2", - "file-loader": "^6.2.0", - "html-minifier-terser": "^7.2.0", - "mini-css-extract-plugin": "^2.9.2", - "null-loader": "^4.0.1", - "postcss": "^8.5.4", - "postcss-loader": "^7.3.4", - "postcss-preset-env": "^10.2.1", - "terser-webpack-plugin": "^5.3.9", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "webpack": "^5.95.0", - "webpackbar": "^6.0.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/faster": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/faster": { - "optional": true - } - } - }, - "node_modules/@docusaurus/core": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.8.1.tgz", - "integrity": "sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA==", - "license": "MIT", - "dependencies": { - "@docusaurus/babel": "3.8.1", - "@docusaurus/bundler": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/mdx-loader": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "core-js": "^3.31.1", - "detect-port": "^1.5.1", - "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "execa": "5.1.1", - "fs-extra": "^11.1.1", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.6.0", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "open": "^8.4.0", - "p-map": "^4.0.0", - "prompts": "^2.4.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.4", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.6", - "tinypool": "^1.0.2", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "webpack": "^5.95.0", - "webpack-bundle-analyzer": "^4.10.2", - "webpack-dev-server": "^4.15.2", - "webpack-merge": "^6.0.1" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@mdx-js/react": "^3.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.1.tgz", - "integrity": "sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug==", - "license": "MIT", - "dependencies": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.5.4", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/logger": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.8.1.tgz", - "integrity": "sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/mdx-loader": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", - "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.8.1.tgz", - "integrity": "sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg==", - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.8.1", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/plugin-client-redirects": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.8.1.tgz", - "integrity": "sha512-F+86R7PBn6VNgy/Ux8w3ZRypJGJEzksbejQKlbTC8u6uhBUhfdXWkDp6qdOisIoW0buY5nLqucvZt1zNJzhJhA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.8.1.tgz", - "integrity": "sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/mdx-loader": "3.8.1", - "@docusaurus/theme-common": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "cheerio": "1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "srcset": "^4.0.0", - "tslib": "^2.6.0", - "unist-util-visit": "^5.0.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz", - "integrity": "sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/mdx-loader": "3.8.1", - "@docusaurus/module-type-aliases": "3.8.1", - "@docusaurus/theme-common": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "@types/react-router-config": "^5.0.7", - "combine-promises": "^1.1.0", - "fs-extra": "^11.1.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "tslib": "^2.6.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz", - "integrity": "sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/mdx-loader": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz", - "integrity": "sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/plugin-debug": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz", - "integrity": "sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "fs-extra": "^11.1.1", - "react-json-view-lite": "^2.3.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz", - "integrity": "sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.8.1.tgz", - "integrity": "sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "@types/gtag.js": "^0.0.12", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.8.1.tgz", - "integrity": "sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.8.1.tgz", - "integrity": "sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-svgr": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.8.1.tgz", - "integrity": "sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "@svgr/core": "8.1.0", - "@svgr/webpack": "^8.1.0", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/preset-classic": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.8.1.tgz", - "integrity": "sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/plugin-content-blog": "3.8.1", - "@docusaurus/plugin-content-docs": "3.8.1", - "@docusaurus/plugin-content-pages": "3.8.1", - "@docusaurus/plugin-css-cascade-layers": "3.8.1", - "@docusaurus/plugin-debug": "3.8.1", - "@docusaurus/plugin-google-analytics": "3.8.1", - "@docusaurus/plugin-google-gtag": "3.8.1", - "@docusaurus/plugin-google-tag-manager": "3.8.1", - "@docusaurus/plugin-sitemap": "3.8.1", - "@docusaurus/plugin-svgr": "3.8.1", - "@docusaurus/theme-classic": "3.8.1", - "@docusaurus/theme-common": "3.8.1", - "@docusaurus/theme-search-algolia": "3.8.1", - "@docusaurus/types": "3.8.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/remark-plugin-npm2yarn": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/remark-plugin-npm2yarn/-/remark-plugin-npm2yarn-3.8.1.tgz", - "integrity": "sha512-lrws3n7jyJrDKqpdFiEX0ZIwVOgGj9z+ZXf0k/rXrftcNh06Y+cEMnNVoNpO3EJKiLDXmTWoxGf/I1qWb/WV6g==", - "license": "MIT", - "dependencies": { - "mdast-util-mdx": "^3.0.0", - "npm-to-yarn": "^3.0.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.8.1.tgz", - "integrity": "sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/mdx-loader": "3.8.1", - "@docusaurus/module-type-aliases": "3.8.1", - "@docusaurus/plugin-content-blog": "3.8.1", - "@docusaurus/plugin-content-docs": "3.8.1", - "@docusaurus/plugin-content-pages": "3.8.1", - "@docusaurus/theme-common": "3.8.1", - "@docusaurus/theme-translations": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "copy-text-to-clipboard": "^3.2.0", - "infima": "0.2.0-alpha.45", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.5.4", - "prism-react-renderer": "^2.3.0", - "prismjs": "^1.29.0", - "react-router-dom": "^5.3.4", - "rtlcss": "^4.1.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-common": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.8.1.tgz", - "integrity": "sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw==", - "license": "MIT", - "dependencies": { - "@docusaurus/mdx-loader": "3.8.1", - "@docusaurus/module-type-aliases": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^2.0.0", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.3.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-mermaid": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.8.1.tgz", - "integrity": "sha512-IWYqjyTPjkNnHsFFu9+4YkeXS7PD1xI3Bn2shOhBq+f95mgDfWInkpfBN4aYvx4fTT67Am6cPtohRdwh4Tidtg==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/module-type-aliases": "3.8.1", - "@docusaurus/theme-common": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "mermaid": ">=11.6.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.8.1.tgz", - "integrity": "sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ==", - "license": "MIT", - "dependencies": { - "@docsearch/react": "^3.9.0", - "@docusaurus/core": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/plugin-content-docs": "3.8.1", - "@docusaurus/theme-common": "3.8.1", - "@docusaurus/theme-translations": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "algoliasearch": "^5.17.1", - "algoliasearch-helper": "^3.22.6", - "clsx": "^2.0.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-translations": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.8.1.tgz", - "integrity": "sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g==", - "license": "MIT", - "dependencies": { - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/tsconfig": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.8.1.tgz", - "integrity": "sha512-XBWCcqhRHhkhfolnSolNL+N7gj3HVE3CoZVqnVjfsMzCoOsuQw2iCLxVVHtO+rePUUfouVZHURDgmqIySsF66A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@docusaurus/types": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.8.1.tgz", - "integrity": "sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/types/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docusaurus/utils": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.8.1.tgz", - "integrity": "sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "escape-string-regexp": "^4.0.0", - "execa": "5.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "p-queue": "^6.6.2", - "prompts": "^2.4.2", - "resolve-pathname": "^3.0.0", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/utils-common": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.8.1.tgz", - "integrity": "sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg==", - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.8.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/utils-validation": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.8.1.tgz", - "integrity": "sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@easyops-cn/autocomplete.js": { - "version": "0.38.1", - "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz", - "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "immediate": "^3.2.3" - } - }, - "node_modules/@easyops-cn/docusaurus-search-local": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.52.1.tgz", - "integrity": "sha512-pwfANjTLOQyAPc2Iz93WbG4OQM5C4COCWARbLAs79FIpIS38gHq3PrbDIX8f7oDhGQp1u6f8fr3K3u3+yZXZTA==", - "license": "MIT", - "dependencies": { - "@docusaurus/plugin-content-docs": "^2 || ^3", - "@docusaurus/theme-translations": "^2 || ^3", - "@docusaurus/utils": "^2 || ^3", - "@docusaurus/utils-common": "^2 || ^3", - "@docusaurus/utils-validation": "^2 || ^3", - "@easyops-cn/autocomplete.js": "^0.38.1", - "@node-rs/jieba": "^1.6.0", - "cheerio": "^1.0.0", - "clsx": "^2.1.1", - "comlink": "^4.4.2", - "debug": "^4.2.0", - "fs-extra": "^10.0.0", - "klaw-sync": "^6.0.0", - "lunr": "^2.3.9", - "lunr-languages": "^1.4.0", - "mark.js": "^8.11.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "@docusaurus/theme-common": "^2 || ^3", - "react": "^16.14.0 || ^17 || ^18 || ^19", - "react-dom": "^16.14.0 || 17 || ^18 || ^19" - } - }, - "node_modules/@easyops-cn/docusaurus-search-local/node_modules/cheerio": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.0.tgz", - "integrity": "sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==", - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.0", - "htmlparser2": "^10.0.0", - "parse5": "^7.3.0", - "parse5-htmlparser2-tree-adapter": "^7.1.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^7.10.0", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=18.17" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/@easyops-cn/docusaurus-search-local/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@easyops-cn/docusaurus-search-local/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@easyops-cn/docusaurus-search-local/node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "license": "MIT" - }, - "node_modules/@iconify/utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", - "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", - "license": "MIT", - "dependencies": { - "@antfu/install-pkg": "^1.0.0", - "@antfu/utils": "^8.1.0", - "@iconify/types": "^2.0.0", - "debug": "^4.4.0", - "globals": "^15.14.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.0.0", - "mlly": "^1.7.4" - } - }, - "node_modules/@iconify/utils/node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.11.tgz", - "integrity": "sha512-C512c1ytBTio4MrpWKlJpyFHT6+qfFL8SZ58zBzJ1OOzUEjHeF1BtjY2fH7n4x/g2OV/KiiMLAivOp1DXmiMMw==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.9.tgz", - "integrity": "sha512-amBU75CKOOkcQLfyM6J+DnWwz41yTsWI7o8MQ003LwUIWb4NYX/evAblTx1oBBYJySqL/zHPxHXDw5ewpQaUFw==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.3.tgz", - "integrity": "sha512-AiR5uKpFxP3PjO4R19kQGIMwxyRyPuXmKEEy301V1C0+1rVjS94EZQXf1QKZYN8Q0YM+estSPhmx5JwNftv6nw==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.28", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.28.tgz", - "integrity": "sha512-KNNHHwW3EIp4EDYOvYFGyIFfx36R2dNJYH4knnZlF8T5jdbD5Wx8xmSaQ2gP9URkJ04LGEtlcCtwArKcmFcwKw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "license": "MIT" - }, - "node_modules/@mdx-js/mdx": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", - "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-scope": "^1.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "recma-build-jsx": "^1.0.0", - "recma-jsx": "^1.0.0", - "recma-stringify": "^1.0.0", - "rehype-recma": "^1.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", - "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", - "license": "MIT", - "dependencies": { - "@types/mdx": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/@mermaid-js/parser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.2.tgz", - "integrity": "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==", - "license": "MIT", - "dependencies": { - "langium": "3.3.1" - } - }, - "node_modules/@node-rs/jieba": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.10.4.tgz", - "integrity": "sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==", - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "optionalDependencies": { - "@node-rs/jieba-android-arm-eabi": "1.10.4", - "@node-rs/jieba-android-arm64": "1.10.4", - "@node-rs/jieba-darwin-arm64": "1.10.4", - "@node-rs/jieba-darwin-x64": "1.10.4", - "@node-rs/jieba-freebsd-x64": "1.10.4", - "@node-rs/jieba-linux-arm-gnueabihf": "1.10.4", - "@node-rs/jieba-linux-arm64-gnu": "1.10.4", - "@node-rs/jieba-linux-arm64-musl": "1.10.4", - "@node-rs/jieba-linux-x64-gnu": "1.10.4", - "@node-rs/jieba-linux-x64-musl": "1.10.4", - "@node-rs/jieba-wasm32-wasi": "1.10.4", - "@node-rs/jieba-win32-arm64-msvc": "1.10.4", - "@node-rs/jieba-win32-ia32-msvc": "1.10.4", - "@node-rs/jieba-win32-x64-msvc": "1.10.4" - } - }, - "node_modules/@node-rs/jieba-darwin-arm64": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.4.tgz", - "integrity": "sha512-G++RYEJ2jo0rxF9626KUy90wp06TRUjAsvY/BrIzEOX/ingQYV/HjwQzNPRR1P1o32a6/U8RGo7zEBhfdybL6w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "license": "MIT", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "license": "MIT" - }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@slorber/remark-comment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.1.0", - "micromark-util-symbol": "^1.0.1" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", - "license": "MIT" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", - "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, - "node_modules/@types/gtag.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "license": "MIT" - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.0.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.8.tgz", - "integrity": "sha512-WytNrFSgWO/esSH9NbpWUfTMGQwCGIKfCmNlmFDNiI5gGhgMmEA+V1AEvKLeBNvvtBnailJtkrEa2OIISwrVAA==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.8.0" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", - "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-config": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", - "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "license": "MIT" - }, - "node_modules/@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/algoliasearch": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.30.0.tgz", - "integrity": "sha512-ILSdPX4je0n5WUKD34TMe57/eqiXUzCIjAsdtLQYhomqOjTtFUg1s6dE7kUegc4Mc43Xr7IXYlMutU9HPiYfdw==", - "license": "MIT", - "dependencies": { - "@algolia/client-abtesting": "5.30.0", - "@algolia/client-analytics": "5.30.0", - "@algolia/client-common": "5.30.0", - "@algolia/client-insights": "5.30.0", - "@algolia/client-personalization": "5.30.0", - "@algolia/client-query-suggestions": "5.30.0", - "@algolia/client-search": "5.30.0", - "@algolia/ingestion": "1.30.0", - "@algolia/monitoring": "1.30.0", - "@algolia/recommend": "5.30.0", - "@algolia/requester-browser-xhr": "5.30.0", - "@algolia/requester-fetch": "5.30.0", - "@algolia/requester-node-http": "5.30.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/algoliasearch-helper": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz", - "integrity": "sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw==", - "license": "MIT", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", - "license": "MIT", - "bin": { - "astring": "bin/astring" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/babel-loader": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", - "license": "MIT", - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "license": "MIT", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001726", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", - "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chevrotain": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", - "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/cst-dts-gen": "11.0.3", - "@chevrotain/gast": "11.0.3", - "@chevrotain/regexp-to-ast": "11.0.3", - "@chevrotain/types": "11.0.3", - "@chevrotain/utils": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/chevrotain-allstar": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", - "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", - "license": "MIT", - "dependencies": { - "lodash-es": "^4.17.21" - }, - "peerDependencies": { - "chevrotain": "^11.0.0" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/collapse-white-space": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" - }, - "node_modules/combine-promises": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", - "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/comlink": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", - "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", - "license": "Apache-2.0" - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "license": "ISC" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compressible/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "license": "MIT" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "license": "BSD-2-Clause", - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/copy-text-to-clipboard": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", - "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.43.0.tgz", - "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", - "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.25.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.43.0.tgz", - "integrity": "sha512-i/AgxU2+A+BbJdMxh3v7/vxi2SbFqxiFmg6VsDwYB4jkucrd1BZNA9a9gphC0fYMG5IBSgQcbQnk865VCLe7xA==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "license": "MIT", - "dependencies": { - "layout-base": "^1.0.0" - } - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-blank-pseudo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", - "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", - "license": "ISC", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-has-pseudo": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz", - "integrity": "sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "cssnano": "^6.0.1", - "jest-worker": "^29.4.3", - "postcss": "^8.4.24", - "schema-utils": "^4.0.1", - "serialize-javascript": "^6.0.1" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", - "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssdb": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.3.1.tgz", - "integrity": "sha512-XnDRQMXucLueX92yDe0LPKupXetWoFOgawr4O4X41l5TltgK2NVbJJVDnnOywDYfW1sTJ28AcXGKOqdRKwCcmQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ], - "license": "MIT-0" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", - "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^6.1.2", - "lilconfig": "^3.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-advanced": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", - "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", - "license": "MIT", - "dependencies": { - "autoprefixer": "^10.4.19", - "browserslist": "^4.23.0", - "cssnano-preset-default": "^6.1.2", - "postcss-discard-unused": "^6.0.5", - "postcss-merge-idents": "^6.0.3", - "postcss-reduce-idents": "^6.0.3", - "postcss-zindex": "^6.0.2" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-default": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^4.0.2", - "postcss-calc": "^9.0.1", - "postcss-colormin": "^6.1.0", - "postcss-convert-values": "^6.1.0", - "postcss-discard-comments": "^6.0.2", - "postcss-discard-duplicates": "^6.0.3", - "postcss-discard-empty": "^6.0.3", - "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.5", - "postcss-merge-rules": "^6.1.1", - "postcss-minify-font-values": "^6.1.0", - "postcss-minify-gradients": "^6.0.3", - "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.4", - "postcss-normalize-charset": "^6.0.2", - "postcss-normalize-display-values": "^6.0.2", - "postcss-normalize-positions": "^6.0.2", - "postcss-normalize-repeat-style": "^6.0.2", - "postcss-normalize-string": "^6.0.2", - "postcss-normalize-timing-functions": "^6.0.2", - "postcss-normalize-unicode": "^6.1.0", - "postcss-normalize-url": "^6.0.2", - "postcss-normalize-whitespace": "^6.0.2", - "postcss-ordered-values": "^6.0.2", - "postcss-reduce-initial": "^6.1.0", - "postcss-reduce-transforms": "^6.0.2", - "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.4" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-utils": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "license": "MIT", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "license": "CC0-1.0" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/cytoscape": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.32.1.tgz", - "integrity": "sha512-dbeqFTLYEwlFg7UGtcZhCCG/2WayX72zK3Sq323CEX29CY81tYfVhw1MIdduCtpstB0cTOhJswWlM/OEB3Xp+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^2.2.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "license": "MIT", - "dependencies": { - "layout-base": "^2.0.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "license": "MIT" - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "license": "ISC", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "license": "ISC", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3-dsv/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "license": "ISC", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "license": "BSD-3-Clause", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "license": "ISC" - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre-d3-es": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", - "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", - "license": "MIT", - "dependencies": { - "d3": "^7.9.0", - "lodash-es": "^4.17.21" - } - }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", - "license": "MIT" - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "license": "ISC", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, - "node_modules/detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", - "license": "MIT", - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/dompurify": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", - "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.178", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.178.tgz", - "integrity": "sha512-wObbz/ar3Bc6e4X5vf0iO8xTN8YAjN/tgiAOJLr7yjYFtP9wAjq8Mb5h0yn6kResir+VYx2DXBj9NNobs0ETSA==", - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/emoticon": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", - "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } - }, - "node_modules/encoding-sniffer/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", - "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esast-util-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", - "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/esast-util-from-js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", - "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "acorn": "^8.0.0", - "esast-util-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-util-attach-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-build-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-walker": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-scope": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", - "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-value-to-estree": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.4.0.tgz", - "integrity": "sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, - "node_modules/estree-util-visit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eta": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "url": "https://github.com/eta-dev/eta?sponsor=1" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "dependencies": { - "@types/node": "*", - "require-like": ">= 0.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/express/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/exsolve": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", - "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", - "license": "MIT" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "license": "MIT", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "license": "MIT", - "dependencies": { - "xml-js": "^1.6.11" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/file-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/file-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "license": "Unlicense" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "license": "ISC" - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", - "license": "ISC" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause" - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "license": "MIT", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hachure-fill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", - "license": "MIT" - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^9.0.0", - "property-information": "^7.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-estree": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", - "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-attach-comments": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5/node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "license": "MIT" - }, - "node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", - "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/html-webpack-plugin/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", - "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/infima": { - "version": "0.2.0-alpha.45", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", - "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/inline-style-parser": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", - "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", - "license": "MIT" - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/katex": { - "version": "0.16.22", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", - "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.11" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "license": "MIT" - }, - "node_modules/langium": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", - "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", - "license": "MIT", - "dependencies": { - "chevrotain": "~11.0.3", - "chevrotain-allstar": "~0.3.0", - "vscode-languageserver": "~9.0.1", - "vscode-languageserver-textdocument": "~1.0.11", - "vscode-uri": "~3.0.8" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "license": "MIT", - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/launch-editor": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", - "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "license": "MIT" - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "license": "MIT", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/local-pkg": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz", - "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", - "license": "MIT", - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.0.1", - "quansync": "^0.2.8" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "license": "MIT" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "license": "MIT" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "license": "MIT" - }, - "node_modules/lunr-languages": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.14.0.tgz", - "integrity": "sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA==", - "license": "MPL-1.1" - }, - "node_modules/mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", - "license": "MIT" - }, - "node_modules/markdown-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/marked": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.1.1.tgz", - "integrity": "sha512-ij/2lXfCRT71L6u0M29tJPhP0bM5shLL3u5BePhFwPELj2blMJ6GDtD7PfJhRLhJ/c2UwrK17ySVcDzy2YHjHQ==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdast-util-directive": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", - "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/mdast-util-frontmatter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "escape-string-regexp": "^5.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "license": "CC0-1.0" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/mermaid": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.9.0.tgz", - "integrity": "sha512-YdPXn9slEwO0omQfQIsW6vS84weVQftIyyTGAZCwM//MGhPzL1+l6vO6bkf0wnP4tHigH1alZ5Ooy3HXI2gOag==", - "license": "MIT", - "dependencies": { - "@braintree/sanitize-url": "^7.0.4", - "@iconify/utils": "^2.1.33", - "@mermaid-js/parser": "^0.6.2", - "@types/d3": "^7.4.3", - "cytoscape": "^3.29.3", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.2.0", - "d3": "^7.9.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.11", - "dayjs": "^1.11.13", - "dompurify": "^3.2.5", - "katex": "^0.16.22", - "khroma": "^2.1.0", - "lodash-es": "^4.17.21", - "marked": "^16.0.0", - "roughjs": "^4.6.6", - "stylis": "^4.3.6", - "ts-dedent": "^2.2.0", - "uuid": "^11.1.0" - } - }, - "node_modules/mermaid/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-directive": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", - "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-frontmatter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", - "license": "MIT", - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", - "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", - "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-extension-mdx-md": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "license": "MIT", - "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", - "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-space/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-character/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", - "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark/node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark/node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "license": "MIT", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mlly": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", - "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", - "license": "MIT", - "dependencies": { - "acorn": "^8.14.0", - "pathe": "^2.0.1", - "pkg-types": "^1.3.0", - "ufo": "^1.5.4" - } - }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "license": "MIT" - }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.2.tgz", - "integrity": "sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-to-yarn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-to-yarn/-/npm-to-yarn-3.0.1.tgz", - "integrity": "sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/nebrelbug/npm-to-yarn?sponsor=1" - } - }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "license": "MIT" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/null-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/null-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/null-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/null-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/null-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "license": "MIT", - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-manager-detector": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", - "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", - "license": "MIT" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", - "license": "ISC" - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-data-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "license": "(WTFPL OR MIT)" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.2.0.tgz", - "integrity": "sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==", - "license": "MIT", - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "node_modules/points-on-curve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", - "license": "MIT" - }, - "node_modules/points-on-path": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", - "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", - "license": "MIT", - "dependencies": { - "path-data-parser": "0.1.0", - "points-on-curve": "0.2.0" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", - "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-calc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.10.tgz", - "integrity": "sha512-k9qX+aXHBiLTRrWoCJuUFI6F1iF6QJQUXNVWJVSbqZgj57jDhBlOvD8gNUGl35tgqDivbGLhZeW3Ongz4feuKA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.0.10", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", - "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", - "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-colormin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-convert-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-custom-media": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", - "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-properties": { - "version": "14.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", - "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", - "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", - "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-discard-comments": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-empty": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-unused": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", - "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.2.tgz", - "integrity": "sha512-7qTqnL7nfLRyJK/AHSVrrXOuvDDzettC+wGoienURV8v2svNbu6zJC52ruZtHaO6mfcagFmuTGFdzRsJKB3k5Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", - "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-focus-within": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", - "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", - "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-image-set-function": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", - "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-lab-function": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.10.tgz", - "integrity": "sha512-tqs6TCEv9tC1Riq6fOzHuHcZyhg4k3gIAMB8GGY/zA1ssGdm6puHMVE7t75aOSoFg7UD2wyrFFhbldiCMyyFTQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.0.10", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-loader": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.3.5", - "jiti": "^1.20.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-logical": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", - "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-merge-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", - "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", - "license": "MIT", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.2", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", - "license": "MIT", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-params": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nesting": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", - "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-resolve-nested": "^3.1.0", - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", - "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-string": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", - "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-ordered-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", - "license": "MIT", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", - "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", - "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-preset-env": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.4.tgz", - "integrity": "sha512-q+lXgqmTMdB0Ty+EQ31SuodhdfZetUlwCA/F0zRcd/XdxjzI+Rl2JhZNz5US2n/7t9ePsvuhCnEN4Bmu86zXlA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-cascade-layers": "^5.0.2", - "@csstools/postcss-color-function": "^4.0.10", - "@csstools/postcss-color-mix-function": "^3.0.10", - "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.0", - "@csstools/postcss-content-alt-text": "^2.0.6", - "@csstools/postcss-exponential-functions": "^2.0.9", - "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.10", - "@csstools/postcss-gradients-interpolation-method": "^5.0.10", - "@csstools/postcss-hwb-function": "^4.0.10", - "@csstools/postcss-ic-unit": "^4.0.2", - "@csstools/postcss-initial": "^2.0.1", - "@csstools/postcss-is-pseudo-class": "^5.0.3", - "@csstools/postcss-light-dark-function": "^2.0.9", - "@csstools/postcss-logical-float-and-clear": "^3.0.0", - "@csstools/postcss-logical-overflow": "^2.0.0", - "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", - "@csstools/postcss-logical-resize": "^3.0.0", - "@csstools/postcss-logical-viewport-units": "^3.0.4", - "@csstools/postcss-media-minmax": "^2.0.9", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", - "@csstools/postcss-nested-calc": "^4.0.0", - "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.10", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", - "@csstools/postcss-random-function": "^2.0.1", - "@csstools/postcss-relative-color-syntax": "^3.0.10", - "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.4", - "@csstools/postcss-stepped-value-functions": "^4.0.9", - "@csstools/postcss-text-decoration-shorthand": "^4.0.2", - "@csstools/postcss-trigonometric-functions": "^4.0.9", - "@csstools/postcss-unset-value": "^4.0.0", - "autoprefixer": "^10.4.21", - "browserslist": "^4.25.0", - "css-blank-pseudo": "^7.0.1", - "css-has-pseudo": "^7.0.2", - "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.3.0", - "postcss-attribute-case-insensitive": "^7.0.1", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.10", - "postcss-color-hex-alpha": "^10.0.0", - "postcss-color-rebeccapurple": "^10.0.0", - "postcss-custom-media": "^11.0.6", - "postcss-custom-properties": "^14.0.6", - "postcss-custom-selectors": "^8.0.5", - "postcss-dir-pseudo-class": "^9.0.1", - "postcss-double-position-gradients": "^6.0.2", - "postcss-focus-visible": "^10.0.1", - "postcss-focus-within": "^9.0.1", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^6.0.0", - "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.10", - "postcss-logical": "^8.1.0", - "postcss-nesting": "^13.0.2", - "postcss-opacity-percentage": "^3.0.0", - "postcss-overflow-shorthand": "^6.0.0", - "postcss-page-break": "^3.0.4", - "postcss-place": "^10.0.0", - "postcss-pseudo-class-any-link": "^10.0.1", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^8.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", - "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-reduce-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", - "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "license": "MIT", - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", - "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-sort-media-queries": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", - "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", - "license": "MIT", - "dependencies": { - "sort-css-media-queries": "2.2.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.4.23" - } - }, - "node_modules/postcss-svgo": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.2.0" - }, - "engines": { - "node": "^14 || ^16 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/postcss-zindex": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", - "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/prism-react-renderer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", - "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", - "license": "MIT", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "license": "ISC" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "license": "MIT", - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/quansync": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", - "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", - "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", - "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.1" - } - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT" - }, - "node_modules/react-helmet-async": { - "name": "@slorber/react-helmet-async", - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/react-json-view-lite": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.4.1.tgz", - "integrity": "sha512-fwFYknRIBxjbFm0kBDrzgBy1xa5tDg2LyXXBepC5f1b+MY3BUClMCsvanMPn089JbV1Eg3nZcrp0VCuH43aXnA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-loadable": { - "name": "@docusaurus/react-loadable", - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", - "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "license": "MIT", - "dependencies": { - "@types/react": "*" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.3" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "react-loadable": "*", - "webpack": ">=4.41.1 || 5.x" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2" - }, - "peerDependencies": { - "react": ">=15", - "react-router": ">=5" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recma-build-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", - "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/recma-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", - "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", - "license": "MIT", - "dependencies": { - "acorn-jsx": "^5.0.0", - "estree-util-to-js": "^2.0.0", - "recma-parse": "^1.0.0", - "recma-stringify": "^1.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/recma-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", - "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "esast-util-from-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/recma-stringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", - "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-to-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", - "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", - "license": "MIT", - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "license": "MIT", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.0.2" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-recma": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", - "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "hast-util-to-estree": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remark-directive": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", - "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-directive": "^3.0.0", - "micromark-extension-directive": "^3.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-emoji": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.2", - "emoticon": "^4.0.1", - "mdast-util-find-and-replace": "^3.0.1", - "node-emoji": "^2.1.0", - "unified": "^11.0.4" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/remark-frontmatter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", - "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-frontmatter": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", - "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", - "license": "MIT", - "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", - "engines": { - "node": "*" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "license": "MIT" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", - "license": "MIT" - }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "license": "MIT", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "license": "Unlicense" - }, - "node_modules/roughjs": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", - "license": "MIT", - "dependencies": { - "hachure-fill": "^0.5.2", - "path-data-parser": "^0.1.0", - "points-on-curve": "^0.2.0", - "points-on-path": "^0.2.1" - } - }, - "node_modules/rtlcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", - "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", - "license": "MIT", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0", - "postcss": "^8.4.21", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "rtlcss": "bin/rtlcss.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" - }, - "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT" - }, - "node_modules/schema-dts": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", - "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", - "license": "Apache-2.0" - }, - "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "license": "MIT", - "peer": true - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "license": "MIT" - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-handler": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", - "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", - "license": "MIT", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "3.3.0", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", - "license": "MIT" - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "license": "ISC" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/sitemap": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", - "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", - "license": "MIT", - "dependencies": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "bin": { - "sitemap": "dist/cli.js" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" - } - }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "license": "MIT" - }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "license": "MIT", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sort-css-media-queries": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", - "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", - "license": "MIT", - "engines": { - "node": ">= 6.3.0" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/srcset": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", - "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", - "license": "MIT" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "license": "BSD-2-Clause", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-to-js": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", - "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.9" - } - }, - "node_modules/style-to-object": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", - "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.4" - } - }, - "node_modules/stylehacks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "license": "MIT" - }, - "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", - "license": "MIT", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "license": "MIT" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", - "license": "MIT" - }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "license": "MIT" - }, - "node_modules/undici": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.11.0.tgz", - "integrity": "sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==", - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "license": "BSD-2-Clause", - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/url-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/url-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/url-loader/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "license": "MIT" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "license": "MIT" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "license": "MIT" - }, - "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webpack": { - "version": "5.99.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", - "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "license": "MIT", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpackbar": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", - "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "consola": "^3.2.3", - "figures": "^3.2.0", - "markdown-table": "^2.0.0", - "pretty-time": "^1.1.0", - "std-env": "^3.7.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=14.21.3" - }, - "peerDependencies": { - "webpack": "3 || 4 || 5" - } - }, - "node_modules/webpackbar/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/webpackbar/node_modules/markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "license": "MIT", - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webpackbar/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpackbar/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "license": "MIT", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } + "name": "site", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "site", + "version": "0.0.0", + "dependencies": { + "@docusaurus/core": "^3.8.1", + "@docusaurus/plugin-client-redirects": "^3.8.1", + "@docusaurus/preset-classic": "^3.8.1", + "@docusaurus/remark-plugin-npm2yarn": "^3.8.1", + "@docusaurus/theme-mermaid": "^3.8.1", + "@easyops-cn/docusaurus-search-local": "^0.52.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.8.1", + "@docusaurus/tsconfig": "^3.8.1", + "@docusaurus/types": "^3.8.1", + "typescript": "^5.9.2" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", + "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.9", + "@algolia/autocomplete-shared": "1.17.9" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz", + "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.9" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz", + "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.9" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", + "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.30.0.tgz", + "integrity": "sha512-Q3OQXYlTNqVUN/V1qXX8VIzQbLjP3yrRBO9m6NRe1CBALmoGHh9JrYosEGvfior28+DjqqU3Q+nzCSuf/bX0Gw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.30.0", + "@algolia/requester-browser-xhr": "5.30.0", + "@algolia/requester-fetch": "5.30.0", + "@algolia/requester-node-http": "5.30.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.30.0.tgz", + "integrity": "sha512-/b+SAfHjYjx/ZVeVReCKTTnFAiZWOyvYLrkYpeNMraMT6akYRR8eC1AvFcvR60GLG/jytxcJAp42G8nN5SdcLg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.30.0", + "@algolia/requester-browser-xhr": "5.30.0", + "@algolia/requester-fetch": "5.30.0", + "@algolia/requester-node-http": "5.30.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.30.0.tgz", + "integrity": "sha512-tbUgvkp2d20mHPbM0+NPbLg6SzkUh0lADUUjzNCF+HiPkjFRaIW3NGMlESKw5ia4Oz6ZvFzyREquUX6rdkdJcQ==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.30.0.tgz", + "integrity": "sha512-caXuZqJK761m32KoEAEkjkE2WF/zYg1McuGesWXiLSgfxwZZIAf+DljpiSToBUXhoPesvjcLtINyYUzbkwE0iw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.30.0", + "@algolia/requester-browser-xhr": "5.30.0", + "@algolia/requester-fetch": "5.30.0", + "@algolia/requester-node-http": "5.30.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.30.0.tgz", + "integrity": "sha512-7K6P7TRBHLX1zTmwKDrIeBSgUidmbj6u3UW/AfroLRDGf9oZFytPKU49wg28lz/yulPuHY0nZqiwbyAxq9V17w==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.30.0", + "@algolia/requester-browser-xhr": "5.30.0", + "@algolia/requester-fetch": "5.30.0", + "@algolia/requester-node-http": "5.30.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.30.0.tgz", + "integrity": "sha512-WMjWuBjYxJheRt7Ec5BFr33k3cV0mq2WzmH9aBf5W4TT8kUp34x91VRsYVaWOBRlxIXI8o/WbhleqSngiuqjLA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.30.0", + "@algolia/requester-browser-xhr": "5.30.0", + "@algolia/requester-fetch": "5.30.0", + "@algolia/requester-node-http": "5.30.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.30.0.tgz", + "integrity": "sha512-puc1/LREfSqzgmrOFMY5L/aWmhYOlJ0TTpa245C0ZNMKEkdOkcimFbXTXQ8lZhzh+rlyFgR7cQGNtXJ5H0XgZg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.30.0", + "@algolia/requester-browser-xhr": "5.30.0", + "@algolia/requester-fetch": "5.30.0", + "@algolia/requester-node-http": "5.30.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" + }, + "node_modules/@algolia/ingestion": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.30.0.tgz", + "integrity": "sha512-NfqiIKVgGKTLr6T9F81oqB39pPiEtILTy0z8ujxPKg2rCvI/qQeDqDWFBmQPElCfUTU6kk67QAgMkQ7T6fE+gg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.30.0", + "@algolia/requester-browser-xhr": "5.30.0", + "@algolia/requester-fetch": "5.30.0", + "@algolia/requester-node-http": "5.30.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.30.0.tgz", + "integrity": "sha512-/eeM3aqLKro5KBZw0W30iIA6afkGa+bcpvEM0NDa92m5t3vil4LOmJI9FkgzfmSkF4368z/SZMOTPShYcaVXjA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.30.0", + "@algolia/requester-browser-xhr": "5.30.0", + "@algolia/requester-fetch": "5.30.0", + "@algolia/requester-node-http": "5.30.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.30.0.tgz", + "integrity": "sha512-iWeAUWqw+xT+2IyUyTqnHCK+cyCKYV5+B6PXKdagc9GJJn6IaPs8vovwoC0Za5vKCje/aXQ24a2Z1pKpc/tdHg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.30.0", + "@algolia/requester-browser-xhr": "5.30.0", + "@algolia/requester-fetch": "5.30.0", + "@algolia/requester-node-http": "5.30.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.30.0.tgz", + "integrity": "sha512-alo3ly0tdNLjfMSPz9dmNwYUFHx7guaz5dTGlIzVGnOiwLgIoM6NgA+MJLMcH6e1S7OpmE2AxOy78svlhst2tQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.30.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.30.0.tgz", + "integrity": "sha512-WOnTYUIY2InllHBy6HHMpGIOo7Or4xhYUx/jkoSK/kPIa1BRoFEHqa8v4pbKHtoG7oLvM2UAsylSnjVpIhGZXg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.30.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.30.0.tgz", + "integrity": "sha512-uSTUh9fxeHde1c7KhvZKUrivk90sdiDftC+rSKNFKKEU9TiIKAGA7B2oKC+AoMCqMymot1vW9SGbeESQPTZd0w==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.30.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", + "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.7.tgz", + "integrity": "sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", + "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.27.7", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.7", + "@babel/types": "^7.27.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", + "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", + "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.7.tgz", + "integrity": "sha512-CuLkokN1PEZ0Fsjtq+001aog/C2drDK9nTfK/NRK0n6rBin6cBrvM+zfQjDE+UllhR6/J4a6w8Xq9i4yi3mQrw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.7.tgz", + "integrity": "sha512-pg3ZLdIKWCP0CrJm0O4jYjVthyBeioVfvz9nwt6o5paUxsgJ/8GucSMAIaj6M7xA4WY+SrvtGu2LijzkdyecWQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.7.tgz", + "integrity": "sha512-201B1kFTWhckclcXpWHc8uUpYziDX/Pl4rxl0ZX0DiCZ3jknwfSUALL3QCYeeXXB37yWxJbo+g+Vfq8pAaHi3w==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.7", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.27.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", + "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", + "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.4.tgz", + "integrity": "sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", + "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.6.tgz", + "integrity": "sha512-vDVrlmRAY8z9Ul/HxT+8ceAru95LQgkSKiXkSYZvqtbkPSfhZJgpRp45Cldbh1GJ1kxzQkI70AqyrTI58KpaWQ==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.30.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", + "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.5", + "@babel/parser": "^7.27.7", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz", + "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", + "license": "MIT" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "license": "Apache-2.0" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", + "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.10.tgz", + "integrity": "sha512-4dY0NBu7NVIpzxZRgh/Q/0GPSz/jLSw0i/u3LTUor0BkQcz/fNhN10mSWBDsL0p9nDb0Ky1PD6/dcGbhACuFTQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.10.tgz", + "integrity": "sha512-P0lIbQW9I4ShE7uBgZRib/lMTf9XMjJkFl/d6w4EMNHu2qvQ6zljJGEcBkw/NsBtq/6q3WrmgxSS8kHtPMkK4Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.0.tgz", + "integrity": "sha512-Z5WhouTyD74dPFPrVE7KydgNS9VvnjB8qcdes9ARpCOItb4jTnm7cHp4FhxCRUoyhabD0WVv43wbkJ4p8hLAlQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.6.tgz", + "integrity": "sha512-eRjLbOjblXq+byyaedQRSrAejKGNAFued+LcbzT+LCL78fabxHkxYjBbxkroONxHHYu2qxhFK2dBStTLPG3jpQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.10.tgz", + "integrity": "sha512-QDGqhJlvFnDlaPAfCYPsnwVA6ze+8hhrwevYWlnUeSjkkZfBpcCO42SaUD8jiLlq7niouyLgvup5lh+f1qessg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.10.tgz", + "integrity": "sha512-HHPauB2k7Oits02tKFUeVFEU2ox/H3OQVrP3fSOKDxvloOikSal+3dzlyTZmYsb9FlY9p5EUpBtz0//XBmy+aw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.10.tgz", + "integrity": "sha512-nOKKfp14SWcdEQ++S9/4TgRKchooLZL0TUFdun3nI4KPwCjETmhjta1QT4ICQcGVWQTvrsgMM/aLB5We+kMHhQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.2.tgz", + "integrity": "sha512-lrK2jjyZwh7DbxaNnIUjkeDmU8Y6KyzRBk91ZkI5h8nb1ykEfZrtIVArdIjX4DHMIBGpdHrgP0n4qXDr7OHaKA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.9.tgz", + "integrity": "sha512-1tCZH5bla0EAkFAI2r0H33CDnIBeLUaJh1p+hvvsylJ4svsv2wOmJjJn+OXwUZLXef37GYbRIVKX+X+g6m+3CQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.10.tgz", + "integrity": "sha512-ZzZUTDd0fgNdhv8UUjGCtObPD8LYxMH+MJsW9xlZaWTV8Ppr4PtxlHYNMmF4vVWGl0T6f8tyWAKjoI6vePSgAg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.1.0.tgz", + "integrity": "sha512-YrkI9dx8U4R8Sz2EJaoeD9fI7s7kmeEBfmO+UURNeL6lQI7VxF6sBE+rSqdCBn4onwqmxFdBU3lTwyYb/lCmxA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.10.tgz", + "integrity": "sha512-8+0kQbQGg9yYG8hv0dtEpOMLwB9M+P7PhacgIzVzJpixxV4Eq9AUQtQw8adMmAJU1RBBmIlpmtmm3XTRd/T00g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz", + "integrity": "sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz", + "integrity": "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz", + "integrity": "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.9", + "@algolia/autocomplete-preset-algolia": "1.17.9", + "@docsearch/css": "3.9.0", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.8.1.tgz", + "integrity": "sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/runtime-corejs3": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.8.1.tgz", + "integrity": "sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.8.1", + "@docusaurus/cssnano-preset": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^6.0.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.8.1.tgz", + "integrity": "sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.8.1", + "@docusaurus/bundler": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.6", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^4.15.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.1.tgz", + "integrity": "sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.8.1.tgz", + "integrity": "sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", + "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.8.1.tgz", + "integrity": "sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.8.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-client-redirects": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.8.1.tgz", + "integrity": "sha512-F+86R7PBn6VNgy/Ux8w3ZRypJGJEzksbejQKlbTC8u6uhBUhfdXWkDp6qdOisIoW0buY5nLqucvZt1zNJzhJhA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.8.1.tgz", + "integrity": "sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "cheerio": "1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz", + "integrity": "sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz", + "integrity": "sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz", + "integrity": "sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz", + "integrity": "sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz", + "integrity": "sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.8.1.tgz", + "integrity": "sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.8.1.tgz", + "integrity": "sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.8.1.tgz", + "integrity": "sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.8.1.tgz", + "integrity": "sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.8.1.tgz", + "integrity": "sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/plugin-content-blog": "3.8.1", + "@docusaurus/plugin-content-docs": "3.8.1", + "@docusaurus/plugin-content-pages": "3.8.1", + "@docusaurus/plugin-css-cascade-layers": "3.8.1", + "@docusaurus/plugin-debug": "3.8.1", + "@docusaurus/plugin-google-analytics": "3.8.1", + "@docusaurus/plugin-google-gtag": "3.8.1", + "@docusaurus/plugin-google-tag-manager": "3.8.1", + "@docusaurus/plugin-sitemap": "3.8.1", + "@docusaurus/plugin-svgr": "3.8.1", + "@docusaurus/theme-classic": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/theme-search-algolia": "3.8.1", + "@docusaurus/types": "3.8.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/remark-plugin-npm2yarn": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/remark-plugin-npm2yarn/-/remark-plugin-npm2yarn-3.8.1.tgz", + "integrity": "sha512-lrws3n7jyJrDKqpdFiEX0ZIwVOgGj9z+ZXf0k/rXrftcNh06Y+cEMnNVoNpO3EJKiLDXmTWoxGf/I1qWb/WV6g==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "npm-to-yarn": "^3.0.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.8.1.tgz", + "integrity": "sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/plugin-content-blog": "3.8.1", + "@docusaurus/plugin-content-docs": "3.8.1", + "@docusaurus/plugin-content-pages": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/theme-translations": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.5.4", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.8.1.tgz", + "integrity": "sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-mermaid": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.8.1.tgz", + "integrity": "sha512-IWYqjyTPjkNnHsFFu9+4YkeXS7PD1xI3Bn2shOhBq+f95mgDfWInkpfBN4aYvx4fTT67Am6cPtohRdwh4Tidtg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "mermaid": ">=11.6.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.8.1.tgz", + "integrity": "sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ==", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.9.0", + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/plugin-content-docs": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/theme-translations": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "algoliasearch": "^5.17.1", + "algoliasearch-helper": "^3.22.6", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.8.1.tgz", + "integrity": "sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g==", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/tsconfig": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.8.1.tgz", + "integrity": "sha512-XBWCcqhRHhkhfolnSolNL+N7gj3HVE3CoZVqnVjfsMzCoOsuQw2iCLxVVHtO+rePUUfouVZHURDgmqIySsF66A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docusaurus/types": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.8.1.tgz", + "integrity": "sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.8.1.tgz", + "integrity": "sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "escape-string-regexp": "^4.0.0", + "execa": "5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.8.1.tgz", + "integrity": "sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.8.1.tgz", + "integrity": "sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@easyops-cn/autocomplete.js": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz", + "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "immediate": "^3.2.3" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.52.1.tgz", + "integrity": "sha512-pwfANjTLOQyAPc2Iz93WbG4OQM5C4COCWARbLAs79FIpIS38gHq3PrbDIX8f7oDhGQp1u6f8fr3K3u3+yZXZTA==", + "license": "MIT", + "dependencies": { + "@docusaurus/plugin-content-docs": "^2 || ^3", + "@docusaurus/theme-translations": "^2 || ^3", + "@docusaurus/utils": "^2 || ^3", + "@docusaurus/utils-common": "^2 || ^3", + "@docusaurus/utils-validation": "^2 || ^3", + "@easyops-cn/autocomplete.js": "^0.38.1", + "@node-rs/jieba": "^1.6.0", + "cheerio": "^1.0.0", + "clsx": "^2.1.1", + "comlink": "^4.4.2", + "debug": "^4.2.0", + "fs-extra": "^10.0.0", + "klaw-sync": "^6.0.0", + "lunr": "^2.3.9", + "lunr-languages": "^1.4.0", + "mark.js": "^8.11.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^2 || ^3", + "react": "^16.14.0 || ^17 || ^18 || ^19", + "react-dom": "^16.14.0 || 17 || ^18 || ^19" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/cheerio": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.0.tgz", + "integrity": "sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.10.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", + "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.0.0", + "@antfu/utils": "^8.1.0", + "@iconify/types": "^2.0.0", + "debug": "^4.4.0", + "globals": "^15.14.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "mlly": "^1.7.4" + } + }, + "node_modules/@iconify/utils/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.11.tgz", + "integrity": "sha512-C512c1ytBTio4MrpWKlJpyFHT6+qfFL8SZ58zBzJ1OOzUEjHeF1BtjY2fH7n4x/g2OV/KiiMLAivOp1DXmiMMw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.9.tgz", + "integrity": "sha512-amBU75CKOOkcQLfyM6J+DnWwz41yTsWI7o8MQ003LwUIWb4NYX/evAblTx1oBBYJySqL/zHPxHXDw5ewpQaUFw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.3.tgz", + "integrity": "sha512-AiR5uKpFxP3PjO4R19kQGIMwxyRyPuXmKEEy301V1C0+1rVjS94EZQXf1QKZYN8Q0YM+estSPhmx5JwNftv6nw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.28", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.28.tgz", + "integrity": "sha512-KNNHHwW3EIp4EDYOvYFGyIFfx36R2dNJYH4knnZlF8T5jdbD5Wx8xmSaQ2gP9URkJ04LGEtlcCtwArKcmFcwKw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", + "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", + "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.2.tgz", + "integrity": "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==", + "license": "MIT", + "dependencies": { + "langium": "3.3.1" + } + }, + "node_modules/@node-rs/jieba": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.10.4.tgz", + "integrity": "sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@node-rs/jieba-android-arm-eabi": "1.10.4", + "@node-rs/jieba-android-arm64": "1.10.4", + "@node-rs/jieba-darwin-arm64": "1.10.4", + "@node-rs/jieba-darwin-x64": "1.10.4", + "@node-rs/jieba-freebsd-x64": "1.10.4", + "@node-rs/jieba-linux-arm-gnueabihf": "1.10.4", + "@node-rs/jieba-linux-arm64-gnu": "1.10.4", + "@node-rs/jieba-linux-arm64-musl": "1.10.4", + "@node-rs/jieba-linux-x64-gnu": "1.10.4", + "@node-rs/jieba-linux-x64-musl": "1.10.4", + "@node-rs/jieba-wasm32-wasi": "1.10.4", + "@node-rs/jieba-win32-arm64-msvc": "1.10.4", + "@node-rs/jieba-win32-ia32-msvc": "1.10.4", + "@node-rs/jieba-win32-x64-msvc": "1.10.4" + } + }, + "node_modules/@node-rs/jieba-darwin-arm64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.4.tgz", + "integrity": "sha512-G++RYEJ2jo0rxF9626KUy90wp06TRUjAsvY/BrIzEOX/ingQYV/HjwQzNPRR1P1o32a6/U8RGo7zEBhfdybL6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.8.tgz", + "integrity": "sha512-WytNrFSgWO/esSH9NbpWUfTMGQwCGIKfCmNlmFDNiI5gGhgMmEA+V1AEvKLeBNvvtBnailJtkrEa2OIISwrVAA==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.8.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", + "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.30.0.tgz", + "integrity": "sha512-ILSdPX4je0n5WUKD34TMe57/eqiXUzCIjAsdtLQYhomqOjTtFUg1s6dE7kUegc4Mc43Xr7IXYlMutU9HPiYfdw==", + "license": "MIT", + "dependencies": { + "@algolia/client-abtesting": "5.30.0", + "@algolia/client-analytics": "5.30.0", + "@algolia/client-common": "5.30.0", + "@algolia/client-insights": "5.30.0", + "@algolia/client-personalization": "5.30.0", + "@algolia/client-query-suggestions": "5.30.0", + "@algolia/client-search": "5.30.0", + "@algolia/ingestion": "1.30.0", + "@algolia/monitoring": "1.30.0", + "@algolia/recommend": "5.30.0", + "@algolia/requester-browser-xhr": "5.30.0", + "@algolia/requester-fetch": "5.30.0", + "@algolia/requester-node-http": "5.30.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz", + "integrity": "sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw==", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001726", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", + "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "license": "Apache-2.0" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.43.0.tgz", + "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", + "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.43.0.tgz", + "integrity": "sha512-i/AgxU2+A+BbJdMxh3v7/vxi2SbFqxiFmg6VsDwYB4jkucrd1BZNA9a9gphC0fYMG5IBSgQcbQnk865VCLe7xA==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz", + "integrity": "sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.3.1.tgz", + "integrity": "sha512-XnDRQMXucLueX92yDe0LPKupXetWoFOgawr4O4X41l5TltgK2NVbJJVDnnOywDYfW1sTJ28AcXGKOqdRKwCcmQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.32.1.tgz", + "integrity": "sha512-dbeqFTLYEwlFg7UGtcZhCCG/2WayX72zK3Sq323CEX29CY81tYfVhw1MIdduCtpstB0cTOhJswWlM/OEB3Xp+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", + "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", + "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.178", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.178.tgz", + "integrity": "sha512-wObbz/ar3Bc6e4X5vf0iO8xTN8YAjN/tgiAOJLr7yjYFtP9wAjq8Mb5h0yn6kResir+VYx2DXBj9NNobs0ETSA==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.4.0.tgz", + "integrity": "sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", + "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/katex": { + "version": "0.16.22", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" + }, + "node_modules/langium": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "license": "MIT", + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/local-pkg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz", + "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.0.1", + "quansync": "^0.2.8" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "license": "MIT" + }, + "node_modules/lunr-languages": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.14.0.tgz", + "integrity": "sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA==", + "license": "MPL-1.1" + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "license": "MIT" + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.1.1.tgz", + "integrity": "sha512-ij/2lXfCRT71L6u0M29tJPhP0bM5shLL3u5BePhFwPELj2blMJ6GDtD7PfJhRLhJ/c2UwrK17ySVcDzy2YHjHQ==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.9.0.tgz", + "integrity": "sha512-YdPXn9slEwO0omQfQIsW6vS84weVQftIyyTGAZCwM//MGhPzL1+l6vO6bkf0wnP4tHigH1alZ5Ooy3HXI2gOag==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.0.4", + "@iconify/utils": "^2.1.33", + "@mermaid-js/parser": "^0.6.2", + "@types/d3": "^7.4.3", + "cytoscape": "^3.29.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.11", + "dayjs": "^1.11.13", + "dompurify": "^3.2.5", + "katex": "^0.16.22", + "khroma": "^2.1.0", + "lodash-es": "^4.17.21", + "marked": "^16.0.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/mermaid/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mlly": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.2.tgz", + "integrity": "sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-to-yarn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-to-yarn/-/npm-to-yarn-3.0.1.tgz", + "integrity": "sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/nebrelbug/npm-to-yarn?sponsor=1" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "license": "MIT" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.2.0.tgz", + "integrity": "sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.10.tgz", + "integrity": "sha512-k9qX+aXHBiLTRrWoCJuUFI6F1iF6QJQUXNVWJVSbqZgj57jDhBlOvD8gNUGl35tgqDivbGLhZeW3Ongz4feuKA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.2.tgz", + "integrity": "sha512-7qTqnL7nfLRyJK/AHSVrrXOuvDDzettC+wGoienURV8v2svNbu6zJC52ruZtHaO6mfcagFmuTGFdzRsJKB3k5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.10.tgz", + "integrity": "sha512-tqs6TCEv9tC1Riq6fOzHuHcZyhg4k3gIAMB8GGY/zA1ssGdm6puHMVE7t75aOSoFg7UD2wyrFFhbldiCMyyFTQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.4.tgz", + "integrity": "sha512-q+lXgqmTMdB0Ty+EQ31SuodhdfZetUlwCA/F0zRcd/XdxjzI+Rl2JhZNz5US2n/7t9ePsvuhCnEN4Bmu86zXlA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.10", + "@csstools/postcss-color-mix-function": "^3.0.10", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.0", + "@csstools/postcss-content-alt-text": "^2.0.6", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.10", + "@csstools/postcss-gradients-interpolation-method": "^5.0.10", + "@csstools/postcss-hwb-function": "^4.0.10", + "@csstools/postcss-ic-unit": "^4.0.2", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.9", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.10", + "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.10", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-text-decoration-shorthand": "^4.0.2", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.21", + "browserslist": "^4.25.0", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.2", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.3.0", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.10", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.2", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.10", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quansync": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", + "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.1" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.4.1.tgz", + "integrity": "sha512-fwFYknRIBxjbFm0kBDrzgBy1xa5tDg2LyXXBepC5f1b+MY3BUClMCsvanMPn089JbV1Eg3nZcrp0VCuH43aXnA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", + "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", + "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", + "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", + "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.9" + } + }, + "node_modules/style-to-object": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.11.0.tgz", + "integrity": "sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT" + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.99.9", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", + "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpackbar": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", + "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "consola": "^3.2.3", + "figures": "^3.2.0", + "markdown-table": "^2.0.0", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/webpackbar/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/webpackbar/node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "license": "MIT", + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpackbar/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } } diff --git a/site/package.json b/site/package.json index 6472c80a..83fa222b 100644 --- a/site/package.json +++ b/site/package.json @@ -1,50 +1,50 @@ { - "name": "site", - "version": "0.0.0", - "private": true, - "scripts": { - "docusaurus": "docusaurus", - "start": "docusaurus start", - "build": "docusaurus build", - "version": "node scripts/cut-version.js", - "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", - "clear": "docusaurus clear", - "serve": "docusaurus serve", - "typecheck": "tsc" - }, - "dependencies": { - "@docusaurus/core": "^3.8.1", - "@docusaurus/plugin-client-redirects": "^3.8.1", - "@docusaurus/preset-classic": "^3.8.1", - "@docusaurus/remark-plugin-npm2yarn": "^3.8.1", - "@docusaurus/theme-mermaid": "^3.8.1", - "@easyops-cn/docusaurus-search-local": "^0.52.1", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "prism-react-renderer": "^2.3.0", - "react": "^19.1.1", - "react-dom": "^19.1.1" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "^3.8.1", - "@docusaurus/tsconfig": "^3.8.1", - "@docusaurus/types": "^3.8.1", - "typescript": "^5.9.2" - }, - "browserslist": { - "production": [ - ">0.5%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 3 chrome version", - "last 3 firefox version", - "last 5 safari version" - ] - }, - "engines": { - "node": ">=18.0" - } + "name": "site", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "version": "node scripts/cut-version.js", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "typecheck": "tsc" + }, + "dependencies": { + "@docusaurus/core": "^3.8.1", + "@docusaurus/plugin-client-redirects": "^3.8.1", + "@docusaurus/preset-classic": "^3.8.1", + "@docusaurus/remark-plugin-npm2yarn": "^3.8.1", + "@docusaurus/theme-mermaid": "^3.8.1", + "@easyops-cn/docusaurus-search-local": "^0.52.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.8.1", + "@docusaurus/tsconfig": "^3.8.1", + "@docusaurus/types": "^3.8.1", + "typescript": "^5.9.2" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=18.0" + } } diff --git a/site/redirects.ts b/site/redirects.ts index 1749c7ee..8ad174dc 100644 --- a/site/redirects.ts +++ b/site/redirects.ts @@ -13,11 +13,14 @@ export function generateRedirects(basePath: string): RedirectRule[] { // If basePath is just '/', return path as-is to avoid double slashes return basePath === '/' ? path : `${basePath}${path}`; }; - + return [ // Operations API - { from: withBase('/developers/operations-api/utilities'), to: withBase('/developers/operations-api/system-operations') }, - + { + from: withBase('/developers/operations-api/utilities'), + to: withBase('/developers/operations-api/system-operations'), + }, + // Installation paths { from: withBase('/install-harperdb'), to: withBase('/deployments/install-harper/') }, { from: withBase('/install-harperdb/linux'), to: withBase('/deployments/install-harper/linux') }, @@ -30,54 +33,99 @@ export function generateRedirects(basePath: string): RedirectRule[] { { from: withBase('/install-harperdb/node-ver-requirement'), to: withBase('/deployments/install-harper/') }, { from: withBase('/deployments/install-harperdb'), to: withBase('/deployments/install-harper/') }, { from: withBase('/deployments/install-harperdb/linux'), to: withBase('/deployments/install-harper/linux') }, - + // Harper Studio (old HarperDB Studio paths) { from: withBase('/harperdb-studio'), to: withBase('/administration/harper-studio/') }, { from: withBase('/harperdb-studio/create-account'), to: withBase('/administration/harper-studio/create-account') }, - { from: withBase('/harperdb-studio/login-password-reset'), to: withBase('/administration/harper-studio/login-password-reset') }, - { from: [withBase('/harperdb-studio/resources'), withBase('/administration/harper-studio/resources')], to: withBase('/administration/harper-studio/') }, + { + from: withBase('/harperdb-studio/login-password-reset'), + to: withBase('/administration/harper-studio/login-password-reset'), + }, + { + from: [withBase('/harperdb-studio/resources'), withBase('/administration/harper-studio/resources')], + to: withBase('/administration/harper-studio/'), + }, { from: withBase('/harperdb-studio/organizations'), to: withBase('/administration/harper-studio/organizations') }, { from: withBase('/harperdb-studio/instances'), to: withBase('/administration/harper-studio/instances') }, - { from: withBase('/harperdb-studio/query-instance-data'), to: withBase('/administration/harper-studio/query-instance-data') }, - { from: withBase('/harperdb-studio/manage-schemas-browse-data'), to: withBase('/administration/harper-studio/manage-databases-browse-data') }, - { from: [withBase('/harperdb-studio/manage-charts'), withBase('/administration/harper-studio/manage-charts')], to: withBase('/administration/harper-studio/query-instance-data') }, - { from: withBase('/harperdb-studio/manage-clustering'), to: withBase('/administration/harper-studio/manage-replication') }, - { from: withBase('/harperdb-studio/manage-instance-users'), to: withBase('/administration/harper-studio/manage-instance-users') }, - { from: withBase('/harperdb-studio/manage-instance-roles'), to: withBase('/administration/harper-studio/manage-instance-users') }, - { from: withBase('/harperdb-studio/manage-functions'), to: withBase('/administration/harper-studio/manage-applications') }, - { from: withBase('/harperdb-studio/instance-metrics'), to: withBase('/administration/harper-studio/instance-metrics') }, - { from: withBase('/harperdb-studio/instance-configuration'), to: withBase('/administration/harper-studio/instance-configuration') }, - { from: withBase('/harperdb-studio/enable-mixed-content'), to: withBase('/administration/harper-studio/enable-mixed-content') }, - + { + from: withBase('/harperdb-studio/query-instance-data'), + to: withBase('/administration/harper-studio/query-instance-data'), + }, + { + from: withBase('/harperdb-studio/manage-schemas-browse-data'), + to: withBase('/administration/harper-studio/manage-databases-browse-data'), + }, + { + from: [withBase('/harperdb-studio/manage-charts'), withBase('/administration/harper-studio/manage-charts')], + to: withBase('/administration/harper-studio/query-instance-data'), + }, + { + from: withBase('/harperdb-studio/manage-clustering'), + to: withBase('/administration/harper-studio/manage-replication'), + }, + { + from: withBase('/harperdb-studio/manage-instance-users'), + to: withBase('/administration/harper-studio/manage-instance-users'), + }, + { + from: withBase('/harperdb-studio/manage-instance-roles'), + to: withBase('/administration/harper-studio/manage-instance-users'), + }, + { + from: withBase('/harperdb-studio/manage-functions'), + to: withBase('/administration/harper-studio/manage-applications'), + }, + { + from: withBase('/harperdb-studio/instance-metrics'), + to: withBase('/administration/harper-studio/instance-metrics'), + }, + { + from: withBase('/harperdb-studio/instance-configuration'), + to: withBase('/administration/harper-studio/instance-configuration'), + }, + { + from: withBase('/harperdb-studio/enable-mixed-content'), + to: withBase('/administration/harper-studio/enable-mixed-content'), + }, + // Harper Cloud (old HarperDB Cloud paths) { from: withBase('/harperdb-cloud'), to: withBase('/deployments/harper-cloud/') }, - + // Security { from: withBase('/security'), to: withBase('/developers/security/') }, { from: withBase('/security/jwt-auth'), to: withBase('/developers/security/jwt-auth') }, { from: withBase('/security/basic-auth'), to: withBase('/developers/security/basic-auth') }, { from: withBase('/security/configuration'), to: withBase('/developers/security/configuration') }, { from: withBase('/security/users-and-roles'), to: withBase('/developers/security/users-and-roles') }, - + // Custom Functions → Applications { from: withBase('/custom-functions'), to: withBase('/developers/applications/') }, { from: withBase('/custom-functions/define-routes'), to: withBase('/developers/applications/define-routes') }, - { from: [withBase('/custom-functions/using-npm-git'), withBase('/developers/custom-functions/create-project')], to: withBase('/developers/applications/') }, + { + from: [withBase('/custom-functions/using-npm-git'), withBase('/developers/custom-functions/create-project')], + to: withBase('/developers/applications/'), + }, { from: withBase('/custom-functions/custom-functions-operations'), to: withBase('/developers/operations-api/') }, - { from: withBase('/custom-functions/debugging-custom-function'), to: withBase('/developers/applications/debugging') }, + { + from: withBase('/custom-functions/debugging-custom-function'), + to: withBase('/developers/applications/debugging'), + }, { from: withBase('/custom-functions/example-projects'), to: withBase('/developers/applications/example-projects') }, - + // Add-ons and SDKs { from: withBase('/add-ons-and-sdks'), to: withBase('/developers/applications/') }, - { from: withBase('/add-ons-and-sdks/google-data-studio'), to: withBase('/developers/miscellaneous/google-data-studio') }, - + { + from: withBase('/add-ons-and-sdks/google-data-studio'), + to: withBase('/developers/miscellaneous/google-data-studio'), + }, + // SQL Guide { from: withBase('/sql-guide'), to: withBase('/developers/sql-guide/') }, - + // CLI { from: withBase('/harperdb-cli'), to: withBase('/deployments/harper-cli') }, { from: withBase('/deployments/harperdb-cli'), to: withBase('/deployments/harper-cli') }, - + // Top-level paths { from: withBase('/configuration'), to: withBase('/deployments/configuration') }, { from: withBase('/logging'), to: withBase('/administration/logging/standard-logging') }, @@ -89,7 +137,7 @@ export function generateRedirects(basePath: string): RedirectRule[] { { from: withBase('/operations-api'), to: withBase('/developers/operations-api/') }, { from: withBase('/rest'), to: withBase('/developers/rest') }, { from: withBase('/api'), to: withBase('/developers/operations-api/') }, - + // File rename redirect { from: withBase('/administration/logging/logging'), to: withBase('/administration/logging/standard-logging') }, ]; @@ -102,25 +150,33 @@ export const redirects = generateRedirects(''); // This handles dynamic redirects for paths not explicitly defined in the main redirect list export function createRedirects(existingPath: string, basePath: string = ''): string[] | undefined { const redirects: string[] = []; - + // Only create wildcard redirects for paths that aren't already explicitly defined // Check if this is a path we handle with wildcard redirects - + // Harper Studio - only for subpaths not already defined if (existingPath.startsWith(`${basePath}/administration/harper-studio/`)) { const subpath = existingPath.replace(`${basePath}/administration/harper-studio/`, ''); // Skip paths that are already explicitly redirected const explicitStudioPaths = [ - 'create-account', 'login-password-reset', 'organizations', 'instances', - 'query-instance-data', 'manage-databases-browse-data', 'manage-replication', - 'manage-instance-users', 'manage-applications', 'instance-metrics', - 'instance-configuration', 'enable-mixed-content' + 'create-account', + 'login-password-reset', + 'organizations', + 'instances', + 'query-instance-data', + 'manage-databases-browse-data', + 'manage-replication', + 'manage-instance-users', + 'manage-applications', + 'instance-metrics', + 'instance-configuration', + 'enable-mixed-content', ]; if (subpath && !explicitStudioPaths.includes(subpath)) { redirects.push(`${basePath}/administration/harperdb-studio/${subpath}`); } } - + // Harper Cloud - only for subpaths not already defined if (existingPath.startsWith(`${basePath}/deployments/harper-cloud/`)) { const subpath = existingPath.replace(`${basePath}/deployments/harper-cloud/`, ''); @@ -129,7 +185,7 @@ export function createRedirects(existingPath: string, basePath: string = ''): st redirects.push(`${basePath}/deployments/harperdb-cloud/${subpath}`); } } - + // Install Harper - only for subpaths not already defined if (existingPath.startsWith(`${basePath}/deployments/install-harper/`)) { const subpath = existingPath.replace(`${basePath}/deployments/install-harper/`, ''); @@ -138,7 +194,7 @@ export function createRedirects(existingPath: string, basePath: string = ''): st redirects.push(`${basePath}/deployments/install-harperdb/${subpath}`); } } - + // Custom Functions - handle subpaths if (existingPath.startsWith(`${basePath}/developers/custom-functions/`)) { const subpath = existingPath.replace(`${basePath}/developers/custom-functions/`, ''); @@ -148,13 +204,13 @@ export function createRedirects(existingPath: string, basePath: string = ''): st redirects.push(`${basePath}/custom-functions/${subpath}`); } } - + // Don't create wildcard redirects for these as they're all explicitly defined: // - /developers/security/* (all subpaths are explicit) // - /deployments/harper-cli (explicit) // - /developers/sql-guide/* (has explicit redirect) // - /developers/operations-api/* (has explicit redirects) // - /technical-details/reference/* (has explicit redirect) - + return redirects.length > 0 ? redirects : undefined; -} \ No newline at end of file +} diff --git a/site/scripts/cut-version.js b/site/scripts/cut-version.js index b736bc43..782b1858 100644 --- a/site/scripts/cut-version.js +++ b/site/scripts/cut-version.js @@ -3,7 +3,7 @@ /** * Script to cut a new version from the repository's /docs directory * This is used for creating new versions (4.7+) after the GitBook migration - * + * * Usage: npm run version * Example: npm run version 4.7 */ @@ -19,99 +19,98 @@ const REPO_DOCS = path.join(REPO_ROOT, 'docs'); const SITE_DOCS = path.join(SITE_DIR, 'docs'); function copyDirectory(src, dest) { - // Create destination directory - fs.mkdirSync(dest, { recursive: true }); - - // Read all items in source directory - const items = fs.readdirSync(src, { withFileTypes: true }); - - for (const item of items) { - const srcPath = path.join(src, item.name); - const destPath = path.join(dest, item.name); - - if (item.isDirectory()) { - // Recursively copy subdirectories - copyDirectory(srcPath, destPath); - } else { - // Copy file - fs.copyFileSync(srcPath, destPath); - } - } + // Create destination directory + fs.mkdirSync(dest, { recursive: true }); + + // Read all items in source directory + const items = fs.readdirSync(src, { withFileTypes: true }); + + for (const item of items) { + const srcPath = path.join(src, item.name); + const destPath = path.join(dest, item.name); + + if (item.isDirectory()) { + // Recursively copy subdirectories + copyDirectory(srcPath, destPath); + } else { + // Copy file + fs.copyFileSync(srcPath, destPath); + } + } } function removeDirectory(dir) { - if (fs.existsSync(dir)) { - fs.rmSync(dir, { recursive: true, force: true }); - } + if (fs.existsSync(dir)) { + fs.rmSync(dir, { recursive: true, force: true }); + } } function main() { - const version = process.argv[2]; - - if (!version) { - console.error('Usage: npm run version '); - console.error('Example: npm run version 4.7'); - process.exit(1); - } - - // Validate version format - if (!/^\d+\.\d+$/.test(version)) { - console.error(`Error: Invalid version format "${version}". Expected format: X.Y (e.g., 4.7)`); - process.exit(1); - } - - console.log(`\nCutting version ${version} from repository docs...`); - - // Check if repo docs exist - if (!fs.existsSync(REPO_DOCS)) { - console.error(`Error: Repository docs not found at ${REPO_DOCS}`); - console.error('After migration, the repository /docs directory should contain vNext documentation.'); - process.exit(1); - } - - // Remove existing site/docs if it exists (it's just a build-time copy) - if (fs.existsSync(SITE_DOCS)) { - console.log('Removing existing site/docs (build-time copy)...'); - removeDirectory(SITE_DOCS); - } - - try { - // Copy repo docs to site docs - console.log('Copying repository docs to site/docs...'); - copyDirectory(REPO_DOCS, SITE_DOCS); - - // Run Docusaurus version command - console.log(`\nRunning Docusaurus version command for ${version}...`); - execSync(`npm run docusaurus docs:version ${version}`, { - cwd: SITE_DIR, - stdio: 'inherit' - }); - - console.log(`\n✅ Successfully created version ${version}`); - console.log(` - Versioned docs created at: versioned_docs/version-${version}/`); - console.log(` - Version added to versions.json`); - - // Clean up - remove the temporary site/docs (it's in .gitignore anyway) - console.log('\nCleaning up temporary site/docs...'); - removeDirectory(SITE_DOCS); - - console.log('\n🎉 Version creation complete!'); - console.log('\nNext steps:'); - console.log('1. Create a PR with the new versioned docs and updated versions.json'); - console.log('2. Site will deploy automatically when PR is merged'); - console.log(`\nNote: Version ${version} is now the latest and will be synced to site/docs during build`); - - } catch (error) { - console.error('\n❌ Error creating version:', error.message || error); - - // Clean up on error - if (fs.existsSync(SITE_DOCS)) { - console.log('Cleaning up temporary site/docs...'); - removeDirectory(SITE_DOCS); - } - - process.exit(1); - } + const version = process.argv[2]; + + if (!version) { + console.error('Usage: npm run version '); + console.error('Example: npm run version 4.7'); + process.exit(1); + } + + // Validate version format + if (!/^\d+\.\d+$/.test(version)) { + console.error(`Error: Invalid version format "${version}". Expected format: X.Y (e.g., 4.7)`); + process.exit(1); + } + + console.log(`\nCutting version ${version} from repository docs...`); + + // Check if repo docs exist + if (!fs.existsSync(REPO_DOCS)) { + console.error(`Error: Repository docs not found at ${REPO_DOCS}`); + console.error('After migration, the repository /docs directory should contain vNext documentation.'); + process.exit(1); + } + + // Remove existing site/docs if it exists (it's just a build-time copy) + if (fs.existsSync(SITE_DOCS)) { + console.log('Removing existing site/docs (build-time copy)...'); + removeDirectory(SITE_DOCS); + } + + try { + // Copy repo docs to site docs + console.log('Copying repository docs to site/docs...'); + copyDirectory(REPO_DOCS, SITE_DOCS); + + // Run Docusaurus version command + console.log(`\nRunning Docusaurus version command for ${version}...`); + execSync(`npm run docusaurus docs:version ${version}`, { + cwd: SITE_DIR, + stdio: 'inherit', + }); + + console.log(`\n✅ Successfully created version ${version}`); + console.log(` - Versioned docs created at: versioned_docs/version-${version}/`); + console.log(` - Version added to versions.json`); + + // Clean up - remove the temporary site/docs (it's in .gitignore anyway) + console.log('\nCleaning up temporary site/docs...'); + removeDirectory(SITE_DOCS); + + console.log('\n🎉 Version creation complete!'); + console.log('\nNext steps:'); + console.log('1. Create a PR with the new versioned docs and updated versions.json'); + console.log('2. Site will deploy automatically when PR is merged'); + console.log(`\nNote: Version ${version} is now the latest and will be synced to site/docs during build`); + } catch (error) { + console.error('\n❌ Error creating version:', error.message || error); + + // Clean up on error + if (fs.existsSync(SITE_DOCS)) { + console.log('Cleaning up temporary site/docs...'); + removeDirectory(SITE_DOCS); + } + + process.exit(1); + } } -main(); \ No newline at end of file +main(); diff --git a/site/sidebars.ts b/site/sidebars.ts index 80c935b5..037801f6 100644 --- a/site/sidebars.ts +++ b/site/sidebars.ts @@ -1,44 +1,44 @@ -import type {SidebarsConfig} from '@docusaurus/plugin-content-docs'; +import type { SidebarsConfig } from '@docusaurus/plugin-content-docs'; const sidebars: SidebarsConfig = { - docsSidebar: [ - { - type: 'doc', - id: 'index', - label: 'Harper Docs', - }, - { - type: 'category', - label: 'Getting Started', - items: [{type: 'autogenerated', dirName: 'getting-started'}], - }, - { - type: 'category', - label: 'Developers', - link: { - type: 'generated-index', - title: 'Developer Documentation', - description: 'Comprehensive guides and references for building applications with HarperDB', - keywords: ['developers', 'api', 'applications'] - }, - items: [{type: 'autogenerated', dirName: 'developers'}], - }, - { - type: 'category', - label: 'Administration', - items: [{type: 'autogenerated', dirName: 'administration'}], - }, - { - type: 'category', - label: 'Deployments', - items: [{type: 'autogenerated', dirName: 'deployments'}], - }, - { - type: 'category', - label: 'Technical Details', - items: [{type: 'autogenerated', dirName: 'technical-details'}], - }, - ], + docsSidebar: [ + { + type: 'doc', + id: 'index', + label: 'Harper Docs', + }, + { + type: 'category', + label: 'Getting Started', + items: [{ type: 'autogenerated', dirName: 'getting-started' }], + }, + { + type: 'category', + label: 'Developers', + link: { + type: 'generated-index', + title: 'Developer Documentation', + description: 'Comprehensive guides and references for building applications with HarperDB', + keywords: ['developers', 'api', 'applications'], + }, + items: [{ type: 'autogenerated', dirName: 'developers' }], + }, + { + type: 'category', + label: 'Administration', + items: [{ type: 'autogenerated', dirName: 'administration' }], + }, + { + type: 'category', + label: 'Deployments', + items: [{ type: 'autogenerated', dirName: 'deployments' }], + }, + { + type: 'category', + label: 'Technical Details', + items: [{ type: 'autogenerated', dirName: 'technical-details' }], + }, + ], }; -export default sidebars; \ No newline at end of file +export default sidebars; diff --git a/site/src/pages/index.module.css b/site/src/pages/index.module.css index 9f71a5da..d7160c1b 100644 --- a/site/src/pages/index.module.css +++ b/site/src/pages/index.module.css @@ -4,20 +4,20 @@ */ .heroBanner { - padding: 4rem 0; - text-align: center; - position: relative; - overflow: hidden; + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; } @media screen and (max-width: 996px) { - .heroBanner { - padding: 2rem; - } + .heroBanner { + padding: 2rem; + } } .buttons { - display: flex; - align-items: center; - justify-content: center; + display: flex; + align-items: center; + justify-content: center; } diff --git a/site/src/pages/index.tsx b/site/src/pages/index.tsx index 71c03967..0ea58134 100644 --- a/site/src/pages/index.tsx +++ b/site/src/pages/index.tsx @@ -3,10 +3,10 @@ import { Redirect } from '@docusaurus/router'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; export default function Home(): JSX.Element { - const { siteConfig } = useDocusaurusContext(); - // Get the routeBasePath from the docs preset config - const docsPath = siteConfig?.presets?.[0]?.[1]?.docs?.routeBasePath || '/docs'; - - // Redirect to the configured docs path - return ; -} \ No newline at end of file + const { siteConfig } = useDocusaurusContext(); + // Get the routeBasePath from the docs preset config + const docsPath = siteConfig?.presets?.[0]?.[1]?.docs?.routeBasePath || '/docs'; + + // Redirect to the configured docs path + return ; +} diff --git a/site/tsconfig.json b/site/tsconfig.json index 920d7a65..712d200a 100644 --- a/site/tsconfig.json +++ b/site/tsconfig.json @@ -1,8 +1,8 @@ { - // This file is not used in compilation. It is here just for a nice editor experience. - "extends": "@docusaurus/tsconfig", - "compilerOptions": { - "baseUrl": "." - }, - "exclude": [".docusaurus", "build"] + // This file is not used in compilation. It is here just for a nice editor experience. + "extends": "@docusaurus/tsconfig", + "compilerOptions": { + "baseUrl": "." + }, + "exclude": [".docusaurus", "build"] } diff --git a/site/versioned_docs/version-4.1/add-ons-and-sdks/google-data-studio.md b/site/versioned_docs/version-4.1/add-ons-and-sdks/google-data-studio.md index 239b3e0c..aeb7c013 100644 --- a/site/versioned_docs/version-4.1/add-ons-and-sdks/google-data-studio.md +++ b/site/versioned_docs/version-4.1/add-ons-and-sdks/google-data-studio.md @@ -17,21 +17,21 @@ The HarperDB database must be accessible through the Internet in order for Googl Get started by selecting the HarperDB connector from the [Google Data Studio Partner Connector Gallery](https://datastudio.google.com/u/0/datasources/create). 1. Log in to [https://datastudio.google.com/](https://datastudio.google.com/). -1. Add a new Data Source using the HarperDB connector. The current release version can be added as a data source by following this link: [HarperDB Google Data Studio Connector](https://datastudio.google.com/datasources/create?connectorId=AKfycbxBKgF8FI5R42WVxO-QCOq7dmUys0HJrUJMkBQRoGnCasY60\_VJeO3BhHJPvdd20-S76g). +1. Add a new Data Source using the HarperDB connector. The current release version can be added as a data source by following this link: [HarperDB Google Data Studio Connector](https://datastudio.google.com/datasources/create?connectorId=AKfycbxBKgF8FI5R42WVxO-QCOq7dmUys0HJrUJMkBQRoGnCasY60_VJeO3BhHJPvdd20-S76g). 1. Authorize the connector to access other servers on your behalf (this allows the connector to contact your database). 1. Enter the Web URL to access your database (preferably with HTTPS), as well as the Basic Auth key you use to access the database. Just include the key, not the word “Basic” at the start of it. 1. Check the box for “Secure Connections Only” if you want to always use HTTPS connections for this data source; entering a Web URL that starts with https:// will do the same thing, if you prefer. 1. Check the box for “Allow Bad Certs” if your HarperDB instance does not have a valid SSL certificate. HarperDB Cloud always has valid certificates, and so will never require this to be checked. Instances you set up yourself may require this, if you are using self-signed certs. If you are using HarperDB Cloud or another instance you know should always have valid SSL certificates, do not check this box. 1. Choose your Query Type. This determines what information the configuration will ask for after pressing the Next button. - * Table will ask you for a Schema and a Table to return all fields of using `SELECT *`. - * SQL will ask you for the SQL query you’re using to retrieve fields from the database. You may `JOIN` multiple tables together, and use HarperDB specific SQL functions, along with the usual power SQL grants. + - Table will ask you for a Schema and a Table to return all fields of using `SELECT *`. + - SQL will ask you for the SQL query you’re using to retrieve fields from the database. You may `JOIN` multiple tables together, and use HarperDB specific SQL functions, along with the usual power SQL grants. 1. When all information is entered correctly, press the Connect button in the top right of the new Data Source view to generate the Schema. You may also want to name the data source at this point. If the connector encounters any errors, a dialog box will tell you what went wrong so you can correct the issue. 1. If there are no errors, you now have a data source you can use in your reports! You may change the types of the generated fields in the Schema view if you need to (for instance, changing a Number field to a specific currency), as well as creating new fields from the report view that do calculations on other fields. ## Considerations -* Both Postman and the [HarperDB Studio](../harperdb-studio/) app have ways to convert a user:password pair to a Basic Auth token. Use either to create the token for the connector’s user. - * You may sign out of your current user by going to the instances tab in HarperDB Studio, then clicking on the lock icon at the top-right of a given instance’s box. Click the lock again to sign in as any user. The Basic Auth token will be visible in the Authorization header portion of any code created in the Sample Code tab. -* It’s highly recommended that you create a read-only user role in HarperDB Studio, and create a user with that role for your data sources to use. This prevents that authorization token from being used to alter your database, should someone else ever get ahold of it. -* The RecordCount field is intended for use as a metric, for counting how many instances of a given set of values appear in a report’s data set. -* _Do not attempt to create fields with spaces in their names_ for any data sources! Google Data Studio will crash when attempting to retrieve a field with such a name, producing a System Error instead of a useful chart on your reports. Using CamelCase or snake\_case gets around this. +- Both Postman and the [HarperDB Studio](../harperdb-studio/) app have ways to convert a user:password pair to a Basic Auth token. Use either to create the token for the connector’s user. + - You may sign out of your current user by going to the instances tab in HarperDB Studio, then clicking on the lock icon at the top-right of a given instance’s box. Click the lock again to sign in as any user. The Basic Auth token will be visible in the Authorization header portion of any code created in the Sample Code tab. +- It’s highly recommended that you create a read-only user role in HarperDB Studio, and create a user with that role for your data sources to use. This prevents that authorization token from being used to alter your database, should someone else ever get ahold of it. +- The RecordCount field is intended for use as a metric, for counting how many instances of a given set of values appear in a report’s data set. +- _Do not attempt to create fields with spaces in their names_ for any data sources! Google Data Studio will crash when attempting to retrieve a field with such a name, producing a System Error instead of a useful chart on your reports. Using CamelCase or snake_case gets around this. diff --git a/site/versioned_docs/version-4.1/add-ons-and-sdks/index.md b/site/versioned_docs/version-4.1/add-ons-and-sdks/index.md index db3eca55..49c3d88a 100644 --- a/site/versioned_docs/version-4.1/add-ons-and-sdks/index.md +++ b/site/versioned_docs/version-4.1/add-ons-and-sdks/index.md @@ -4,4 +4,4 @@ title: Add-ons & SDKs # Add-ons & SDKs -All HarperDB Add-Ons and SDKs can be found in the [HarperDB Marketplace](../harperdb-studio/resources#harperdb-marketplace) located in the [HarperDB Studio](../harperdb-studio/resources). \ No newline at end of file +All HarperDB Add-Ons and SDKs can be found in the [HarperDB Marketplace](../harperdb-studio/resources#harperdb-marketplace) located in the [HarperDB Studio](../harperdb-studio/resources). diff --git a/site/versioned_docs/version-4.1/audit-logging.md b/site/versioned_docs/version-4.1/audit-logging.md index 4ad2ce66..010215e2 100644 --- a/site/versioned_docs/version-4.1/audit-logging.md +++ b/site/versioned_docs/version-4.1/audit-logging.md @@ -18,20 +18,19 @@ The `read_audit_log` operation is flexible, enabling users to query with many pa ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "timestamp", - "search_values": [ - 1660585740558 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "timestamp", + "search_values": [1660585740558] } ``` There are three outcomes using timestamp. -* `"search_values": []` - All records returned for specified table -* `"search_values": [1660585740558]` - All records after provided timestamp -* `"search_values": [1660585740558, 1760585759710]` - Records "from" and "to" provided timestamp + +- `"search_values": []` - All records returned for specified table +- `"search_values": [1660585740558]` - All records after provided timestamp +- `"search_values": [1660585740558, 1760585759710]` - Records "from" and "to" provided timestamp --- @@ -39,13 +38,11 @@ There are three outcomes using timestamp. ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "username", - "search_values": [ - "admin" - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "username", + "search_values": ["admin"] } ``` @@ -57,18 +54,17 @@ The above example will return all records whose `username` is "admin." ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "hash_value", - "search_values": [ - 318 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "hash_value", + "search_values": [318] } ``` The above example will return all records whose primary key (`hash_value`) is 318. -___ + +--- ### read_audit_log Response @@ -76,55 +72,53 @@ The example that follows provides records of operations performed on a table. On ```json { - "operation": "update", - "user_name": "HDB_ADMIN", - "timestamp": 1607035559122.277, - "hash_values": [ - 1, - 2 - ], - "records": [ - { - "id": 1, - "breed": "Muttzilla", - "age": 6, - "__updatedtime__": 1607035559122 - }, - { - "id": 2, - "age": 7, - "__updatedtime__": 1607035559121 - } - ], - "original_records": [ - { - "__createdtime__": 1607035556801, - "__updatedtime__": 1607035556801, - "age": 5, - "breed": "Mutt", - "id": 2, - "name": "Penny" - }, - { - "__createdtime__": 1607035556801, - "__updatedtime__": 1607035556801, - "age": 5, - "breed": "Mutt", - "id": 1, - "name": "Harper" - } - ] + "operation": "update", + "user_name": "HDB_ADMIN", + "timestamp": 1607035559122.277, + "hash_values": [1, 2], + "records": [ + { + "id": 1, + "breed": "Muttzilla", + "age": 6, + "__updatedtime__": 1607035559122 + }, + { + "id": 2, + "age": 7, + "__updatedtime__": 1607035559121 + } + ], + "original_records": [ + { + "__createdtime__": 1607035556801, + "__updatedtime__": 1607035556801, + "age": 5, + "breed": "Mutt", + "id": 2, + "name": "Penny" + }, + { + "__createdtime__": 1607035556801, + "__updatedtime__": 1607035556801, + "age": 5, + "breed": "Mutt", + "id": 1, + "name": "Harper" + } + ] } ``` + ### delete_audit_logs_before Just like with transaction logs, you can clean up your audit logs with the `delete_audit_logs_before` operation. It will delete audit log data according to the given parameters. The example below will delete records older than the timestamp provided. ```json { - "operation": "delete_audit_logs_before", - "schema": "dev", - "table": "cat", - "timestamp": 1598290282817 + "operation": "delete_audit_logs_before", + "schema": "dev", + "table": "cat", + "timestamp": 1598290282817 } -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.1/clustering/certificate-management.md b/site/versioned_docs/version-4.1/clustering/certificate-management.md index 3238a2c5..b69c4786 100644 --- a/site/versioned_docs/version-4.1/clustering/certificate-management.md +++ b/site/versioned_docs/version-4.1/clustering/certificate-management.md @@ -34,7 +34,7 @@ Since these new certificates can be issued with correct CNs, you should set `ins ### Certificate Requirements -* Certificates must have an `Extended Key Usage` that defines both `TLS Web Server Authentication` and `TLS Web Client Authentication` as these certificates will be used to accept connections from other HarperDB nodes and to make requests to other HarperDB nodes. Example: +- Certificates must have an `Extended Key Usage` that defines both `TLS Web Server Authentication` and `TLS Web Client Authentication` as these certificates will be used to accept connections from other HarperDB nodes and to make requests to other HarperDB nodes. Example: ``` X509v3 Key Usage: critical @@ -43,21 +43,27 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication ``` -* If you are using an intermediate CA to issue the certificates, the entire certificate chain (to the root CA) must be included in the `certificateAuthority` file. -* If your certificates expire you will need a way to issue new certificates to the nodes and then restart HarperDB. If you are using a public CA such as LetsEncrypt, a tool like `certbot` can be used to renew certificates. +- If you are using an intermediate CA to issue the certificates, the entire certificate chain (to the root CA) must be included in the `certificateAuthority` file. +- If your certificates expire you will need a way to issue new certificates to the nodes and then restart HarperDB. If you are using a public CA such as LetsEncrypt, a tool like `certbot` can be used to renew certificates. ### Certificate Troubleshooting + If you are having TLS issues with clustering, use the following steps to verify that your certificates are valid. 1. Make sure certificates can be parsed and that you can view the contents: + ``` openssl x509 -in .pem -noout -text` ``` + 1. Make sure the certificate validates with the CA: + ``` openssl verify -CAfile .pem .pem` ``` + 1. Make sure the certificate and private key are a valid pair by verifying that the output of the following commands match: + ``` openssl rsa -modulus -noout -in .pem | openssl md5 openssl x509 -modulus -noout -in .pem | openssl md5 diff --git a/site/versioned_docs/version-4.1/clustering/creating-a-cluster-user.md b/site/versioned_docs/version-4.1/clustering/creating-a-cluster-user.md index 3edecd29..7865ae1c 100644 --- a/site/versioned_docs/version-4.1/clustering/creating-a-cluster-user.md +++ b/site/versioned_docs/version-4.1/clustering/creating-a-cluster-user.md @@ -16,11 +16,11 @@ There are multiple ways a `cluster_user` can be created, they are: ```json { - "operation": "add_user", - "role": "cluster_user", - "username": "cluster_account", - "password": "letsCluster123!", - "active": true + "operation": "add_user", + "role": "cluster_user", + "username": "cluster_account", + "password": "letsCluster123!", + "active": true } ``` @@ -30,8 +30,8 @@ This can be done through the API by calling `set_configuration` or by editing th ```json { - "operation": "set_configuration", - "clustering_user": "cluster_account" + "operation": "set_configuration", + "clustering_user": "cluster_account" } ``` diff --git a/site/versioned_docs/version-4.1/clustering/enabling-clustering.md b/site/versioned_docs/version-4.1/clustering/enabling-clustering.md index 6b563b19..596665d9 100644 --- a/site/versioned_docs/version-4.1/clustering/enabling-clustering.md +++ b/site/versioned_docs/version-4.1/clustering/enabling-clustering.md @@ -23,8 +23,8 @@ _Note: When making any changes to the `harperdb-config.yaml` file HarperDB must ```json { - "operation": "set_configuration", - "clustering_enabled": true + "operation": "set_configuration", + "clustering_enabled": true } ``` diff --git a/site/versioned_docs/version-4.1/clustering/establishing-routes.md b/site/versioned_docs/version-4.1/clustering/establishing-routes.md index e4ca2a6d..868a1fed 100644 --- a/site/versioned_docs/version-4.1/clustering/establishing-routes.md +++ b/site/versioned_docs/version-4.1/clustering/establishing-routes.md @@ -43,9 +43,9 @@ There are multiple ways to set routes, they are: ```json { - "operation": "cluster_set_routes", - "server": "hub", - "routes":[ {"host": "3.735.184.8", "port": 9932} ] + "operation": "cluster_set_routes", + "server": "hub", + "routes": [{ "host": "3.735.184.8", "port": 9932 }] } ``` @@ -67,7 +67,7 @@ The API also has `cluster_get_routes` for getting all routes in the config and ` ```json { - "operation": "cluster_delete_routes", - "routes":[ {"host": "3.735.184.8", "port": 9932} ] + "operation": "cluster_delete_routes", + "routes": [{ "host": "3.735.184.8", "port": 9932 }] } ``` diff --git a/site/versioned_docs/version-4.1/clustering/index.md b/site/versioned_docs/version-4.1/clustering/index.md index 7bde63a2..9eb7ef9c 100644 --- a/site/versioned_docs/version-4.1/clustering/index.md +++ b/site/versioned_docs/version-4.1/clustering/index.md @@ -9,32 +9,31 @@ HarperDB clustering is the process of connecting multiple HarperDB databases tog HarperDB’s clustering engine replicates data between instances of HarperDB using a highly performant, bi-directional pub/sub model on a per-table basis. Data replicates asynchronously with eventual consistency across the cluster following the defined pub/sub configuration. Individual transactions are sent in the order in which they were transacted, once received by the destination instance, they are processed in an ACID-compliant manor. Conflict resolution follows a last writer wins model based on recorded transaction time on the transaction and the timestamp on the record on the node. --- + ### Common Use Case A common use case is an edge application collecting and analyzing sensor data that creates an alert if a sensor value exceeds a given threshold: -* The edge application should not be making outbound http requests for security purposes. - -* There may not be a reliable network connection. +- The edge application should not be making outbound http requests for security purposes. -* Not all sensor data will be sent to the cloud--either because of the unreliable network connection, or maybe it’s just a pain to store it. +- There may not be a reliable network connection. -* The edge node should be inaccessible from outside the firewall. +- Not all sensor data will be sent to the cloud--either because of the unreliable network connection, or maybe it’s just a pain to store it. -* The edge node will send alerts to the cloud with a snippet of sensor data containing the offending sensor readings. +- The edge node should be inaccessible from outside the firewall. +- The edge node will send alerts to the cloud with a snippet of sensor data containing the offending sensor readings. HarperDB simplifies the architecture of such an application with its bi-directional, table-level replication: -* The edge instance subscribes to a “thresholds” table on the cloud instance, so the application only makes localhost calls to get the thresholds. - -* The application continually pushes sensor data into a “sensor_data” table via the localhost API, comparing it to the threshold values as it does so. +- The edge instance subscribes to a “thresholds” table on the cloud instance, so the application only makes localhost calls to get the thresholds. -* When a threshold violation occurs, the application adds a record to the “alerts” table. +- The application continually pushes sensor data into a “sensor_data” table via the localhost API, comparing it to the threshold values as it does so. -* The application appends to that record array “sensor_data” entries for the 60 seconds (or minutes, or days) leading up to the threshold violation. +- When a threshold violation occurs, the application adds a record to the “alerts” table. -* The edge instance publishes the “alerts” table up to the cloud instance. +- The application appends to that record array “sensor_data” entries for the 60 seconds (or minutes, or days) leading up to the threshold violation. +- The edge instance publishes the “alerts” table up to the cloud instance. -By letting HarperDB focus on the fault-tolerant logistics of transporting your data, you get to write less code. By moving data only when and where it’s needed, you lower storage and bandwidth costs. And by restricting your app to only making local calls to HarperDB, you reduce the overall exposure of your application to outside forces. \ No newline at end of file +By letting HarperDB focus on the fault-tolerant logistics of transporting your data, you get to write less code. By moving data only when and where it’s needed, you lower storage and bandwidth costs. And by restricting your app to only making local calls to HarperDB, you reduce the overall exposure of your application to outside forces. diff --git a/site/versioned_docs/version-4.1/clustering/managing-subscriptions.md b/site/versioned_docs/version-4.1/clustering/managing-subscriptions.md index a1f8c56e..bee50508 100644 --- a/site/versioned_docs/version-4.1/clustering/managing-subscriptions.md +++ b/site/versioned_docs/version-4.1/clustering/managing-subscriptions.md @@ -12,22 +12,22 @@ To add a single node and create one or more subscriptions use `add_node`. ```json { - "operation": "add_node", - "node_name": "Node2", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": false, - "subscribe": true - }, - { - "schema": "dev", - "table": "chicken", - "publish": true, - "subscribe": true - } - ] + "operation": "add_node", + "node_name": "Node2", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": false, + "subscribe": true + }, + { + "schema": "dev", + "table": "chicken", + "publish": true, + "subscribe": true + } + ] } ``` @@ -37,16 +37,16 @@ To update one or more subscriptions with a single node use `update_node`. ```json { - "operation": "update_node", - "node_name": "Node2", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ] + "operation": "update_node", + "node_name": "Node2", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ] } ``` @@ -56,37 +56,37 @@ To add or update subscriptions with one or more nodes in one API call use `confi ```json { - "operation": "configure_cluster", - "connections": [ - { - "node_name": "Node2", - "subscriptions": [ - { - "schema": "dev", - "table": "chicken", - "publish": false, - "subscribe": true - }, - { - "schema": "prod", - "table": "dog", - "publish": true, - "subscribe": true - } - ] - }, - { - "node_name": "Node3", - "subscriptions": [ - { - "schema": "dev", - "table": "chicken", - "publish": true, - "subscribe": false - } - ] - } - ] + "operation": "configure_cluster", + "connections": [ + { + "node_name": "Node2", + "subscriptions": [ + { + "schema": "dev", + "table": "chicken", + "publish": false, + "subscribe": true + }, + { + "schema": "prod", + "table": "dog", + "publish": true, + "subscribe": true + } + ] + }, + { + "node_name": "Node3", + "subscriptions": [ + { + "schema": "dev", + "table": "chicken", + "publish": true, + "subscribe": false + } + ] + } + ] } ``` @@ -100,17 +100,17 @@ There is an optional property called `start_time` that can be passed in the subs ```json { - "operation": "add_node", - "node_name": "Node2", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": false, - "subscribe": true, - "start_time": "2022-09-02T20:06:35.993Z" - } - ] + "operation": "add_node", + "node_name": "Node2", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": false, + "subscribe": true, + "start_time": "2022-09-02T20:06:35.993Z" + } + ] } ``` @@ -126,8 +126,8 @@ To remove a node and all its subscriptions use `remove_node`. ```json { - "operation":"remove_node", - "node_name":"Node2" + "operation": "remove_node", + "node_name": "Node2" } ``` @@ -137,32 +137,32 @@ To get the status of all connected nodes and see their subscriptions use `cluste ```json { - "node_name": "Node1", - "is_enabled": true, - "connections": [ - { - "node_name": "Node2", - "status": "open", - "ports": { - "clustering": 9932, - "operations_api": 9925 - }, - "latency_ms": 65, - "uptime": "11m 19s", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ], - "system_info": { - "hdb_version": "4.0.0", - "node_version": "16.17.1", - "platform": "linux" - } - } - ] + "node_name": "Node1", + "is_enabled": true, + "connections": [ + { + "node_name": "Node2", + "status": "open", + "ports": { + "clustering": 9932, + "operations_api": 9925 + }, + "latency_ms": 65, + "uptime": "11m 19s", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ], + "system_info": { + "hdb_version": "4.0.0", + "node_version": "16.17.1", + "platform": "linux" + } + } + ] } ``` diff --git a/site/versioned_docs/version-4.1/clustering/naming-a-node.md b/site/versioned_docs/version-4.1/clustering/naming-a-node.md index d1ebdfb1..308aef7a 100644 --- a/site/versioned_docs/version-4.1/clustering/naming-a-node.md +++ b/site/versioned_docs/version-4.1/clustering/naming-a-node.md @@ -27,8 +27,8 @@ _Note: When making any changes to the `harperdb-config.yaml` file HarperDB must ```json { - "operation": "set_configuration", - "clustering_nodeName":"Node1" + "operation": "set_configuration", + "clustering_nodeName": "Node1" } ``` diff --git a/site/versioned_docs/version-4.1/clustering/subscription-overview.md b/site/versioned_docs/version-4.1/clustering/subscription-overview.md index 76292f4a..1e9ea5d1 100644 --- a/site/versioned_docs/version-4.1/clustering/subscription-overview.md +++ b/site/versioned_docs/version-4.1/clustering/subscription-overview.md @@ -10,11 +10,11 @@ _Note: ‘local’ and ‘remote’ will often be referred to. In the context of A subscription consists of: -`schema` - the name of the schema that the table you are creating the subscription for belongs to. +`schema` - the name of the schema that the table you are creating the subscription for belongs to. -`table` - the name of the table the subscription will apply to. +`table` - the name of the table the subscription will apply to. -`publish` - a boolean which determines if transactions on the local table should be replicated on the remote table. +`publish` - a boolean which determines if transactions on the local table should be replicated on the remote table. `subscribe` - a boolean which determines if transactions on the remote table should be replicated on the local table. diff --git a/site/versioned_docs/version-4.1/clustering/things-worth-knowing.md b/site/versioned_docs/version-4.1/clustering/things-worth-knowing.md index cb01b8b8..e4f5bf18 100644 --- a/site/versioned_docs/version-4.1/clustering/things-worth-knowing.md +++ b/site/versioned_docs/version-4.1/clustering/things-worth-knowing.md @@ -6,21 +6,21 @@ title: Things worth Knowing Additional information that will help you define your clustering topology. -*** +--- ### Transactions Transactions that are replicated across the cluster are: -* Insert -* Update -* Upsert -* Delete -* Bulk loads - * CSV data load - * CSV file load - * CSV URL load - * Import from S3 +- Insert +- Update +- Upsert +- Delete +- Bulk loads + - CSV data load + - CSV file load + - CSV URL load + - Import from S3 When adding or updating a node any schemas and tables in the subscription that don’t exist on the remote node will be automatically created. @@ -28,13 +28,13 @@ When adding or updating a node any schemas and tables in the subscription that d Users and roles are not replicated across the cluster. -*** +--- ### Queueing HarperDB has built-in resiliency for when network connectivity is lost within a subscription. When connections are reestablished, a catchup routine is executed to ensure data that was missed, specific to the subscription, is sent/received as defined. -*** +--- ### Topologies diff --git a/site/versioned_docs/version-4.1/configuration.md b/site/versioned_docs/version-4.1/configuration.md index 38ee63fa..798ab9f9 100644 --- a/site/versioned_docs/version-4.1/configuration.md +++ b/site/versioned_docs/version-4.1/configuration.md @@ -38,7 +38,6 @@ Clustering offers a lot of different configurations, however in a majority of ca - `clustering.nodeName` The name of your node, must be unique within the cluster. - `clustering.user` The name of the user credentials used for Inter-node authentication. - `enabled` - _Type_: boolean; _Default_: false Enable clustering. @@ -47,7 +46,7 @@ _Note: If you enabled clustering but do not create and add a cluster user you wi ```yaml clustering: - enabled: true + enabled: true ``` `clustering.hubServer.cluster` @@ -81,6 +80,7 @@ The port the hub server uses to accept cluster connections `routes` - _Type_: array, _Default_: null An object array that represent the host and port this server will cluster to. Each object must have two properties `port` and `host`. Multiple entries can be added to create network resiliency in the event one server is unavailable. Routes can be added, updated and removed either by directly editing the `harperdb-config.yaml` file or by using the `cluster_set_routes` or `cluster_delete_routes` API endpoints. +
@@ -91,7 +91,7 @@ The host of the remote instance you are creating the connection with. `port` - _Type_: integer -The port of the remote instance you are creating the connection with. This is likely going to be the `clustering.hubServer.cluster.network.port` on the remote instance. +The port of the remote instance you are creating the connection with. This is likely going to be the `clustering.hubServer.cluster.network.port` on the remote instance.
@@ -160,6 +160,7 @@ The host of the remote instance you are creating the connection with. `port` - _Type_: integer The port of the remote instance you are creating the connection with. This is likely going to be the `clustering.hubServer.cluster.network.port` on the remote instance. +
@@ -183,6 +184,7 @@ How many messages may be in a stream. Oldest messages are removed if the stream The directory where all the streams are kept. --- + `logLevel` - _Type_: string; _Default_: error Control the verbosity of clustering logs. @@ -194,7 +196,6 @@ clustering: There exists a log level hierarchy in order as `trace`, `debug`, `info`, `warn`, and `error`. When the level is set to `trace` logs will be created for all possible levels. Whereas if the level is set to `warn`, the only entries logged will be `warn` and `error`. The default value is `error`. - `nodeName` - _Type_: string; _Default_: null The name of this node in your HarperDB cluster topology. This must be a value unique from the rest of the cluster node names. @@ -238,7 +239,7 @@ When true, will skip certificate verification. For use only with self-signed cer `republishMessages` - _Type_: boolean; _Default_: true -When true, all transactions that are received from other nodes are republished to this node's stream. When subscriptions are not fully connected between all nodes, this ensures that messages are routed to all nodes through intermediate nodes. This also ensures that all writes, whether local or remote, are written to the NATS transaction log. However, there is additional overhead with republishing, and setting this is to false can provide better data replication performance. When false, you need to ensure all subscriptions are fully connected between every node to every other node, and be aware that the NATS transaction log will only consist of local writes. +When true, all transactions that are received from other nodes are republished to this node's stream. When subscriptions are not fully connected between all nodes, this ensures that messages are routed to all nodes through intermediate nodes. This also ensures that all writes, whether local or remote, are written to the NATS transaction log. However, there is additional overhead with republishing, and setting this is to false can provide better data replication performance. When false, you need to ensure all subscriptions are fully connected between every node to every other node, and be aware that the NATS transaction log will only consist of local writes. `verify` - _Type_: boolean; _Default_: true @@ -256,12 +257,11 @@ The user can be created either through the API using an `add_user` request with ```yaml clustering: - user: cluster_person + user: cluster_person ``` --- - ### `customFunctions` The `customFunctions` section configures HarperDB Custom Functions. @@ -272,7 +272,7 @@ Enable the Custom Function server or not. ```yaml customFunctions: - enabled: true + enabled: true ``` `customFunctions.network` @@ -287,7 +287,7 @@ customFunctions: https: false keepAliveTimeout: 5000 port: 9926 - timeout: 120000 + timeout: 120000 ```
@@ -319,6 +319,7 @@ The port used to access the Custom Functions server. `timeout` - _Type_: integer; _Default_: Defaults to 120,000 milliseconds (2 minutes) The length of time in milliseconds after which a request will timeout. +
`nodeEnv` - _Type_: string; _Default_: production @@ -365,10 +366,8 @@ Path to the certificate authority file. Path to the private key file. - --- - ### `ipc` The `ipc` section configures the HarperDB Inter-Process Communication interface. @@ -383,10 +382,8 @@ ipc: The port the IPC server runs on. The default is `9383`. - --- - ### `localStudio` The `localStudio` section configures the local HarperDB Studio, a simplified GUI for HarperDB hosted on the server. A more comprehensive GUI is hosted by HarperDB at [https://studio.harperdb.io](https://studio.harperdb.io). Note, all database traffic from either `localStudio` or HarperDB Studio is made directly from your browser to the instance. @@ -419,11 +416,11 @@ To access the audit logs, use the API operation `read_audit_log`. It will provid ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog" + "operation": "read_audit_log", + "schema": "dev", + "table": "dog" } -```` +``` `file` - _Type_: boolean; _Default_: true @@ -527,6 +524,7 @@ Defines the length of time an operation token will be valid until it expires. Ex `refreshTokenTimeout` - _Type_: string; _Default_: 1d Defines the length of time a refresh token will be valid until it expires. Example values: [https://github.com/vercel/ms](https://github.com/vercel/ms). + `foreground` - _Type_: boolean; _Default_: false @@ -552,6 +550,7 @@ operationsApi: port: 9925 timeout: 120000 ``` +
`cors` - _Type_: boolean; _Default_: true @@ -633,11 +632,12 @@ http: threads: 11 ``` -`sessionAffinity` - _Type_: string; _Default_: null +`sessionAffinity` - _Type_: string; _Default_: null HarperDB is a multi-threaded server designed to scale to utilize many CPU cores with high concurrency. Session affinity can help improve the efficiency and fairness of thread utilization by routing multiple requests from the same client to the same thread. This provides a fairer method of request handling by keeping a single user contained to a single thread, can improve caching locality (multiple requests from a single user are more likely to access the same data), and can provide the ability to share information in-memory in user sessions. Enabling session affinity will cause subsequent requests from the same client to be routed to the same thread. To enable `sessionAffinity`, you need to specify how clients will be identified from the incoming requests. If you are using HarperDB to directly serve HTTP requests from users from different remote addresses, you can use a setting of `ip`. However, if you are using HarperDB behind a proxy server or application server, all the remote ip addresses will be the same and HarperDB will effectively only run on a single thread. Alternately, you can specify a header to use for identification. If you are using basic authentication, you could use the "Authorization" header to route requests to threads by the user's credentials. If you have another header that uniquely identifies users/clients, you can use that as the value of sessionAffinity. But be careful to ensure that the value does provide sufficient uniqueness and that requests are effectively distributed to all the threads and fully utilizing all your CPU cores. + ```yaml http: sessionAffinity: ip @@ -677,7 +677,6 @@ storage: caching: true ``` - `compression` - _Type_: boolean; _Default_: false The `compression` option enables compression of records in the database. This can be helpful for very large databases in reducing storage requirements and potentially allowing more data to be cached. This uses the very fast LZ4 compression algorithm, but this still incurs extra costs for compressing and decompressing. @@ -687,7 +686,6 @@ storage: compression: false ``` - `noReadAhead` - _Type_: boolean; _Default_: true The `noReadAhead` option advises the operating system to not read ahead when reading from the database. This provides better memory utilization, except in situations where large records are used or frequent range queries are used. @@ -697,7 +695,6 @@ storage: noReadAhead: true ``` - `prefetchWrites` - _Type_: boolean; _Default_: true The `prefetchWrites` option loads data prior to write transactions. This should be enabled for databases that are larger than memory (although it can be faster to disable this for smaller databases). @@ -707,7 +704,6 @@ storage: prefetchWrites: true ``` - `path` - _Type_: string; _Default_: `/schema` The `path` configuration sets where all database files should reside. @@ -723,7 +719,7 @@ storage: ### `schemas` -The `schemas` section is an optional configuration that can be used to define where database files should reside down to the table level. +The `schemas` section is an optional configuration that can be used to define where database files should reside down to the table level.

This configuration should be set before the schema and table have been created.

The configuration will not create the directories in the path, that must be done by the user.
@@ -753,6 +749,7 @@ schemas: nameOfSchema: auditPath: /path/to/schema ``` +
**Setting the schemas section through the command line, environment variables or API** @@ -760,27 +757,32 @@ schemas: When using command line variables,environment variables or the API to configure the schemas section a slightly different convention from the regular one should be used. To add one or more configurations use a JSON object array. Using command line variables: + ```bash --SCHEMAS [{\"nameOfSchema\":{\"tables\":{\"nameOfTable\":{\"path\":\"\/path\/to\/table\"}}}}] ``` Using environment variables: + ```bash SCHEMAS=[{"nameOfSchema":{"tables":{"nameOfTable":{"path":"/path/to/table"}}}}] ``` Using the API: + ```json { - "operation": "set_configuration", - "schemas": [{ - "nameOfSchema": { - "tables": { - "nameOfTable": { - "path": "/path/to/table" - } - } - } - }] + "operation": "set_configuration", + "schemas": [ + { + "nameOfSchema": { + "tables": { + "nameOfTable": { + "path": "/path/to/table" + } + } + } + } + ] } ``` diff --git a/site/versioned_docs/version-4.1/custom-functions/create-project.md b/site/versioned_docs/version-4.1/custom-functions/create-project.md index cb046fb0..8adc5bea 100644 --- a/site/versioned_docs/version-4.1/custom-functions/create-project.md +++ b/site/versioned_docs/version-4.1/custom-functions/create-project.md @@ -8,20 +8,20 @@ To create a project using our web-based GUI, HarperDB Studio, checkout out how t Otherwise, to create a project, you have the following options: -1. **Use the add\_custom\_function\_project operation** +1. **Use the add_custom_function_project operation** - This operation creates a new project folder, and populates it with templates for the routes, helpers, and static subfolders. + This operation creates a new project folder, and populates it with templates for the routes, helpers, and static subfolders. ```json { - "operation": "add_custom_function_project", - "project": "dogs" + "operation": "add_custom_function_project", + "project": "dogs" } ``` 1. **Clone our public gitHub project template** - _This requires a local installation. Remove the .git directory for a clean slate of git history._ + _This requires a local installation. Remove the .git directory for a clean slate of git history._ ```bash > git clone https://github.com/HarperDB/harperdb-custom-functions-template.git ~/hdb/custom_functions/dogs @@ -29,7 +29,7 @@ Otherwise, to create a project, you have the following options: 1. **Create a project folder in your Custom Functions root directory** and **initialize** - _This requires a local installation._ + _This requires a local installation._ ```bash > mkdir ~/hdb/custom_functions/dogs diff --git a/site/versioned_docs/version-4.1/custom-functions/custom-functions-operations.md b/site/versioned_docs/version-4.1/custom-functions/custom-functions-operations.md index 34110797..3e665f38 100644 --- a/site/versioned_docs/version-4.1/custom-functions/custom-functions-operations.md +++ b/site/versioned_docs/version-4.1/custom-functions/custom-functions-operations.md @@ -8,40 +8,38 @@ One way to manage Custom Functions is through [HarperDB Studio](../harperdb-stud HarperDB Studio manages your Custom Functions using nine HarperDB operations. You may view these operations within our [API Docs](https://api.harperdb.io/). A brief overview of each of the operations is below: +- **custom_functions_status** + Returns the state of the Custom Functions server. This includes whether it is enabled, upon which port it is listening, and where its root project directory is located on the host machine. -* **custom_functions_status** +- **get_custom_functions** - Returns the state of the Custom Functions server. This includes whether it is enabled, upon which port it is listening, and where its root project directory is located on the host machine. + Returns an array of projects within the Custom Functions root project directory. Each project has details including each of the files in the **routes** and **helpers** directories, and the total file count in the **static** folder. -* **get_custom_functions** +- **get_custom_function** - Returns an array of projects within the Custom Functions root project directory. Each project has details including each of the files in the **routes** and **helpers** directories, and the total file count in the **static** folder. + Returns the content of the specified file as text. HarperDB Studio uses this call to render the file content in its built-in code editor. -* **get_custom_function** +- **set_custom_function** - Returns the content of the specified file as text. HarperDB Studio uses this call to render the file content in its built-in code editor. + Updates the content of the specified file. HarperDB Studio uses this call to save any changes made through its built-in code editor. -* **set_custom_function** +- **drop_custom_function** - Updates the content of the specified file. HarperDB Studio uses this call to save any changes made through its built-in code editor. + Deletes the specified file. -* **drop_custom_function** +- **add_custom_function_project** - Deletes the specified file. + Creates a new project folder in the Custom Functions root project directory. It also inserts into the new directory the contents of our Custom Functions Project template, which is available publicly, here: [https://github.com/HarperDB/harperdb-custom-functions-template](https://github.com/HarperDB/harperdb-custom-functions-template). -* **add_custom_function_project** +- **drop_custom_function_project** - Creates a new project folder in the Custom Functions root project directory. It also inserts into the new directory the contents of our Custom Functions Project template, which is available publicly, here: [https://github.com/HarperDB/harperdb-custom-functions-template](https://github.com/HarperDB/harperdb-custom-functions-template). + Deletes the specified project folder and all of its contents. -* **drop_custom_function_project** +- **package_custom_function_project** - Deletes the specified project folder and all of its contents. + Creates a .tar file of the specified project folder, then reads it into a base64-encoded string and returns that string the user. -* **package_custom_function_project** +- **deploy_custom_function_project** - Creates a .tar file of the specified project folder, then reads it into a base64-encoded string and returns that string the user. - -* **deploy_custom_function_project** - - Takes the output of package_custom_function_project, decrypts the base64-encoded string, reconstitutes the .tar file of your project folder, and extracts it to the Custom Functions root project directory. + Takes the output of package_custom_function_project, decrypts the base64-encoded string, reconstitutes the .tar file of your project folder, and extracts it to the Custom Functions root project directory. diff --git a/site/versioned_docs/version-4.1/custom-functions/debugging-custom-function.md b/site/versioned_docs/version-4.1/custom-functions/debugging-custom-function.md index f259e716..e57dde0b 100644 --- a/site/versioned_docs/version-4.1/custom-functions/debugging-custom-function.md +++ b/site/versioned_docs/version-4.1/custom-functions/debugging-custom-function.md @@ -6,19 +6,17 @@ title: Debugging a Custom Function HarperDB Custom Functions projects are managed by HarperDB’s process manager. As such, it may seem more difficult to debug Custom Functions than your standard project. The goal of this document is to provide best practices and recommendations for debugging your Custom Function. - - For local debugging and development, it is recommended that you use standard console log statements for logging. For production use, you may want to use HarperDB's logging facilities, so you aren't logging to the console. The [HarperDB Custom Functions template](https://github.com/HarperDB/harperdb-custom-functions-template) includes the HarperDB logger module in the primary function parameters with the name `logger`. This logger can be used to output messages directly to the HarperDB log using standardized logging level functions, described below. The log level can be set in the [HarperDB Configuration File](../configuration). HarperDB Logger Functions -* `trace(message)`: Write a 'trace' level log, if the configured level allows for it. -* `debug(message)`: Write a 'debug' level log, if the configured level allows for it. -* `info(message)`: Write a 'info' level log, if the configured level allows for it. -* `warn(message)`: Write a 'warn' level log, if the configured level allows for it. -* `error(message)`: Write a 'error' level log, if the configured level allows for it. -* `fatal(message)`: Write a 'fatal' level log, if the configured level allows for it. -* `notify(message)`: Write a 'notify' level log. +- `trace(message)`: Write a 'trace' level log, if the configured level allows for it. +- `debug(message)`: Write a 'debug' level log, if the configured level allows for it. +- `info(message)`: Write a 'info' level log, if the configured level allows for it. +- `warn(message)`: Write a 'warn' level log, if the configured level allows for it. +- `error(message)`: Write a 'error' level log, if the configured level allows for it. +- `fatal(message)`: Write a 'fatal' level log, if the configured level allows for it. +- `notify(message)`: Write a 'notify' level log. For debugging purposes, it is recommended to use `notify` as these messages will appear in the log regardless of log level configured. @@ -30,27 +28,25 @@ The HarperDB Log can be found on the [Studio Status page](../harperdb-studio/ins This example performs a SQL query in HarperDB and logs the result. This example utilizes the `logger.notify` function to log the stringified version of the result. If an error occurs, it will output the error using `logger.error` and return the error. - - ```javascript server.route({ - url: '/', - method: 'GET', - handler: async (request) => { - request.body = { - operation: 'sql', - sql: 'SELECT * FROM dev.dog ORDER BY dog_name' - }; - - try { - let result = await hdbCore.requestWithoutAuthentication(request); - logger.notify(`Query Result: ${JSON.stringify(result)}`); - return result; - } catch (e) { - logger.error(`Query Error: ${e}`); - return e; - } - } + url: '/', + method: 'GET', + handler: async (request) => { + request.body = { + operation: 'sql', + sql: 'SELECT * FROM dev.dog ORDER BY dog_name', + }; + + try { + let result = await hdbCore.requestWithoutAuthentication(request); + logger.notify(`Query Result: ${JSON.stringify(result)}`); + return result; + } catch (e) { + logger.error(`Query Error: ${e}`); + return e; + } + }, }); ``` @@ -58,45 +54,44 @@ server.route({ This example performs two SQL queries in HarperDB with logging throughout to describe what is happening. This example utilizes the `logger.notify` function to log the stringified version of the operation and the result of each query. If an error occurs, it will output the error using `logger.error` and return the error. - ```javascript server.route({ - url: '/example', - method: 'GET', - handler: async (request) => { - logger.notify('/example called!'); - const results = []; - - request.body = { - operation: 'sql', - sql: 'SELECT * FROM dev.dog WHERE id = 1' - }; - logger.notify(`Query 1 Operation: ${JSON.stringify(request.body)}`); - try { - let result = await hdbCore.requestWithoutAuthentication(request); - logger.notify(`Query 1: ${JSON.stringify(result)}`); - results.push(result); - } catch (e) { - logger.error(`Query 1: ${e}`); - return e; - } - - request.body = { - operation: 'sql', - sql: 'SELECT * FROM dev.dog WHERE id = 2' - }; - logger.notify(`Query 2 Operation: ${JSON.stringify(request.body)}`); - try { - let result = await hdbCore.requestWithoutAuthentication(request); - logger.notify(`Query 2: ${JSON.stringify(result)}`); - results.push(result); - } catch (e) { - logger.error(`Query 2: ${e}`); - return e; - } - - logger.notify('/example complete!'); - return results; - } + url: '/example', + method: 'GET', + handler: async (request) => { + logger.notify('/example called!'); + const results = []; + + request.body = { + operation: 'sql', + sql: 'SELECT * FROM dev.dog WHERE id = 1', + }; + logger.notify(`Query 1 Operation: ${JSON.stringify(request.body)}`); + try { + let result = await hdbCore.requestWithoutAuthentication(request); + logger.notify(`Query 1: ${JSON.stringify(result)}`); + results.push(result); + } catch (e) { + logger.error(`Query 1: ${e}`); + return e; + } + + request.body = { + operation: 'sql', + sql: 'SELECT * FROM dev.dog WHERE id = 2', + }; + logger.notify(`Query 2 Operation: ${JSON.stringify(request.body)}`); + try { + let result = await hdbCore.requestWithoutAuthentication(request); + logger.notify(`Query 2: ${JSON.stringify(result)}`); + results.push(result); + } catch (e) { + logger.error(`Query 2: ${e}`); + return e; + } + + logger.notify('/example complete!'); + return results; + }, }); -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.1/custom-functions/define-helpers.md b/site/versioned_docs/version-4.1/custom-functions/define-helpers.md index 1719f537..5f8df3e8 100644 --- a/site/versioned_docs/version-4.1/custom-functions/define-helpers.md +++ b/site/versioned_docs/version-4.1/custom-functions/define-helpers.md @@ -6,31 +6,29 @@ title: Define Helpers Helpers are functions for use within your routes. You may want to use the same helper in multiple route files, so this allows you to write it once, and include it wherever you need it. +- To use your helpers, they must be exported from your helper file. Please use any standard export mechanisms available for your module system. We like ESM, ECMAScript Modules. Our example below exports using `module.exports`. - -* To use your helpers, they must be exported from your helper file. Please use any standard export mechanisms available for your module system. We like ESM, ECMAScript Modules. Our example below exports using `module.exports`. - -* You must import the helper module into the file that needs access to the exported functions. With ESM, you'd use a `require` statement. See [this example](./define-routes#custom-prevalidation-hooks) in Define Routes. - +- You must import the helper module into the file that needs access to the exported functions. With ESM, you'd use a `require` statement. See [this example](./define-routes#custom-prevalidation-hooks) in Define Routes. Below is code from the customValidation helper that is referenced in [Define Routes](./define-routes). It takes the request and the logger method from the route declaration, and makes a call to an external API to validate the headers using fetch. The API in this example is just returning a list of ToDos, but it could easily be replaced with a call to a real authentication service. - ```javascript -const customValidation = async (request,logger) => { - let response = await fetch('https://jsonplaceholder.typicode.com/todos/1', { headers: { authorization: request.headers.authorization } }); - let result = await response.json(); - - /* - * throw an authentication error based on the response body or statusCode - */ - if (result.error) { - const errorString = result.error || 'Sorry, there was an error authenticating your request'; - logger.error(errorString); - throw new Error(errorString); - } - return request; +const customValidation = async (request, logger) => { + let response = await fetch('https://jsonplaceholder.typicode.com/todos/1', { + headers: { authorization: request.headers.authorization }, + }); + let result = await response.json(); + + /* + * throw an authentication error based on the response body or statusCode + */ + if (result.error) { + const errorString = result.error || 'Sorry, there was an error authenticating your request'; + logger.error(errorString); + throw new Error(errorString); + } + return request; }; module.exports = customValidation; -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.1/custom-functions/define-routes.md b/site/versioned_docs/version-4.1/custom-functions/define-routes.md index 4ea88f43..fba5d606 100644 --- a/site/versioned_docs/version-4.1/custom-functions/define-routes.md +++ b/site/versioned_docs/version-4.1/custom-functions/define-routes.md @@ -6,41 +6,31 @@ title: Define Routes HarperDB’s Custom Functions is built on top of [Fastify](https://www.fastify.io/), so our route definitions follow their specifications. Below is a very simple example of a route declaration. - - Route URLs are resolved in the following manner: -* [**Instance URL**]:[**Custom Functions Port**]/[**Project Name**]/[**Route URL**] - -* The route below, within the **dogs** project, with a route of **breeds** would be available at **http:/localhost:9926/dogs/breeds**. +- [**Instance URL**]:[**Custom Functions Port**]/[**Project Name**]/[**Route URL**] +- The route below, within the **dogs** project, with a route of **breeds** would be available at **http:/localhost:9926/dogs/breeds**. In effect, this route is just a pass-through to HarperDB. The same result could have been achieved by hitting the core HarperDB API, since it uses **hdbCore.preValidation** and **hdbCore.request**, which are defined in the “helper methods” section, below. - - ```javascript module.exports = async (server, { hdbCore, logger }) => { - server.route({ - url: '/', - method: 'POST', - preValidation: hdbCore.preValidation, - handler: hdbCore.request, - }) -} + server.route({ + url: '/', + method: 'POST', + preValidation: hdbCore.preValidation, + handler: hdbCore.request, + }); +}; ``` - ## Custom Handlers For endpoints where you want to execute multiple operations against HarperDB, or perform additional processing (like an ML classification, or an aggregation, or a call to a 3rd party API), you can define your own logic in the handler. The function below will execute a query against the dogs table, and filter the results to only return those dogs over 4 years in age. - - **IMPORTANT: This route has NO preValidation and uses hdbCore.requestWithoutAuthentication, which- as the name implies- bypasses all user authentication. See the security concerns and mitigations in the “helper methods” section, below.** - - ```javascript module.exports = async (server, { hdbCore, logger }) => { server.route({ @@ -60,9 +50,8 @@ module.exports = async (server, { hdbCore, logger }) => { ``` ## Custom preValidation Hooks -The simple example above was just a pass-through to HarperDB- the exact same result could have been achieved by hitting the core HarperDB API. But for many applications, you may want to authenticate the user using custom logic you write, or by conferring with a 3rd party service. Custom preValidation hooks let you do just that. - +The simple example above was just a pass-through to HarperDB- the exact same result could have been achieved by hitting the core HarperDB API. But for many applications, you may want to authenticate the user using custom logic you write, or by conferring with a 3rd party service. Custom preValidation hooks let you do just that. Below is an example of a route that uses a custom validation hook: @@ -70,62 +59,55 @@ Below is an example of a route that uses a custom validation hook: const customValidation = require('../helpers/customValidation'); module.exports = async (server, { hdbCore, logger }) => { - server.route({ - url: '/:id', - method: 'GET', - preValidation: (request) => customValidation(request, logger), - handler: (request) => { - request.body= { - operation: 'sql', - sql: `SELECT * FROM dev.dog WHERE id = ${request.params.id}` - }; - - return hdbCore.requestWithoutAuthentication(request); - } - }); -} + server.route({ + url: '/:id', + method: 'GET', + preValidation: (request) => customValidation(request, logger), + handler: (request) => { + request.body = { + operation: 'sql', + sql: `SELECT * FROM dev.dog WHERE id = ${request.params.id}`, + }; + + return hdbCore.requestWithoutAuthentication(request); + }, + }); +}; ``` - Notice we imported customValidation from the **helpers** directory. To include a helper, and to see the actual code within customValidation, see [Define Helpers](./define-helpers). ## Helper Methods -When declaring routes, you are given access to 2 helper methods: hdbCore and logger. - +When declaring routes, you are given access to 2 helper methods: hdbCore and logger. **hdbCore** hdbCore contains three functions that allow you to authenticate an inbound request, and execute operations against HarperDB directly, by passing the standard Operations API. +- **preValidation** + This takes the authorization header from the inbound request and executes the same authentication as the standard HarperDB Operations API. It will determine if the user exists, and if they are allowed to perform this operation. **If you use the request method, you have to use preValidation to get the authenticated user**. -* **preValidation** - - This takes the authorization header from the inbound request and executes the same authentication as the standard HarperDB Operations API. It will determine if the user exists, and if they are allowed to perform this operation. **If you use the request method, you have to use preValidation to get the authenticated user**. - -* **request** +- **request** This will execute a request with HarperDB using the operations API. The `request.body` should contain a standard HarperDB operation and must also include the `hdb_user` property that was in `request.body` provided in the callback. -* **requestWithoutAuthentication** - - Executes a request against HarperDB without any security checks around whether the inbound user is allowed to make this request. For security purposes, you should always take the following precautions when using this method: - - * Properly handle user-submitted values, including url params. User-submitted values should only be used for `search_value` and for defining values in records. Special care should be taken to properly escape any values if user-submitted values are used for SQL. +- **requestWithoutAuthentication** + Executes a request against HarperDB without any security checks around whether the inbound user is allowed to make this request. For security purposes, you should always take the following precautions when using this method: + - Properly handle user-submitted values, including url params. User-submitted values should only be used for `search_value` and for defining values in records. Special care should be taken to properly escape any values if user-submitted values are used for SQL. **logger** This helper allows you to write directly to the Custom Functions log file, custom_functions.log. It’s useful for debugging during development, although you may also use the console logger. There are 5 functions contained within logger, each of which pertains to a different **logging.level** configuration in your harperdb-config.yaml file. +- logger.trace(‘Starting the handler for /dogs’) -* logger.trace(‘Starting the handler for /dogs’) - -* logger.debug(‘This should only fire once’) +- logger.debug(‘This should only fire once’) -* logger.warn(‘This should never ever fire’) +- logger.warn(‘This should never ever fire’) -* logger.error(‘This did not go well’) +- logger.error(‘This did not go well’) -* logger.fatal(‘This did not go very well at all’) \ No newline at end of file +- logger.fatal(‘This did not go very well at all’) diff --git a/site/versioned_docs/version-4.1/custom-functions/example-projects.md b/site/versioned_docs/version-4.1/custom-functions/example-projects.md index a2ce70e3..bfa50ab5 100644 --- a/site/versioned_docs/version-4.1/custom-functions/example-projects.md +++ b/site/versioned_docs/version-4.1/custom-functions/example-projects.md @@ -6,32 +6,32 @@ title: Example Projects **Library of example projects and tutorials using Custom Functions:** -* [Authorization in HarperDB using Okta Customer Identity Cloud](https://www.harperdb.io/post/authorization-in-harperdb-using-okta-customer-identity-cloud), by Yitaek Hwang +- [Authorization in HarperDB using Okta Customer Identity Cloud](https://www.harperdb.io/post/authorization-in-harperdb-using-okta-customer-identity-cloud), by Yitaek Hwang -* [How to Speed Up your Applications by Caching at the Edge with HarperDB](https://dev.to/doabledanny/how-to-speed-up-your-applications-by-caching-at-the-edge-with-harperdb-3o2l), by Danny Adams +- [How to Speed Up your Applications by Caching at the Edge with HarperDB](https://dev.to/doabledanny/how-to-speed-up-your-applications-by-caching-at-the-edge-with-harperdb-3o2l), by Danny Adams -* [OAuth Authentication in HarperDB using Auth0 & Node.js](https://www.harperdb.io/post/oauth-authentication-in-harperdb-using-auth0-and-node-js), by Lucas Santos +- [OAuth Authentication in HarperDB using Auth0 & Node.js](https://www.harperdb.io/post/oauth-authentication-in-harperdb-using-auth0-and-node-js), by Lucas Santos -* [How To Create a CRUD API with Next.js & HarperDB Custom Functions](https://www.harperdb.io/post/create-a-crud-api-w-next-js-harperdb), by Colby Fayock +- [How To Create a CRUD API with Next.js & HarperDB Custom Functions](https://www.harperdb.io/post/create-a-crud-api-w-next-js-harperdb), by Colby Fayock -* [Build a Dynamic REST API with Custom Functions](https://harperdb.io/blog/build-a-dynamic-rest-api-with-custom-functions/), by Terra Roush +- [Build a Dynamic REST API with Custom Functions](https://harperdb.io/blog/build-a-dynamic-rest-api-with-custom-functions/), by Terra Roush -* [How to use HarperDB Custom Functions to Build your Entire Backend](https://dev.to/andrewbaisden/how-to-use-harperdb-custom-functions-to-build-your-entire-backend-a2m), by Andrew Baisden +- [How to use HarperDB Custom Functions to Build your Entire Backend](https://dev.to/andrewbaisden/how-to-use-harperdb-custom-functions-to-build-your-entire-backend-a2m), by Andrew Baisden -* [Using TensorFlowJS & HarperDB Custom Functions for Machine Learning](https://harperdb.io/blog/using-tensorflowjs-harperdb-for-machine-learning/), by Kevin Ashcraft +- [Using TensorFlowJS & HarperDB Custom Functions for Machine Learning](https://harperdb.io/blog/using-tensorflowjs-harperdb-for-machine-learning/), by Kevin Ashcraft -* [Build & Deploy a Fitness App with Python & HarperDB](https://www.youtube.com/watch?v=KMkmA4i2FQc), by Patrick Löber +- [Build & Deploy a Fitness App with Python & HarperDB](https://www.youtube.com/watch?v=KMkmA4i2FQc), by Patrick Löber -* [Create a Discord Slash Bot using HarperDB Custom Functions](https://geekysrm.hashnode.dev/discord-slash-bot-with-harperdb-custom-functions), by Soumya Ranjan Mohanty +- [Create a Discord Slash Bot using HarperDB Custom Functions](https://geekysrm.hashnode.dev/discord-slash-bot-with-harperdb-custom-functions), by Soumya Ranjan Mohanty -* [How I used HarperDB Custom Functions to Build a Web App for my Newsletter](https://blog.hrithwik.me/how-i-used-harperdb-custom-functions-to-build-a-web-app-for-my-newsletter), by Hrithwik Bharadwaj +- [How I used HarperDB Custom Functions to Build a Web App for my Newsletter](https://blog.hrithwik.me/how-i-used-harperdb-custom-functions-to-build-a-web-app-for-my-newsletter), by Hrithwik Bharadwaj -* [How I used HarperDB Custom Functions and Recharts to create Dashboard](https://blog.greenroots.info/how-to-create-dashboard-with-harperdb-custom-functions-and-recharts), by Tapas Adhikary +- [How I used HarperDB Custom Functions and Recharts to create Dashboard](https://blog.greenroots.info/how-to-create-dashboard-with-harperdb-custom-functions-and-recharts), by Tapas Adhikary -* [How To Use HarperDB Custom Functions With Your React App](https://dev.to/tyaga001/how-to-use-harperdb-custom-functions-with-your-react-app-2c43), by Ankur Tyagi +- [How To Use HarperDB Custom Functions With Your React App](https://dev.to/tyaga001/how-to-use-harperdb-custom-functions-with-your-react-app-2c43), by Ankur Tyagi -* [Build a Web App Using HarperDB’s Custom Functions](https://www.youtube.com/watch?v=rz6prItVJZU), livestream by Jaxon Repp +- [Build a Web App Using HarperDB’s Custom Functions](https://www.youtube.com/watch?v=rz6prItVJZU), livestream by Jaxon Repp -* [How to Web Scrape Using Python, Snscrape & Custom Functions](https://hackernoon.com/how-to-web-scrape-using-python-snscrape-and-harperdb), by Davis David +- [How to Web Scrape Using Python, Snscrape & Custom Functions](https://hackernoon.com/how-to-web-scrape-using-python-snscrape-and-harperdb), by Davis David -* [What’s the Big Deal w/ Custom Functions](https://rss.com/podcasts/harperdb-select-star/278933/), Select* Podcast +- [What’s the Big Deal w/ Custom Functions](https://rss.com/podcasts/harperdb-select-star/278933/), Select\* Podcast diff --git a/site/versioned_docs/version-4.1/custom-functions/host-static.md b/site/versioned_docs/version-4.1/custom-functions/host-static.md index 40dc91ce..cae874b3 100644 --- a/site/versioned_docs/version-4.1/custom-functions/host-static.md +++ b/site/versioned_docs/version-4.1/custom-functions/host-static.md @@ -14,8 +14,8 @@ For further information on how to send specific files see the [@fastify/static]( ```javascript module.exports = async (server, { hdbCore, logger }) => { - server.register(require('@fastify/static'), { - root: path.join(__dirname, 'public'), - }) + server.register(require('@fastify/static'), { + root: path.join(__dirname, 'public'), + }); }; ``` diff --git a/site/versioned_docs/version-4.1/custom-functions/index.md b/site/versioned_docs/version-4.1/custom-functions/index.md index 4b97f156..af247047 100644 --- a/site/versioned_docs/version-4.1/custom-functions/index.md +++ b/site/versioned_docs/version-4.1/custom-functions/index.md @@ -6,23 +6,24 @@ title: Custom Functions Custom functions are a key part of building a complete HarperDB application. It is highly recommended that you use Custom Functions as the primary mechanism for your application to access your HarperDB database. Using Custom Functions gives you complete control over the accessible endpoints, how users are authenticated and authorized, what data is accessed from the database, and how it is aggregated and returned to users. -* Add your own API endpoints to a standalone API server inside HarperDB +- Add your own API endpoints to a standalone API server inside HarperDB -* Use HarperDB Core methods to interact with your data at lightning speed +- Use HarperDB Core methods to interact with your data at lightning speed -* Custom Functions are powered by Fastify, so they’re extremely flexible +- Custom Functions are powered by Fastify, so they’re extremely flexible -* Manage in HarperDB Studio, or use your own IDE and Version Management System +- Manage in HarperDB Studio, or use your own IDE and Version Management System -* Distribute your Custom Functions to all your HarperDB instances with a single click +- Distribute your Custom Functions to all your HarperDB instances with a single click --- -* [Requirements and Definitions](./requirements-definitions) -* [Create A Project](./create-project) +- [Requirements and Definitions](./requirements-definitions) -* [Define Routes](./define-routes) +- [Create A Project](./create-project) -* [Define Helpers](./define-helpers) +- [Define Routes](./define-routes) -* [Host a Static UI](./host-static) \ No newline at end of file +- [Define Helpers](./define-helpers) + +- [Host a Static UI](./host-static) diff --git a/site/versioned_docs/version-4.1/custom-functions/requirements-definitions.md b/site/versioned_docs/version-4.1/custom-functions/requirements-definitions.md index 2fc28f29..5fa59fdb 100644 --- a/site/versioned_docs/version-4.1/custom-functions/requirements-definitions.md +++ b/site/versioned_docs/version-4.1/custom-functions/requirements-definitions.md @@ -3,10 +3,12 @@ title: Requirements And Definitions --- # Requirements And Definitions + Before you get started with Custom Functions, here’s a primer on the basic configuration and the structure of a Custom Functions Project. ## Configuration -Custom Functions are configured in the harperdb-config.yaml file located in the operations API root directory (by default this is a directory named `hdb` located in the home directory of the current user). Below is a view of the Custom Functions' section of the config YAML file, plus descriptions of important Custom Functions settings. + +Custom Functions are configured in the harperdb-config.yaml file located in the operations API root directory (by default this is a directory named `hdb` located in the home directory of the current user). Below is a view of the Custom Functions' section of the config YAML file, plus descriptions of important Custom Functions settings. ```yaml customFunctions: @@ -28,22 +30,22 @@ customFunctions: privateKey: ~/hdb/keys/privateKey.pem ``` -* **`enabled`** +- **`enabled`** A boolean value that tells HarperDB to start the Custom Functions server. Set it to **true** to enable custom functions and **false** to disable. `enabled` is `true` by default. -* **`network.port`** +- **`network.port`** This is the port HarperDB will use to start a standalone Fastify Server dedicated to serving your Custom Functions’ routes. -* **`root`** +- **`root`** This is the root directory where your Custom Functions projects and their files will live. By default, it’s in your \, but you can locate it anywhere--in a developer folder next to your other development projects, for example. _Please visit our [configuration docs](../configuration) for a more comprehensive look at these settings._ ## Project Structure -**project folder** -The name of the folder that holds your project files serves as the root prefix for all the routes you create. All routes created in the **dogs** project folder will have a URL like this: **[https://my-server-url.com:9926/dogs/my/route](https://my-server-url.com:9926/dogs/my/route)**. As such, it’s important that any project folders you create avoid any characters that aren’t URL-friendly. You should avoid URL delimiters in your folder names. +**project folder** +The name of the folder that holds your project files serves as the root prefix for all the routes you create. All routes created in the **dogs** project folder will have a URL like this: **[https://my-server-url.com:9926/dogs/my/route](https://my-server-url.com:9926/dogs/my/route)**. As such, it’s important that any project folders you create avoid any characters that aren’t URL-friendly. You should avoid URL delimiters in your folder names. **/routes folder** @@ -51,13 +53,13 @@ Files in the **routes** folder define the requests that your Custom Functions se ```javascript module.exports = async (server, { hdbCore, logger }) => { - server.route({ - url: '/', - method: 'POST', - preValidation: hdbCore.preValidation, - handler: hdbCore.request, - }); -} + server.route({ + url: '/', + method: 'POST', + preValidation: hdbCore.preValidation, + handler: hdbCore.request, + }); +}; ``` **/helpers folder** @@ -65,7 +67,7 @@ module.exports = async (server, { hdbCore, logger }) => { These files are JavaScript modules that you can use in your handlers, or for custom `preValidation` hooks. Examples include calls to third party Authentication services, filters for results of calls to HarperDB, and custom error responses. As modules, you can use standard import and export functionality. ```javascript -"use strict"; +'use strict'; const dbFilter = (databaseResultsArray) => databaseResultsArray.filter((result) => result.showToApi === true); @@ -74,4 +76,4 @@ module.exports = dbFilter; **/static folder** -If you’d like to serve your visitors a static website, you can place the html and supporting files into a directory called **static**. The directory must have an **index.html** file, and can have as many supporting resources as are necessary in whatever subfolder structure you prefer within that **static** directory. \ No newline at end of file +If you’d like to serve your visitors a static website, you can place the html and supporting files into a directory called **static**. The directory must have an **index.html** file, and can have as many supporting resources as are necessary in whatever subfolder structure you prefer within that **static** directory. diff --git a/site/versioned_docs/version-4.1/custom-functions/restarting-server.md b/site/versioned_docs/version-4.1/custom-functions/restarting-server.md index b8352059..62fa0f63 100644 --- a/site/versioned_docs/version-4.1/custom-functions/restarting-server.md +++ b/site/versioned_docs/version-4.1/custom-functions/restarting-server.md @@ -8,11 +8,9 @@ One way to manage Custom Functions is through [HarperDB Studio](../harperdb-stud For any changes made to your routes, helpers, or projects, you’ll need to restart the Custom Functions server to see them take effect. HarperDB Studio does this automatically whenever you create or delete a project, or add, edit, or edit a route or helper. If you need to start the Custom Functions server yourself, you can use the following operation to do so: - - ```json { - "operation": "restart_service", - "service": "custom_functions" + "operation": "restart_service", + "service": "custom_functions" } -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.1/custom-functions/using-npm-git.md b/site/versioned_docs/version-4.1/custom-functions/using-npm-git.md index 4120fd17..c098e074 100644 --- a/site/versioned_docs/version-4.1/custom-functions/using-npm-git.md +++ b/site/versioned_docs/version-4.1/custom-functions/using-npm-git.md @@ -6,8 +6,6 @@ title: Using NPM and Git Custom function projects can be structured and managed like normal Node.js projects. You can include external dependencies, include them in your route and helper files, and manage your revisions without changing your development tooling or pipeline. +- To initialize your project to use npm packages, use the terminal to execute `npm init` from the root of your project folder. - -* To initialize your project to use npm packages, use the terminal to execute `npm init` from the root of your project folder. - -* To implement version control using git, use the terminal to execute `git init` from the root of your project folder. \ No newline at end of file +- To implement version control using git, use the terminal to execute `git init` from the root of your project folder. diff --git a/site/versioned_docs/version-4.1/getting-started/getting-started.md b/site/versioned_docs/version-4.1/getting-started/getting-started.md index 4fa0c95b..4e9af3b9 100644 --- a/site/versioned_docs/version-4.1/getting-started/getting-started.md +++ b/site/versioned_docs/version-4.1/getting-started/getting-started.md @@ -43,11 +43,11 @@ curl --location --request POST 'https://instance-subdomain.harperdbcloud.com' \ Breaking it down, there are only a few requirements for interacting with HarperDB: -* Using the HTTP POST method. -* Providing the URL of the HarperDB instance. -* Providing the Authorization header (more on using Basic authentication). -* Providing the Content-Type header. -* Providing a JSON body with the desired operation and any additional operation properties (shown in the --data-raw parameter). This is the only parameter that needs to be changed to execute alternative operations on HarperDB. +- Using the HTTP POST method. +- Providing the URL of the HarperDB instance. +- Providing the Authorization header (more on using Basic authentication). +- Providing the Content-Type header. +- Providing a JSON body with the desired operation and any additional operation properties (shown in the --data-raw parameter). This is the only parameter that needs to be changed to execute alternative operations on HarperDB. ### Video Tutorials diff --git a/site/versioned_docs/version-4.1/harperdb-cli.md b/site/versioned_docs/version-4.1/harperdb-cli.md index b7c1f9e0..0e8e5033 100644 --- a/site/versioned_docs/version-4.1/harperdb-cli.md +++ b/site/versioned_docs/version-4.1/harperdb-cli.md @@ -35,7 +35,7 @@ harperdb install harperdb install --TC_AGREEMENT yes --HDB_ADMIN_USERNAME HDB_ADMIN --HDB_ADMIN_PASSWORD password --ROOTPATH /tmp/hdb/ --OPERATIONSAPI_NETWORK_PORT 9925 ``` -*** +--- ## Starting HarperDB @@ -45,7 +45,7 @@ To start HarperDB after it is installed, run the following command: harperdb start ``` -*** +--- ## Stopping HarperDB @@ -55,7 +55,7 @@ To stop HarperDB once it is running, run the following command: harperdb stop ``` -*** +--- ## Restarting HarperDB @@ -65,7 +65,7 @@ To restart HarperDB once it is running, run the following command: harperdb restart ``` -*** +--- ## Managing HarperDB Service(s) @@ -79,12 +79,12 @@ harperdb restart --service "custom functions" The following services are managed via the above commands: -* HarperDB -* Custom Functions -* IPC -* Clustering +- HarperDB +- Custom Functions +- IPC +- Clustering -*** +--- ## Getting the HarperDB Version @@ -111,4 +111,5 @@ harperdb status ``` ## Backups -HarperDB uses a transactional commit process that ensures that data on disk is always transactionally consistent with storage. This means that HarperDB maintains safety of database integrity in the event of a crash. It also means that you can use any standard volume snapshot tool to make a backup of a HarperDB database. Database files are stored in the hdb/schemas directory (organized schema directories). As long as the snapshot is an atomic snapshot of these database files, the data can be copied/movied back into the schemas directory to restore a previous backup (with HarperDB shut down) , and database integrity will be preserved. Note that simply copying an in-use database file (using `cp`, for example) is _not_ a snapshot, and this would progressively read data from the database at different points in time, which yields unreliable copy that likely will not be usable. Standard copying is only reliable for a database file that is not in use. \ No newline at end of file + +HarperDB uses a transactional commit process that ensures that data on disk is always transactionally consistent with storage. This means that HarperDB maintains safety of database integrity in the event of a crash. It also means that you can use any standard volume snapshot tool to make a backup of a HarperDB database. Database files are stored in the hdb/schemas directory (organized schema directories). As long as the snapshot is an atomic snapshot of these database files, the data can be copied/movied back into the schemas directory to restore a previous backup (with HarperDB shut down) , and database integrity will be preserved. Note that simply copying an in-use database file (using `cp`, for example) is _not_ a snapshot, and this would progressively read data from the database at different points in time, which yields unreliable copy that likely will not be usable. Standard copying is only reliable for a database file that is not in use. diff --git a/site/versioned_docs/version-4.1/harperdb-cloud/alarms.md b/site/versioned_docs/version-4.1/harperdb-cloud/alarms.md index 26f28a24..11530aac 100644 --- a/site/versioned_docs/version-4.1/harperdb-cloud/alarms.md +++ b/site/versioned_docs/version-4.1/harperdb-cloud/alarms.md @@ -6,22 +6,18 @@ title: HarperDB Cloud Alarms HarperDB Cloud instance alarms are triggered when certain conditions are met. Once alarms are triggered organization owners will immediately receive an email alert and the alert will be available on the [Instance Configuration](../harperdb-studio/instance-configuration) page. The below table describes each alert and their evaluation metrics. - - ### Heading Definitions -* **Alarm**: Title of the alarm. +- **Alarm**: Title of the alarm. -* **Threshold**: Definition of the alarm threshold. +- **Threshold**: Definition of the alarm threshold. -* **Intervals**: The number of occurrences before an alarm is triggered and the period that the metric is evaluated over. +- **Intervals**: The number of occurrences before an alarm is triggered and the period that the metric is evaluated over. -* **Proposed Remedy**: Recommended solution to avoid the alert in the future. +- **Proposed Remedy**: Recommended solution to avoid the alert in the future. - -| Alarm | Threshold | Intervals | Proposed Remedy | -|---------|------------|-----------|----------------------------------------------------------------------------------------------------------------| +| Alarm | Threshold | Intervals | Proposed Remedy | +| ------- | ---------- | --------- | ----------------------------------------------------------------------------------------------------------- | | Storage | > 90% Disk | 1 x 5min | [Increased storage volume](../harperdb-studio/instance-configuration#update-instance-storage) | | CPU | > 90% Avg | 2 x 5min | [Increase instance size for additional CPUs](../harperdb-studio/instance-configuration#update-instance-ram) | | Memory | > 90% RAM | 2 x 5min | [Increase instance size](../harperdb-studio/instance-configuration#update-instance-ram) | - diff --git a/site/versioned_docs/version-4.1/harperdb-cloud/index.md b/site/versioned_docs/version-4.1/harperdb-cloud/index.md index d820c858..28e70b01 100644 --- a/site/versioned_docs/version-4.1/harperdb-cloud/index.md +++ b/site/versioned_docs/version-4.1/harperdb-cloud/index.md @@ -4,4 +4,4 @@ title: HarperDB Cloud # HarperDB Cloud -HarperDB Cloud is the easiest way to test drive HarperDB, it’s HarperDB-as-a-Service. Cloud handles deployment and management of your instances in just a few clicks. HarperDB Cloud is currently powered by AWS with additional cloud providers on our roadmap for the future. \ No newline at end of file +HarperDB Cloud is the easiest way to test drive HarperDB, it’s HarperDB-as-a-Service. Cloud handles deployment and management of your instances in just a few clicks. HarperDB Cloud is currently powered by AWS with additional cloud providers on our roadmap for the future. diff --git a/site/versioned_docs/version-4.1/harperdb-cloud/instance-size-hardware-specs.md b/site/versioned_docs/version-4.1/harperdb-cloud/instance-size-hardware-specs.md index c1badd67..ae3042b8 100644 --- a/site/versioned_docs/version-4.1/harperdb-cloud/instance-size-hardware-specs.md +++ b/site/versioned_docs/version-4.1/harperdb-cloud/instance-size-hardware-specs.md @@ -4,23 +4,21 @@ title: HarperDB Cloud Instance Size Hardware Specs # HarperDB Cloud Instance Size Hardware Specs -While HarperDB Cloud bills by RAM, each instance has other specifications associated with the RAM selection. The following table describes each instance size in detail*. +While HarperDB Cloud bills by RAM, each instance has other specifications associated with the RAM selection. The following table describes each instance size in detail\*. -| AWS EC2 Instance Size | RAM (GiB) | # vCPUs | Network (Gbps) | Processor | -|------------------------|------------|----------|-----------------|----------------------------------------| -| t3.nano | 0.5 | 2 | Up to 5 | 2.5 GHz Intel Xeon Platinum 8000 | -| t3.micro | 1 | 2 | Up to 5 | 2.5 GHz Intel Xeon Platinum 8000 | -| t3.small | 2 | 2 | Up to 5 | 2.5 GHz Intel Xeon Platinum 8000 | -| t3.medium | 4 | 2 | Up to 5 | 2.5 GHz Intel Xeon Platinum 8000 | -| m5.large | 8 | 2 | Up to 10 | Up to 3.1 GHz Intel Xeon Platinum 8000 | -| m5.xlarge | 16 | 4 | Up to 10 | Up to 3.1 GHz Intel Xeon Platinum 8000 | -| m5.2xlarge | 32 | 8 | Up to 10 | Up to 3.1 GHz Intel Xeon Platinum 8000 | -| m5.4xlarge | 64 | 16 | Up to 10 | Up to 3.1 GHz Intel Xeon Platinum 8000 | -| m5.8xlarge | 128 | 32 | 10 | Up to 3.1 GHz Intel Xeon Platinum 8000 | -| m5.12xlarge | 192 | 48 | 10 | Up to 3.1 GHz Intel Xeon Platinum 8000 | -| m5.16xlarge | 256 | 64 | 20 | Up to 3.1 GHz Intel Xeon Platinum 8000 | -| m5.24xlarge | 384 | 96 | 25 | Up to 3.1 GHz Intel Xeon Platinum 8000 | +| AWS EC2 Instance Size | RAM (GiB) | # vCPUs | Network (Gbps) | Processor | +| --------------------- | --------- | ------- | -------------- | -------------------------------------- | +| t3.nano | 0.5 | 2 | Up to 5 | 2.5 GHz Intel Xeon Platinum 8000 | +| t3.micro | 1 | 2 | Up to 5 | 2.5 GHz Intel Xeon Platinum 8000 | +| t3.small | 2 | 2 | Up to 5 | 2.5 GHz Intel Xeon Platinum 8000 | +| t3.medium | 4 | 2 | Up to 5 | 2.5 GHz Intel Xeon Platinum 8000 | +| m5.large | 8 | 2 | Up to 10 | Up to 3.1 GHz Intel Xeon Platinum 8000 | +| m5.xlarge | 16 | 4 | Up to 10 | Up to 3.1 GHz Intel Xeon Platinum 8000 | +| m5.2xlarge | 32 | 8 | Up to 10 | Up to 3.1 GHz Intel Xeon Platinum 8000 | +| m5.4xlarge | 64 | 16 | Up to 10 | Up to 3.1 GHz Intel Xeon Platinum 8000 | +| m5.8xlarge | 128 | 32 | 10 | Up to 3.1 GHz Intel Xeon Platinum 8000 | +| m5.12xlarge | 192 | 48 | 10 | Up to 3.1 GHz Intel Xeon Platinum 8000 | +| m5.16xlarge | 256 | 64 | 20 | Up to 3.1 GHz Intel Xeon Platinum 8000 | +| m5.24xlarge | 384 | 96 | 25 | Up to 3.1 GHz Intel Xeon Platinum 8000 | - - -*Specifications are subject to change. For the most up to date information, please refer to AWS documentation: [https://aws.amazon.com/ec2/instance-types/](https://aws.amazon.com/ec2/instance-types/). +\*Specifications are subject to change. For the most up to date information, please refer to AWS documentation: [https://aws.amazon.com/ec2/instance-types/](https://aws.amazon.com/ec2/instance-types/). diff --git a/site/versioned_docs/version-4.1/harperdb-cloud/iops-impact.md b/site/versioned_docs/version-4.1/harperdb-cloud/iops-impact.md index ab936d6e..99be73f7 100644 --- a/site/versioned_docs/version-4.1/harperdb-cloud/iops-impact.md +++ b/site/versioned_docs/version-4.1/harperdb-cloud/iops-impact.md @@ -7,9 +7,8 @@ title: IOPS Impact on Performance HarperDB, like any database, can place a tremendous load on its storage resources. Storage, not CPU or memory, will more often be the bottleneck of server, virtual machine, or a container running HarperDB. Understanding how storage works, and how much storage performance your workload requires, is key to ensuring that HarperDB performs as expected. ## IOPS Overview -The primary measure of storage performance is the number of input/output operations per second (IOPS) that a storage device can perform. Different storage devices can have dramatically different performance profiles. A hard drive (HDD) might only perform a hundred or so IOPS, while a solid state drive (SSD) might be able to perform tens or hundreds of thousands of IOPS. - +The primary measure of storage performance is the number of input/output operations per second (IOPS) that a storage device can perform. Different storage devices can have dramatically different performance profiles. A hard drive (HDD) might only perform a hundred or so IOPS, while a solid state drive (SSD) might be able to perform tens or hundreds of thousands of IOPS. Cloud providers like AWS, which powers HarperDB Cloud, don’t typically attach individual disks to a virtual machine or container. Instead, they combine large numbers of storage drives to create very high performance storage servers. Chunks (volumes) of that storage is then carved out and presented to many different virtual machines and containers. Due to the shared nature of this type of storage, the cloud provider places configurable limits on the number of IOPS that a volume can perform. The same way that cloud providers charge more for larger capacity volumes, they also charge more for volumes with more IOPS. @@ -17,33 +16,30 @@ Cloud providers like AWS, which powers HarperDB Cloud, don’t typically attach HarperDB Cloud utilizes AWS Elastic Block Storage (EBS) General Purpose SSD (gp3) volumes. This is the most common storage type used in AWS, as it provides reasonable performance for most workloads, at a reasonable price. - - AWS EBS gp3 volumes have a baseline performance level of 3,000 IOPS, as a result, all HarperDB Cloud storage options will offer 3,000 IOPS. We plan to offer scalable IOPS as an option in the future. - - You can read more about AWS EBS volume IOPS here: [https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html). ## Estimating IOPS for HarperDB Instance The number of IOPS required for a particular workload is influenced by many factors. Testing your particular application is the best way to determine the number of IOPS required. A reliable method is to estimate about two IOPS for every index, including the primary key itself. So if a table has two indices besides primary key, estimate that an insert or update will require about six IOPS. Note that that can often be closer to one IOPS per index under load due to internal batching of writes, and sometimes even better when doing sequential inserts. Again it is best to test to verify this with application specific data and write patterns. - - For assistance in estimating IOPS requirements feel free to contact HarperDB Support or join our Community Slack Channel. ## Example Use Case IOPS Requirements -* **Sensor Data Collection** +- **Sensor Data Collection** + + In case of IoT sensors where data collection will be sustained high IOPS are required. While there are not typically large queries going on in this case, there is a high volume of data being ingested. This implies that IOPS will be sustained at a high level. For example, if you are collection 100 records per second you would expect to need roughly 3,000 IOPS just to handle the data inserts. + +- **Data Analytics/BI Server** + + Providing a server for analytics purposes typically requires a larger machine. Typically these cases involve large scale SQL joins and aggregations, which puts a large strain on reads. HarperDB utilizes an in-memory cache, which provides a significant performance boost on machines with large amounts of memory. However, if disparate datasets are constantly being queried and/or new data is frequently being loaded, you will find that the system still needs to have high IOPS to meet performance demand. - In case of IoT sensors where data collection will be sustained high IOPS are required. While there are not typically large queries going on in this case, there is a high volume of data being ingested. This implies that IOPS will be sustained at a high level. For example, if you are collection 100 records per second you would expect to need roughly 3,000 IOPS just to handle the data inserts. -* **Data Analytics/BI Server** +- **Web Services** - Providing a server for analytics purposes typically requires a larger machine. Typically these cases involve large scale SQL joins and aggregations, which puts a large strain on reads. HarperDB utilizes an in-memory cache, which provides a significant performance boost on machines with large amounts of memory. However, if disparate datasets are constantly being queried and/or new data is frequently being loaded, you will find that the system still needs to have high IOPS to meet performance demand. -* **Web Services** + Typical web service implementations with discrete reads and writes often do not need high IOPS to perform as expected. This is often the case is more transactional systems without the requirement for high performance load. A good rule to follow is that any HarperDB operation that requires a data scan will be IOPS intensive, but if these are not frequent then the EBS boost will suffice. Queries utilizing equals operations in either SQL or NoSQL do not require a scan due to HarperDB’s native indexing. - Typical web service implementations with discrete reads and writes often do not need high IOPS to perform as expected. This is often the case is more transactional systems without the requirement for high performance load. A good rule to follow is that any HarperDB operation that requires a data scan will be IOPS intensive, but if these are not frequent then the EBS boost will suffice. Queries utilizing equals operations in either SQL or NoSQL do not require a scan due to HarperDB’s native indexing. -* **High Performance Database** +- **High Performance Database** - Ultimately, if performance is your top priority, HarperDB should be run on bare metal hardware. Cloud providers offer these options at a higher cost, but they come with obvious performance improvements. \ No newline at end of file + Ultimately, if performance is your top priority, HarperDB should be run on bare metal hardware. Cloud providers offer these options at a higher cost, but they come with obvious performance improvements. diff --git a/site/versioned_docs/version-4.1/harperdb-cloud/verizon-5g-wavelength-instances.md b/site/versioned_docs/version-4.1/harperdb-cloud/verizon-5g-wavelength-instances.md index 1addf12c..3ca1cdde 100644 --- a/site/versioned_docs/version-4.1/harperdb-cloud/verizon-5g-wavelength-instances.md +++ b/site/versioned_docs/version-4.1/harperdb-cloud/verizon-5g-wavelength-instances.md @@ -6,41 +6,27 @@ title: Verizon 5G Wavelength Instances These instances are only accessible from the Verizon network. When accessing your HarperDB instance please ensure you are connected to the Verizon network, examples include Verizon 5G Internet, Verizon Hotspots, or Verizon mobile devices. - - HarperDB on Verizon 5G Wavelength brings HarperDB closer to the end user exclusively on the Verizon network resulting in as little as single-digit millisecond response time from HarperDB to the client. - - Instances are built via AWS Wavelength. You can read more about [AWS Wavelength here](https://aws.amazon.com/wavelength/). HarperDB 5G Wavelength Instance Specs -While HarperDB 5G Wavelength bills by RAM, each instance has other specifications associated with the RAM selection. The following table describes each instance size in detail*. - -| AWS EC2 Instance Size | RAM (GiB) | # vCPUs | Network (Gbps) | Processor | -|------------------------|------------|----------|-----------------|---------------------------------------------| -| t3.medium | 4 | 2 | Up to 5 | Up to 3.1 GHz Intel Xeon Platinum Processor | -| t3.xlarge | 16 | 4 | Up to 5 | Up to 3.1 GHz Intel Xeon Platinum Processor | -| r5.2xlarge | 64 | 8 | Up to 10 | Up to 3.1 GHz Intel Xeon Platinum Processor | - - +While HarperDB 5G Wavelength bills by RAM, each instance has other specifications associated with the RAM selection. The following table describes each instance size in detail\*. +| AWS EC2 Instance Size | RAM (GiB) | # vCPUs | Network (Gbps) | Processor | +| --------------------- | --------- | ------- | -------------- | ------------------------------------------- | +| t3.medium | 4 | 2 | Up to 5 | Up to 3.1 GHz Intel Xeon Platinum Processor | +| t3.xlarge | 16 | 4 | Up to 5 | Up to 3.1 GHz Intel Xeon Platinum Processor | +| r5.2xlarge | 64 | 8 | Up to 10 | Up to 3.1 GHz Intel Xeon Platinum Processor | - -*Specifications are subject to change. For the most up to date information, please refer to [AWS documentation](https://aws.amazon.com/ec2/instance-types/). +\*Specifications are subject to change. For the most up to date information, please refer to [AWS documentation](https://aws.amazon.com/ec2/instance-types/). ## HarperDB 5G Wavelength Storage HarperDB 5G Wavelength utilizes AWS Elastic Block Storage (EBS) General Purpose SSD (gp2) volumes. This is the most common storage type used in AWS, as it provides reasonable performance for most workloads, at a reasonable price. - - AWS EBS gp2 volumes have a baseline performance level, which determines the number of IOPS it can perform indefinitely. The larger the volume, the higher it’s baseline performance. Additionally, smaller gp2 volumes are able to burst to a higher number of IOPS for periods of time. - - Smaller gp2 volumes are perfect for trying out the functionality of HarperDB, and might also work well for applications that don’t perform many database transactions. For applications that perform a moderate or high number of transactions, we recommend that you use a larger HarperDB volume. Learn more about the impact of IOPS on performance here. - - You can read more about [AWS EBS gp2 volume IOPS here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html#ebsvolumetypes_gp2). diff --git a/site/versioned_docs/version-4.1/harperdb-studio/create-account.md b/site/versioned_docs/version-4.1/harperdb-studio/create-account.md index 3b0f9a56..c78c4ef3 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/create-account.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/create-account.md @@ -3,24 +3,25 @@ title: Create a Studio Account --- # Create a Studio Account + Start at the [HarperDB Studio sign up page](https://studio.harperdb.io/sign-up). -1) Provide the following information: - * First Name - * Last Name - * Email Address - * Subdomain - - *Part of the URL that will be used to identify your HarperDB Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com).* - * Coupon Code (optional) -2) Review the Privacy Policy and Terms of Service. -3) Click the sign up for free button. -4) You will be taken to a new screen to add an account password. Enter your password. - *Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character.* -5) Click the add account password button. +1. Provide the following information: + - First Name + - Last Name + - Email Address + - Subdomain -You will receive a Studio welcome email confirming your registration. + _Part of the URL that will be used to identify your HarperDB Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com)._ + - Coupon Code (optional) +2. Review the Privacy Policy and Terms of Service. +3. Click the sign up for free button. +4. You will be taken to a new screen to add an account password. Enter your password. + _Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character._ +5. Click the add account password button. + +You will receive a Studio welcome email confirming your registration. -Note: Your email address will be used as your username and cannot be changed. \ No newline at end of file +Note: Your email address will be used as your username and cannot be changed. diff --git a/site/versioned_docs/version-4.1/harperdb-studio/enable-mixed-content.md b/site/versioned_docs/version-4.1/harperdb-studio/enable-mixed-content.md index 7a3c8524..5a198b91 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/enable-mixed-content.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/enable-mixed-content.md @@ -6,6 +6,4 @@ title: Enable Mixed Content Enabling mixed content is required in cases where you would like to connect the HarperDB Studio to HarperDB Instances via HTTP. This should not be used for production systems, but may be convenient for development and testing purposes. Doing so will allow your browser to reach HTTP traffic, which is considered insecure, through an HTTPS site like the Studio. - - A comprehensive guide is provided by Adobe [here](https://experienceleague.adobe.com/docs/target/using/experiences/vec/troubleshoot-composer/mixed-content.html). diff --git a/site/versioned_docs/version-4.1/harperdb-studio/index.md b/site/versioned_docs/version-4.1/harperdb-studio/index.md index 78d1ebb4..d3cdbaeb 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/index.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/index.md @@ -3,13 +3,17 @@ title: HarperDB Studio --- # HarperDB Studio + HarperDB Studio is the web-based GUI for HarperDB. Studio enables you to administer, navigate, and monitor all of your HarperDB instances in a simple, user friendly interface without any knowledge of the underlying HarperDB API. It’s free to sign up, get started today! [Sign up for free!](https://studio.harperdb.io/sign-up) --- + ## How does Studio Work? + While HarperDB Studio is web based and hosted by us, all database interactions are performed on the HarperDB instance the studio is connected to. The HarperDB Studio loads in your browser, at which point you login to your HarperDB instances. Credentials are stored in your browser cache and are not transmitted back to HarperDB. All database interactions are made via the HarperDB Operations API directly from your browser to your instance. ## What type of instances can I manage? -HarperDB Studio enables users to manage both HarperDB Cloud instances and privately hosted instances all from a single UI. All HarperDB instances feature identical behavior whether they are hosted by us or by you. \ No newline at end of file + +HarperDB Studio enables users to manage both HarperDB Cloud instances and privately hosted instances all from a single UI. All HarperDB instances feature identical behavior whether they are hosted by us or by you. diff --git a/site/versioned_docs/version-4.1/harperdb-studio/instance-configuration.md b/site/versioned_docs/version-4.1/harperdb-studio/instance-configuration.md index 618daceb..64a802af 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/instance-configuration.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/instance-configuration.md @@ -6,69 +6,61 @@ title: Instance Configuration HarperDB instance configuration can be viewed and managed directly through the HarperDB Studio. HarperDB Cloud instances can be resized in two different ways via this page, either by modifying machine RAM or by increasing drive storage. User-installed instances can have their licenses modified by modifying licensed RAM. - - All instance configuration is handled through the **config** page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click config in the instance control bar. +4. Click config in the instance control bar. -*Note, the **config** page will only be available to super users and certain items are restricted to Studio organization owners.* +_Note, the **config** page will only be available to super users and certain items are restricted to Studio organization owners._ ## Instance Overview The **instance overview** panel displays the following instance specifications: -* Instance URL +- Instance URL -* Instance Node Name (for clustering) +- Instance Node Name (for clustering) -* Instance API Auth Header (this user) - - *The Basic authentication header used for the logged in HarperDB database user* +- Instance API Auth Header (this user) -* Created Date (HarperDB Cloud only) + _The Basic authentication header used for the logged in HarperDB database user_ -* Region (HarperDB Cloud only) - - *The geographic region where the instance is hosted.* +- Created Date (HarperDB Cloud only) -* Total Price +- Region (HarperDB Cloud only) -* RAM + _The geographic region where the instance is hosted._ -* Storage (HarperDB Cloud only) +- Total Price -* Disk IOPS (HarperDB Cloud only) +- RAM -## Update Instance RAM +- Storage (HarperDB Cloud only) -HarperDB Cloud instance size and user-installed instance licenses can be modified with the following instructions. This option is only available to Studio organization owners. +- Disk IOPS (HarperDB Cloud only) +## Update Instance RAM +HarperDB Cloud instance size and user-installed instance licenses can be modified with the following instructions. This option is only available to Studio organization owners. Note: For HarperDB Cloud instances, upgrading RAM may add additional CPUs to your instance as well. Click here to see how many CPUs are provisioned for each instance size. -1) In the **update ram** panel at the bottom left: +1. In the **update ram** panel at the bottom left: + - Select the new instance size. + - If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. + - If you do have a credit card associated, you will be presented with the updated billing information. + - Click **Upgrade**. - * Select the new instance size. - - * If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. - - * If you do have a credit card associated, you will be presented with the updated billing information. - - * Click **Upgrade**. - -2) The instance will shut down and begin reprovisioning/relicensing itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. +2. The instance will shut down and begin reprovisioning/relicensing itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. -3) Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. +3. Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. -*Note, if HarperDB Cloud instance reprovisioning takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new).* +_Note, if HarperDB Cloud instance reprovisioning takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new)._ ## Update Instance Storage @@ -76,44 +68,39 @@ The HarperDB Cloud instance storage size can be increased with the following ins Note: Instance storage can only be upgraded once every 6 hours. -1) In the **update storage** panel at the bottom left: - - * Select the new instance storage size. +1. In the **update storage** panel at the bottom left: + - Select the new instance storage size. - * If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. + - If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. - * If you do have a credit card associated, you will be presented with the updated billing information. + - If you do have a credit card associated, you will be presented with the updated billing information. - * Click **Upgrade**. + - Click **Upgrade**. -2) The instance will shut down and begin reprovisioning itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. +2. The instance will shut down and begin reprovisioning itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. -3) Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. +3. Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. -*Note, if this process takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new).* +_Note, if this process takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new)._ ## Remove Instance The HarperDB instance can be deleted/removed from the Studio with the following instructions. Once this operation is started it cannot be undone. This option is only available to Studio organization owners. -1) In the **remove instance** panel at the bottom left: - * Enter the instance name in the text box. - - * The Studio will present you with a warning. - - * Click **Remove**. - -2) The instance will begin deleting immediately. - +1. In the **remove instance** panel at the bottom left: + - Enter the instance name in the text box. + - The Studio will present you with a warning. + - Click **Remove**. + +2. The instance will begin deleting immediately. + ## Restart Instance The HarperDB Cloud instance can be restarted with the following instructions. -1) In the **restart instance** panel at the bottom right: - * Enter the instance name in the text box. - - * The Studio will present you with a warning. - - * Click **Restart**. - -2) The instance will begin restarting immediately. \ No newline at end of file +1. In the **restart instance** panel at the bottom right: + - Enter the instance name in the text box. + - The Studio will present you with a warning. + - Click **Restart**. + +2. The instance will begin restarting immediately. diff --git a/site/versioned_docs/version-4.1/harperdb-studio/instance-example-code.md b/site/versioned_docs/version-4.1/harperdb-studio/instance-example-code.md index 3869f4af..d5805510 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/instance-example-code.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/instance-example-code.md @@ -6,57 +6,55 @@ title: Instance Example Code Example code prepopulated with the instance URL and authorization token for the logged in database user can be found on the **example code** page of the HarperDB Studio. Code samples are generated based on the HarperDB API Documentation Postman collection. Code samples accessed with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **example code** in the instance control bar. +4. Click **example code** in the instance control bar. -5) Select the appropriate **category** from the left navigation. +5. Select the appropriate **category** from the left navigation. -6) Select the appropriate **operation** from the left navigation. +6. Select the appropriate **operation** from the left navigation. -7) Select your desired language/variant from the **Choose Programming Language** dropdown. +7. Select your desired language/variant from the **Choose Programming Language** dropdown. -8) Copy code from the sample code panel using the copy icon. +8. Copy code from the sample code panel using the copy icon. ## Supported Languages Sample code uses two identifiers: **language** and **variant**. -* **language** is the programming language that the sample code is generated in. +- **language** is the programming language that the sample code is generated in. -* **variant** is the methodology or library used by the language to send HarperDB requests. +- **variant** is the methodology or library used by the language to send HarperDB requests. The list of available language/variants are as follows: -| Language | Variant | -|--------------|---------------| -| C# | RestSharp | -| cURL | cURL | -| Go | Native | -| HTTP | HTTP | -| Java | OkHttp | -| Java | Unirest | -| JavaScript | Fetch | -| JavaScript | jQuery | -| JavaScript | XHR | -| NodeJs | Axios | -| NodeJs | Native | -| NodeJs | Request | -| NodeJs | Unirest | -| Objective-C | NSURLSession | -| OCaml | Cohttp | -| PHP | cURL | -| PHP | HTTP_Request2 | -| PowerShell | RestMethod | -| Python | http.client | -| Python | Requests | -| Ruby | Net:HTTP | -| Shell | Httpie | -| Shell | wget | -| Swift | URLSession | - - +| Language | Variant | +| ----------- | ------------- | +| C# | RestSharp | +| cURL | cURL | +| Go | Native | +| HTTP | HTTP | +| Java | OkHttp | +| Java | Unirest | +| JavaScript | Fetch | +| JavaScript | jQuery | +| JavaScript | XHR | +| NodeJs | Axios | +| NodeJs | Native | +| NodeJs | Request | +| NodeJs | Unirest | +| Objective-C | NSURLSession | +| OCaml | Cohttp | +| PHP | cURL | +| PHP | HTTP_Request2 | +| PowerShell | RestMethod | +| Python | http.client | +| Python | Requests | +| Ruby | Net:HTTP | +| Shell | Httpie | +| Shell | wget | +| Swift | URLSession | diff --git a/site/versioned_docs/version-4.1/harperdb-studio/instance-metrics.md b/site/versioned_docs/version-4.1/harperdb-studio/instance-metrics.md index 156208ab..7a3f18e3 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/instance-metrics.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/instance-metrics.md @@ -6,14 +6,14 @@ title: Instance Metrics The HarperDB Studio display instance status and metrics on the instance status page, which can be accessed with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **status** in the instance control bar. +4. Click **status** in the instance control bar. Once on the instance browse page you can view host system information, [HarperDB logs](../logging), and HarperDB Cloud alarms (if it is a cloud instance). -*Note, the **status** page will only be available to super users.* \ No newline at end of file +_Note, the **status** page will only be available to super users._ diff --git a/site/versioned_docs/version-4.1/harperdb-studio/instances.md b/site/versioned_docs/version-4.1/harperdb-studio/instances.md index 1b5ff3aa..5ebb4ccd 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/instances.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/instances.md @@ -6,116 +6,121 @@ title: Instances The HarperDB Studio allows you to administer all of your HarperDB instances in one place. HarperDB currently offers the following instance types: -* **HarperDB Cloud Instance** -Managed installations of HarperDB, what we call HarperDB Cloud. -* **5G Wavelength Instance** -Managed installations of HarperDB running on the Verizon network through AWS Wavelength, what we call 5G Wavelength Instances. *Note, these instances are only accessible via the Verizon network.* -* **User-Installed Instance** -Any HarperDB installation that is managed by you. These include instances hosted within your cloud provider accounts (for example, from the AWS or Digital Ocean Marketplaces), privately hosted instances, or instances installed locally. +- **HarperDB Cloud Instance** + Managed installations of HarperDB, what we call HarperDB Cloud. +- **5G Wavelength Instance** + Managed installations of HarperDB running on the Verizon network through AWS Wavelength, what we call 5G Wavelength Instances. _Note, these instances are only accessible via the Verizon network._ +- **User-Installed Instance** + Any HarperDB installation that is managed by you. These include instances hosted within your cloud provider accounts (for example, from the AWS or Digital Ocean Marketplaces), privately hosted instances, or instances installed locally. All interactions between the Studio and your instances take place directly from your browser. HarperDB stores metadata about your instances, which enables the Studio to display these instances when you log in. Beyond that, all traffic is routed from your browser to the HarperDB instances using the standard [HarperDB API](https://api.harperdb.io/). ## Organization Instance List + A summary view of all instances within an organization can be viewed by clicking on the appropriate organization from the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. Each instance gets their own card. HarperDB Cloud and user-installed instances are listed together. ## Create a New Instance -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization for the instance to be created under. -3) Click the **Create New HarperDB Cloud Instance + Register User-Installed Instance** card. -4) Select your desired Instance Type. -5) For a HarperDB Cloud Instance or a HarperDB 5G Wavelength Instance, click **Create HarperDB Cloud Instance**. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +2. Click the appropriate organization for the instance to be created under. +3. Click the **Create New HarperDB Cloud Instance + Register User-Installed Instance** card. +4. Select your desired Instance Type. +5. For a HarperDB Cloud Instance or a HarperDB 5G Wavelength Instance, click **Create HarperDB Cloud Instance**. + 1. Fill out Instance Info. + 1. Enter Instance Name - 1) Fill out Instance Info. - 1) Enter Instance Name + _This will be used to build your instance URL. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com). The Instance URL will be previewed below._ - *This will be used to build your instance URL. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com). The Instance URL will be previewed below.* + 2. Enter Instance Username - 2) Enter Instance Username + _This is the username of the initial HarperDB instance super user._ - *This is the username of the initial HarperDB instance super user.* + 3. Enter Instance Password - 3) Enter Instance Password + _This is the password of the initial HarperDB instance super user._ - *This is the password of the initial HarperDB instance super user.* + 2. Click **Instance Details** to move to the next page. + 3. Select Instance Specs + 1. Select Instance RAM - 2) Click **Instance Details** to move to the next page. - 3) Select Instance Specs + _HarperDB Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance. More on instance specs._ - 1) Select Instance RAM + 2. Select Storage Size - *HarperDB Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance. More on instance specs.* + _Each instance has a mounted storage volume where your HarperDB data will reside. Storage is provisioned based on space and IOPS. More on IOPS Impact on Performance._ - 2) Select Storage Size + 3. Select Instance Region - *Each instance has a mounted storage volume where your HarperDB data will reside. Storage is provisioned based on space and IOPS. More on IOPS Impact on Performance.* + _The geographic area where your instance will be provisioned._ - 3) Select Instance Region + 4. Click **Confirm Instance Details** to move to the next page. + 5. Review your Instance Details, if there is an error, use the back button to correct it. + 6. Review the [Privacy Policy](https://harperdb.io/legal/privacy-policy/) and [Terms of Service](https://harperdb.io/legal/harperdb-cloud-terms-of-service/), if you agree, click the **I agree** radio button to confirm. + 7. Click **Add Instance**. + 8. Your HarperDB Cloud instance will be provisioned in the background. Provisioning typically takes 5-15 minutes. You will receive an email notification when your instance is ready. - *The geographic area where your instance will be provisioned.* +## Register User-Installed Instance - 4) Click **Confirm Instance Details** to move to the next page. - 5) Review your Instance Details, if there is an error, use the back button to correct it. - 6) Review the [Privacy Policy](https://harperdb.io/legal/privacy-policy/) and [Terms of Service](https://harperdb.io/legal/harperdb-cloud-terms-of-service/), if you agree, click the **I agree** radio button to confirm. - 7) Click **Add Instance**. - 8) Your HarperDB Cloud instance will be provisioned in the background. Provisioning typically takes 5-15 minutes. You will receive an email notification when your instance is ready. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +2. Click the appropriate organization for the instance to be created under. +3. Click the **Create New HarperDB Cloud Instance + Register User-Installed Instance** card. +4. Select **Register User-Installed Instance**. + 1. Fill out Instance Info. + 1. Enter Instance Name -## Register User-Installed Instance + _This is used for descriptive purposes only._ + + 2. Enter Instance Username + + _The username of a HarperDB super user that is already configured in your HarperDB installation._ -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization for the instance to be created under. -3) Click the **Create New HarperDB Cloud Instance + Register User-Installed Instance** card. -4) Select **Register User-Installed Instance**. - 1) Fill out Instance Info. + 3. Enter Instance Password - 1) Enter Instance Name + _The password of a HarperDB super user that is already configured in your HarperDB installation._ - *This is used for descriptive purposes only.* - 2) Enter Instance Username + 4. Enter Host - *The username of a HarperDB super user that is already configured in your HarperDB installation.* - 3) Enter Instance Password + _The host to access the HarperDB instance. For example, `harperdb.myhost.com` or `localhost`._ - *The password of a HarperDB super user that is already configured in your HarperDB installation.* - 4) Enter Host + 5. Enter Port - *The host to access the HarperDB instance. For example, `harperdb.myhost.com` or `localhost`.* - 5) Enter Port + _The port to access the HarperDB instance. HarperDB defaults `9925`._ - *The port to access the HarperDB instance. HarperDB defaults `9925`.* - 6) Select SSL + 6. Select SSL - *If your instance is running over SSL, select the SSL checkbox. If not, you will need to enable mixed content in your browser to allow the HTTPS Studio to access the HTTP instance. If there are issues connecting to the instance, the Studio will display a red error message.* + _If your instance is running over SSL, select the SSL checkbox. If not, you will need to enable mixed content in your browser to allow the HTTPS Studio to access the HTTP instance. If there are issues connecting to the instance, the Studio will display a red error message._ - 2) Click **Instance Details** to move to the next page. - 3) Select Instance Specs - 1) Select Instance RAM + 2. Click **Instance Details** to move to the next page. + 3. Select Instance Specs + 1. Select Instance RAM - *HarperDB instances are billed based on Instance RAM. Selecting additional RAM will enable the ability for faster and more complex queries.* - 4) Click **Confirm Instance Details** to move to the next page. - 5) Review your Instance Details, if there is an error, use the back button to correct it. - 6) Review the [Privacy Policy](https://harperdb.io/legal/privacy-policy/) and [Terms of Service](https://harperdb.io/legal/harperdb-cloud-terms-of-service/), if you agree, click the **I agree** radio button to confirm. - 7) Click **Add Instance**. - 8) The HarperDB Studio will register your instance and restart it for the registration to take effect. Your instance will be immediately available after this is complete. + _HarperDB instances are billed based on Instance RAM. Selecting additional RAM will enable the ability for faster and more complex queries._ + + 4. Click **Confirm Instance Details** to move to the next page. + 5. Review your Instance Details, if there is an error, use the back button to correct it. + 6. Review the [Privacy Policy](https://harperdb.io/legal/privacy-policy/) and [Terms of Service](https://harperdb.io/legal/harperdb-cloud-terms-of-service/), if you agree, click the **I agree** radio button to confirm. + 7. Click **Add Instance**. + 8. The HarperDB Studio will register your instance and restart it for the registration to take effect. Your instance will be immediately available after this is complete. ## Delete an Instance Instance deletion has two different behaviors depending on the instance type. -* **HarperDB Cloud Instance** -This instance will be permanently deleted, including all data. This process is irreversible and cannot be undone. -* **User-Installed Instance** -The instance will be removed from the HarperDB Studio only. This does not uninstall HarperDB from your system and your data will remain intact. +- **HarperDB Cloud Instance** + This instance will be permanently deleted, including all data. This process is irreversible and cannot be undone. +- **User-Installed Instance** + The instance will be removed from the HarperDB Studio only. This does not uninstall HarperDB from your system and your data will remain intact. An instance can be deleted as follows: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. -3) Identify the proper instance card and click the trash can icon. -4) Enter the instance name into the text box. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +2. Click the appropriate organization that the instance belongs to. +3. Identify the proper instance card and click the trash can icon. +4. Enter the instance name into the text box. + + _This is done for confirmation purposes to ensure you do not accidentally delete an instance._ - *This is done for confirmation purposes to ensure you do not accidentally delete an instance.* -5) Click the **Do It** button. +5. Click the **Do It** button. ## Upgrade an Instance @@ -125,20 +130,22 @@ HarperDB instances can be resized on the [Instance Configuration](./instance-con The Studio enables users to log in and out of different database users from the instance control panel. To log out of an instance: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. -3) Identify the proper instance card and click the lock icon. -4) You will immediately be logged out of the instance. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +2. Click the appropriate organization that the instance belongs to. +3. Identify the proper instance card and click the lock icon. +4. You will immediately be logged out of the instance. To log in to an instance: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. -3) Identify the proper instance card, it will have an unlocked icon and a status reading PLEASE LOG IN, and click the center of the card. -4) Enter the database username. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +2. Click the appropriate organization that the instance belongs to. +3. Identify the proper instance card, it will have an unlocked icon and a status reading PLEASE LOG IN, and click the center of the card. +4. Enter the database username. + + _The username of a HarperDB user that is already configured in your HarperDB instance._ + +5. Enter the database password. + + _The password of a HarperDB user that is already configured in your HarperDB instance._ - *The username of a HarperDB user that is already configured in your HarperDB instance.* -5) Enter the database password. - - *The password of a HarperDB user that is already configured in your HarperDB instance.* -6) Click **Log In**. \ No newline at end of file +6. Click **Log In**. diff --git a/site/versioned_docs/version-4.1/harperdb-studio/login-password-reset.md b/site/versioned_docs/version-4.1/harperdb-studio/login-password-reset.md index 46254627..163a6dee 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/login-password-reset.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/login-password-reset.md @@ -8,35 +8,35 @@ title: Login and Password Reset To log into your existing HarperDB Studio account: -1) Navigate to the [HarperDB Studio](https://studio.harperdb.io/). -2) Enter your email address. -3) Enter your password. -4) Click **sign in**. +1. Navigate to the [HarperDB Studio](https://studio.harperdb.io/). +2. Enter your email address. +3. Enter your password. +4. Click **sign in**. ## Reset a Forgotten Password To reset a forgotten password: -1) Navigate to the HarperDB Studio password reset page. -2) Enter your email address. -3) Click **send password reset email**. -4) If the account exists, you will receive an email with a temporary password. -5) Navigate back to the HarperDB Studio login page. -6) Enter your email address. -7) Enter your temporary password. -8) Click **sign in**. -9) You will be taken to a new screen to reset your account password. Enter your new password. -*Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character.* -10) Click the **add account password** button. +1. Navigate to the HarperDB Studio password reset page. +2. Enter your email address. +3. Click **send password reset email**. +4. If the account exists, you will receive an email with a temporary password. +5. Navigate back to the HarperDB Studio login page. +6. Enter your email address. +7. Enter your temporary password. +8. Click **sign in**. +9. You will be taken to a new screen to reset your account password. Enter your new password. + _Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character._ +10. Click the **add account password** button. ## Change Your Password If you are already logged into the Studio, you can change your password though the user interface. -1) Navigate to the HarperDB Studio profile page. -2) In the **password** section, enter: +1. Navigate to the HarperDB Studio profile page. +2. In the **password** section, enter: + - Current password. + - New password. + - New password again _(for verification)_. - * Current password. - * New password. - * New password again *(for verification)*. -4) Click the **Update Password** button. \ No newline at end of file +3. Click the **Update Password** button. diff --git a/site/versioned_docs/version-4.1/harperdb-studio/manage-charts.md b/site/versioned_docs/version-4.1/harperdb-studio/manage-charts.md index b12a0776..c2b48a55 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/manage-charts.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/manage-charts.md @@ -6,74 +6,73 @@ title: Charts The HarperDB Studio includes a charting feature within an instance. They are generated in real time based on your existing data and automatically refreshed every 15 seconds. Instance charts can be accessed with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. -3) Select your desired instance. -4) Click **charts** in the instance control bar. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +2. Click the appropriate organization that the instance belongs to. +3. Select your desired instance. +4. Click **charts** in the instance control bar. ## Creating a New Chart Charts are generated based on SQL queries, therefore to build a new chart you first need to build a query. Instructions as follows (starting on the charts page described above): -1) Click **query** in the instance control bar. -2) Enter the SQL query you would like to generate a chart from. - - *For example, using the dog demo data from the API Docs, we can get the average dog age per owner with the following query: `SELECT AVG(age) as avg_age, owner_name FROM dev.dog GROUP BY owner_name`.* - -3) Click **Execute**. - -4) Click **create chart** at the top right of the results table. - -5) Configure your chart. - - 1) Choose chart type. - - *HarperDB Studio offers many standard charting options like line, bar, etc.* - - 2) Choose a data column. - - *This column will be used to plot the data point. Typically, this is the values being calculated in the `SELECT` statement. Depending on the chart type, you can select multiple data columns to display on a single chart.* - 3) Depending on the chart type, you will need to select a grouping. - - *This could be labeled as x-axis, label, etc. This will be used to group the data, typically this is what you used in your **GROUP BY** clause.* - - 4) Enter a chart name. - - *Used for identification purposes and will be displayed at the top of the chart.* - - 5) Choose visible to all org users toggle. - - *Leaving this option off will limit chart visibility to just your HarperDB Studio user. Toggling it on will enable all users with this Organization to view this chart.* - - 6) Click **Add Chart**. - - 7) The chart will now be visible on the **charts** page. - +1. Click **query** in the instance control bar. +2. Enter the SQL query you would like to generate a chart from. + + _For example, using the dog demo data from the API Docs, we can get the average dog age per owner with the following query: `SELECT AVG(age) as avg_age, owner_name FROM dev.dog GROUP BY owner_name`._ + +3. Click **Execute**. + +4. Click **create chart** at the top right of the results table. + +5. Configure your chart. + 1. Choose chart type. + + _HarperDB Studio offers many standard charting options like line, bar, etc._ + + 2. Choose a data column. + + _This column will be used to plot the data point. Typically, this is the values being calculated in the `SELECT` statement. Depending on the chart type, you can select multiple data columns to display on a single chart._ + + 3. Depending on the chart type, you will need to select a grouping. + + _This could be labeled as x-axis, label, etc. This will be used to group the data, typically this is what you used in your **GROUP BY** clause._ + + 4. Enter a chart name. + + _Used for identification purposes and will be displayed at the top of the chart._ + + 5. Choose visible to all org users toggle. + + _Leaving this option off will limit chart visibility to just your HarperDB Studio user. Toggling it on will enable all users with this Organization to view this chart._ + + 6. Click **Add Chart**. + 7. The chart will now be visible on the **charts** page. + The example query above, configured as a bar chart, results in the following chart: ![Average Age per Owner Example](/img/v4.1/ave-age-per-owner-ex.png) - ## Downloading Charts + HarperDB Studio charts can be downloaded in SVG, PNG, and CSV format. Instructions as follows (starting on the charts page described above): -1) Identify the chart you would like to export. -2) Click the three bars icon. +1. Identify the chart you would like to export. +2. Click the three bars icon. -3) Select the appropriate download option. +3. Select the appropriate download option. -4) The Studio will generate the export and begin downloading immediately. +4. The Studio will generate the export and begin downloading immediately. ## Delete a Chart Delete a chart as follows (starting on the charts page described above): -1) Identify the chart you would like to delete. +1. Identify the chart you would like to delete. -2) Click the X icon. +2. Click the X icon. -3) Click the **confirm delete chart** button. +3. Click the **confirm delete chart** button. -4) The chart will be deleted. +4. The chart will be deleted. -Deleting a chart that is visible to all Organization users will delete it for all users. \ No newline at end of file +Deleting a chart that is visible to all Organization users will delete it for all users. diff --git a/site/versioned_docs/version-4.1/harperdb-studio/manage-clustering.md b/site/versioned_docs/version-4.1/harperdb-studio/manage-clustering.md index 36418e18..7872fc09 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/manage-clustering.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/manage-clustering.md @@ -6,70 +6,69 @@ title: Manage Clustering HarperDB instance clustering and replication can be configured directly through the HarperDB Studio. It is recommended to read through the clustering documentation first to gain a strong understanding of HarperDB clustering behavior. - - All clustering configuration is handled through the **cluster** page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **cluster** in the instance control bar. +4. Click **cluster** in the instance control bar. Note, the **cluster** page will only be available to super users. --- + ## Initial Configuration HarperDB instances do not have clustering configured by default. The HarperDB Studio will walk you through the initial configuration. Upon entering the **cluster** screen for the first time you will need to complete the following configuration. Configurations are set in the **enable clustering** panel on the left while actions are described in the middle of the screen. -1) Create a cluster user, read more about this here: Clustering Users and Roles. - * Enter username. - - * Enter password. - - * Click **Create Cluster User**. - -2) Click **Set Cluster Node Name**. -3) Click **Enable Instance Clustering**. - +1. Create a cluster user, read more about this here: Clustering Users and Roles. + - Enter username. + - Enter password. + - Click **Create Cluster User**. + +2. Click **Set Cluster Node Name**. +3. Click **Enable Instance Clustering**. + At this point the Studio will restart your HarperDB Instance, required for the configuration changes to take effect. --- ## Manage Clustering + Once initial clustering configuration is completed you a presented with a clustering management screen with the following properties: -* **connected instances** +- **connected instances** + + Displays all instances within the Studio Organization that this instance manages a connection with. - Displays all instances within the Studio Organization that this instance manages a connection with. +- **unconnected instances** -* **unconnected instances** + Displays all instances within the Studio Organization that this instance does not manage a connection with. - Displays all instances within the Studio Organization that this instance does not manage a connection with. +- **unregistered instances** -* **unregistered instances** + Displays all instances outside of the Studio Organization that this instance manages a connection with. - Displays all instances outside of the Studio Organization that this instance manages a connection with. +- **manage clustering** -* **manage clustering** + Once instances are connected, this will display clustering management options for all connected instances and all schemas and tables. - Once instances are connected, this will display clustering management options for all connected instances and all schemas and tables. --- ## Connect an Instance HarperDB Instances can be clustered together with the following instructions. -1) Ensure clustering has been configured on both instances and a cluster user with identical credentials exists on both. +1. Ensure clustering has been configured on both instances and a cluster user with identical credentials exists on both. -2) Identify the instance you would like to connect from the **unconnected instances** panel. +2. Identify the instance you would like to connect from the **unconnected instances** panel. -3) Click the plus icon next the appropriate instance. +3. Click the plus icon next the appropriate instance. -4) If configurations are correct, all schemas will sync across the cluster, then appear in the **manage clustering** panel. If there is a configuration issue, a red exclamation icon will appear, click it to learn more about what could be causing the issue. +4. If configurations are correct, all schemas will sync across the cluster, then appear in the **manage clustering** panel. If there is a configuration issue, a red exclamation icon will appear, click it to learn more about what could be causing the issue. --- @@ -77,9 +76,9 @@ HarperDB Instances can be clustered together with the following instructions. HarperDB Instances can be disconnected with the following instructions. -1) Identify the instance you would like to disconnect from the **connected instances** panel. +1. Identify the instance you would like to disconnect from the **connected instances** panel. -2) Click the minus icon next the appropriate instance. +2. Click the minus icon next the appropriate instance. --- @@ -87,8 +86,8 @@ HarperDB Instances can be disconnected with the following instructions. Subscriptions must be configured in order to move data between connected instances. Read more about subscriptions here: Creating A Subscription. The **manage clustering** panel displays a table with each row representing an channel per instance. Cells are bolded to indicate a change in the column. Publish and subscribe replication can be configured per table with the following instructions: -1) Identify the instance, schema, and table for replication to be configured. +1. Identify the instance, schema, and table for replication to be configured. -2) For publish, click the toggle switch in the **publish** column. +2. For publish, click the toggle switch in the **publish** column. -3) For subscribe, click the toggle switch in the **subscribe** column. \ No newline at end of file +3. For subscribe, click the toggle switch in the **subscribe** column. diff --git a/site/versioned_docs/version-4.1/harperdb-studio/manage-functions.md b/site/versioned_docs/version-4.1/harperdb-studio/manage-functions.md index 99673cc9..38bbf82e 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/manage-functions.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/manage-functions.md @@ -6,158 +6,153 @@ title: Manage Functions HarperDB Custom Functions are enabled by default and can be configured further through the HarperDB Studio. It is recommended to read through the Custom Functions documentation first to gain a strong understanding of HarperDB Custom Functions behavior. - - All Custom Functions configuration is handled through the **functions** page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the HarperDB Studio Organizations page. +1. Navigate to the HarperDB Studio Organizations page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **functions** in the instance control bar. +4. Click **functions** in the instance control bar. -*Note, the **functions** page will only be available to super users.* +_Note, the **functions** page will only be available to super users._ ## Manage Projects On the **functions** page of the HarperDB Studio you are presented with a functions management screen with the following properties: -* **projects** +- **projects** + + Displays a list of Custom Functions projects residing on this instance. + +- **/project_name/routes** + + Only displayed if there is an existing project. Displays the routes files contained within the selected project. - Displays a list of Custom Functions projects residing on this instance. -* **/project_name/routes** +- **/project_name/helpers** - Only displayed if there is an existing project. Displays the routes files contained within the selected project. -* **/project_name/helpers** + Only displayed if there is an existing project. Displays the helper files contained within the selected project. - Only displayed if there is an existing project. Displays the helper files contained within the selected project. -* **/project_name/static** +- **/project_name/static** - Only displayed if there is an existing project. Displays the static file count and a link to the static files contained within the selected project. Note, static files cannot currently be deployed through the Studio and must be deployed via the [HarperDB API](https://api.harperdb.io/) or manually to the server (not applicable with HarperDB Cloud). -* **Root File Directory** + Only displayed if there is an existing project. Displays the static file count and a link to the static files contained within the selected project. Note, static files cannot currently be deployed through the Studio and must be deployed via the [HarperDB API](https://api.harperdb.io/) or manually to the server (not applicable with HarperDB Cloud). - Displays the root file directory where the Custom Functions projects reside on this instance. -* **Custom Functions Server URL** +- **Root File Directory** - Displays the base URL in which all Custom Functions are accessed for this instance. + Displays the root file directory where the Custom Functions projects reside on this instance. +- **Custom Functions Server URL** + + Displays the base URL in which all Custom Functions are accessed for this instance. ## Create a Project HarperDB Custom Functions Projects can be initialized with the following instructions. -1) If this is your first project, skip this step. Click the plus icon next to the **projects** heading. +1. If this is your first project, skip this step. Click the plus icon next to the **projects** heading. -2) Enter the project name in the text box located under the **projects** heading. +2. Enter the project name in the text box located under the **projects** heading. -3) Click the check mark icon next the appropriate instance. +3. Click the check mark icon next the appropriate instance. -4) The Studio will take a few moments to provision a new project based on the [Custom Functions template](https://github.com/HarperDB/harperdb-custom-functions-template). +4. The Studio will take a few moments to provision a new project based on the [Custom Functions template](https://github.com/HarperDB/harperdb-custom-functions-template). -5) The Custom Functions project is now created and ready to modify. +5. The Custom Functions project is now created and ready to modify. ## Modify a Project Custom Functions routes and helper functions can be modified directly through the Studio. From the **functions** page: -1) Select the appropriate **project**. +1. Select the appropriate **project**. -2) Select the appropriate **route** or **helper**. +2. Select the appropriate **route** or **helper**. -3) Modify the code with your desired changes. +3. Modify the code with your desired changes. -4) Click the save icon at the bottom right of the screen. +4. Click the save icon at the bottom right of the screen. - *Note, saving modifications will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions.* + _Note, saving modifications will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions._ ## Create Additional Routes/Helpers To create an additional **route** to your Custom Functions project. From the **functions** page: -1) Select the appropriate Custom Functions **project**. +1. Select the appropriate Custom Functions **project**. -2) Click the plus icon to the right of the **routes** header. +2. Click the plus icon to the right of the **routes** header. -3) Enter the name of the new route in the textbox that appears. +3. Enter the name of the new route in the textbox that appears. -4) Click the check icon to create the new route. +4. Click the check icon to create the new route. - *Note, adding a route will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions.* + _Note, adding a route will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions._ To create an additional **helper** to your Custom Functions project. From the **functions** page: -1) Select the appropriate Custom Functions **project**. +1. Select the appropriate Custom Functions **project**. -2) Click the plus icon to the right of the **helpers** header. +2. Click the plus icon to the right of the **helpers** header. -3) Enter the name of the new helper in the textbox that appears. +3. Enter the name of the new helper in the textbox that appears. -4) Click the check icon to create the new helper. +4. Click the check icon to create the new helper. - *Note, adding a helper will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions.* + _Note, adding a helper will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions._ ## Delete a Project/Route/Helper To delete a Custom Functions project from the **functions** page: -1) Click the minus icon to the right of the **projects** header. +1. Click the minus icon to the right of the **projects** header. -2) Click the red minus icon to the right of the Custom Functions project you would like to delete. +2. Click the red minus icon to the right of the Custom Functions project you would like to delete. -3) Confirm deletion by clicking the red check icon. +3. Confirm deletion by clicking the red check icon. - *Note, deleting a project will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions.* + _Note, deleting a project will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions._ To delete a Custom Functions _project route_ from the **functions** page: -1) Select the appropriate Custom Functions **project**. +1. Select the appropriate Custom Functions **project**. -2) Click the minus icon to the right of the **routes** header. +2. Click the minus icon to the right of the **routes** header. -3) Click the red minus icon to the right of the Custom Functions route you would like to delete. +3. Click the red minus icon to the right of the Custom Functions route you would like to delete. -4) Confirm deletion by clicking the red check icon. +4. Confirm deletion by clicking the red check icon. - *Note, deleting a route will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions.* + _Note, deleting a route will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions._ To delete a Custom Functions _project helper_ from the **functions** page: -1) Select the appropriate Custom Functions **project**. +1. Select the appropriate Custom Functions **project**. -2) Click the minus icon to the right of the **helper** header. +2. Click the minus icon to the right of the **helper** header. -3) Click the red minus icon to the right of the Custom Functions header you would like to delete. +3. Click the red minus icon to the right of the Custom Functions header you would like to delete. -4) Confirm deletion by clicking the red check icon. +4. Confirm deletion by clicking the red check icon. - *Note, deleting a header will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions.* + _Note, deleting a header will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions._ ## Deploy Custom Functions Project to Other Instances The HarperDB Studio provides the ability to deploy Custom Functions projects to additional HarperDB instances within the same Studio Organization. To deploy Custom Functions projects to additional instances, starting from the **functions** page: -1) Select the **project** you would like to deploy. - -2) Click the **deploy** button at the top right. - -3) A list of instances (excluding the current instance) within the organization will be displayed in tabular with the following information: - - * **Instance Name**: The name used to describe the instance. - - * **Instance URL**: The URL used to access the instance. - - * **CF Capable**: Describes if the instance version supports Custom Functions (yes/no). - - * **CF Enabled**: Describes if Custom Functions are configured and enabled on the instance (yes/no). - - * **Has Project**: Describes if the selected Custom Functions project has been previously deployed to the instance (yes/no). - - * **Deploy**: Button used to deploy the project to the instance. - - * **Remote**: Button used to remove the project from the instance. *Note, this will only be visible if the project has been previously deployed to the instance.* - -4) In the appropriate instance row, click the **deploy** button. - - *Note, deploying a project will restart the Custom Functions server on the HarperDB instance receiving the deployment and may result in up to 60 seconds of downtime for all Custom Functions.* +1. Select the **project** you would like to deploy. + +2. Click the **deploy** button at the top right. + +3. A list of instances (excluding the current instance) within the organization will be displayed in tabular with the following information: + - **Instance Name**: The name used to describe the instance. + - **Instance URL**: The URL used to access the instance. + - **CF Capable**: Describes if the instance version supports Custom Functions (yes/no). + - **CF Enabled**: Describes if Custom Functions are configured and enabled on the instance (yes/no). + - **Has Project**: Describes if the selected Custom Functions project has been previously deployed to the instance (yes/no). + - **Deploy**: Button used to deploy the project to the instance. + - **Remote**: Button used to remove the project from the instance. _Note, this will only be visible if the project has been previously deployed to the instance._ + +4. In the appropriate instance row, click the **deploy** button. + + _Note, deploying a project will restart the Custom Functions server on the HarperDB instance receiving the deployment and may result in up to 60 seconds of downtime for all Custom Functions._ diff --git a/site/versioned_docs/version-4.1/harperdb-studio/manage-instance-roles.md b/site/versioned_docs/version-4.1/harperdb-studio/manage-instance-roles.md index e301e7d8..dafc15a8 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/manage-instance-roles.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/manage-instance-roles.md @@ -6,71 +6,70 @@ title: Manage Instance Roles HarperDB users can be managed directly through the HarperDB Studio. It is recommended to read through the users & roles documentation to gain a strong understanding of how they operate. - - Instance role configuration is handled through the roles page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the HarperDB Studio Organizations page. +1. Navigate to the HarperDB Studio Organizations page. + +2. Click the appropriate organization that the instance belongs to. -2) Click the appropriate organization that the instance belongs to. +3. Select your desired instance. -3) Select your desired instance. +4. Click **rules** in the instance control bar. -4) Click **rules** in the instance control bar. +_Note, the **roles** page will only be available to super users._ -*Note, the **roles** page will only be available to super users.* +The _roles management_ screen consists of the following panels: +- **super users** + Displays all super user roles for this instance. -The *roles management* screen consists of the following panels: +- **cluster users** -* **super users** + Displays all cluster user roles for this instance. - Displays all super user roles for this instance. -* **cluster users** +- **standard roles** - Displays all cluster user roles for this instance. -* **standard roles** + Displays all standard roles for this instance. - Displays all standard roles for this instance. -* **role permission editing** +- **role permission editing** - Once a role is selected for editing, permissions will be displayed here in JSON format. + Once a role is selected for editing, permissions will be displayed here in JSON format. -*Note, when new tables are added that are not configured, the Studio will generate configuration values with permissions defaulting to `false`.* +_Note, when new tables are added that are not configured, the Studio will generate configuration values with permissions defaulting to `false`._ ## Role Management #### Create a Role -1) Click the plus icon at the top right of the appropriate role section. +1. Click the plus icon at the top right of the appropriate role section. -2) Enter the role name. +2. Enter the role name. -3) Click the green check mark. +3. Click the green check mark. -4) Configure the role permissions in the role permission editing panel. +4. Configure the role permissions in the role permission editing panel. - *Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel.* + _Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel._ -5) Click **Update Role Permissions**. +5. Click **Update Role Permissions**. #### Modify a Role -1) Click the appropriate role from the appropriate role section. +1. Click the appropriate role from the appropriate role section. -2) Modify the role permissions in the role permission editing panel. +2. Modify the role permissions in the role permission editing panel. - *Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel.* + _Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel._ -3) Click **Update Role Permissions**. +3. Click **Update Role Permissions**. #### Delete a Role Deleting a role is permanent and irreversible. A role cannot be remove if users are associated with it. -1) Click the minus icon at the top right of the schemas section. +1. Click the minus icon at the top right of the schemas section. -2) Identify the appropriate role to delete and click the red minus sign in the same row. +2. Identify the appropriate role to delete and click the red minus sign in the same row. -3) Click the red check mark to confirm deletion. \ No newline at end of file +3. Click the red check mark to confirm deletion. diff --git a/site/versioned_docs/version-4.1/harperdb-studio/manage-instance-users.md b/site/versioned_docs/version-4.1/harperdb-studio/manage-instance-users.md index 78cf11b7..1fb3c2ee 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/manage-instance-users.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/manage-instance-users.md @@ -6,58 +6,48 @@ title: Manage Instance Users HarperDB instance clustering and replication can be configured directly through the HarperDB Studio. It is recommended to read through the clustering documentation first to gain a strong understanding of HarperDB clustering behavior. - - Instance user configuration is handled through the **users** page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **users** in the instance control bar. +4. Click **users** in the instance control bar. -*Note, the **users** page will only be available to super users.* +_Note, the **users** page will only be available to super users._ ## Add a User HarperDB instance users can be added with the following instructions. -1) In the **add user** panel on the left enter: - - * New user username. - - * New user password. - - * Select a role. - - *Learn more about role management here: [Manage Instance Roles](./manage-instance-roles).* - -2) Click **Add User**. - +1. In the **add user** panel on the left enter: + - New user username. + - New user password. + - Select a role. + + _Learn more about role management here: [Manage Instance Roles](./manage-instance-roles)._ + +2. Click **Add User**. + ## Edit a User HarperDB instance users can be modified with the following instructions. -1) In the **existing users** panel, click the row of the user you would like to edit. +1. In the **existing users** panel, click the row of the user you would like to edit. + +2. To change a user’s password: + 1. In the **Change user password** section, enter the new password. + 2. Click **Update Password**. -2) To change a user’s password: +3. To change a user’s role: + 1. In the **Change user role** section, select the new role. + 2. Click **Update Role**. - 1) In the **Change user password** section, enter the new password. - - 2) Click **Update Password**. - -3) To change a user’s role: +4. To delete a user: + 1. In the **Delete User** section, type the username into the textbox. - 1) In the **Change user role** section, select the new role. - - 2) Click **Update Role**. - -4) To delete a user: + _This is done for confirmation purposes._ - 1) In the **Delete User** section, type the username into the textbox. - - *This is done for confirmation purposes.* - - 2) Click **Delete User**. \ No newline at end of file + 2. Click **Delete User**. diff --git a/site/versioned_docs/version-4.1/harperdb-studio/manage-schemas-browse-data.md b/site/versioned_docs/version-4.1/harperdb-studio/manage-schemas-browse-data.md index 41493b96..8b4061e3 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/manage-schemas-browse-data.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/manage-schemas-browse-data.md @@ -6,10 +6,10 @@ title: Manage Schemas / Browse Data Manage instance schemas/tables and browse data in tabular format with the following instructions: -1) Navigate to the HarperDB Studio Organizations page. -2) Click the appropriate organization that the instance belongs to. -3) Select your desired instance. -4) Click **browse** in the instance control bar. +1. Navigate to the HarperDB Studio Organizations page. +2. Click the appropriate organization that the instance belongs to. +3. Select your desired instance. +4. Click **browse** in the instance control bar. Once on the instance browse page you can view data, manage schemas and tables, add new data, and more. @@ -17,95 +17,90 @@ Once on the instance browse page you can view data, manage schemas and tables, a #### Create a Schema -1) Click the plus icon at the top right of the schemas section. -2) Enter the schema name. -3) Click the green check mark. - +1. Click the plus icon at the top right of the schemas section. +2. Enter the schema name. +3. Click the green check mark. #### Delete a Schema Deleting a schema is permanent and irreversible. Deleting a schema removes all tables and data within it. -1) Click the minus icon at the top right of the schemas section. -2) Identify the appropriate schema to delete and click the red minus sign in the same row. -3) Click the red check mark to confirm deletion. - +1. Click the minus icon at the top right of the schemas section. +2. Identify the appropriate schema to delete and click the red minus sign in the same row. +3. Click the red check mark to confirm deletion. #### Create a Table -1) Select the desired schema from the schemas section. -2) Click the plus icon at the top right of the tables section. -3) Enter the table name. -4) Enter the primary key. - - *The primary key is also often referred to as the hash attribute in the studio, and it defines the unique identifier for each row in your table.* -5) Click the green check mark. +1. Select the desired schema from the schemas section. +2. Click the plus icon at the top right of the tables section. +3. Enter the table name. +4. Enter the primary key. + _The primary key is also often referred to as the hash attribute in the studio, and it defines the unique identifier for each row in your table._ + +5. Click the green check mark. #### Delete a Table + Deleting a table is permanent and irreversible. Deleting a table removes all data within it. -1) Select the desired schema from the schemas section. -2) Click the minus icon at the top right of the tables section. -3) Identify the appropriate table to delete and click the red minus sign in the same row. -4) Click the red check mark to confirm deletion. +1. Select the desired schema from the schemas section. +2. Click the minus icon at the top right of the tables section. +3. Identify the appropriate table to delete and click the red minus sign in the same row. +4. Click the red check mark to confirm deletion. ## Manage Table Data The following section assumes you have selected the appropriate table from the schema/table browser. - - #### Filter Table Data -1) Click the magnifying glass icon at the top right of the table browser. -2) This expands the search filters. -3) The results will be filtered appropriately. - +1. Click the magnifying glass icon at the top right of the table browser. +2. This expands the search filters. +3. The results will be filtered appropriately. #### Load CSV Data -1) Click the data icon at the top right of the table browser. You will be directed to the CSV upload page where you can choose to import a CSV by URL or upload a CSV file. -2) To import a CSV by URL: - 1) Enter the URL in the **CSV file URL** textbox. - 2) Click **Import From URL**. - 3) The CSV will load, and you will be redirected back to browse table data. -3) To upload a CSV file: - 1) Click **Click or Drag to select a .csv file** (or drag your CSV file from your file browser). - 2) Navigate to your desired CSV file and select it. - 3) Click **Insert X Records**, where X is the number of records in your CSV. - 4) The CSV will load, and you will be redirected back to browse table data. - +1. Click the data icon at the top right of the table browser. You will be directed to the CSV upload page where you can choose to import a CSV by URL or upload a CSV file. +2. To import a CSV by URL: + 1. Enter the URL in the **CSV file URL** textbox. + 2. Click **Import From URL**. + 3. The CSV will load, and you will be redirected back to browse table data. +3. To upload a CSV file: + 1. Click **Click or Drag to select a .csv file** (or drag your CSV file from your file browser). + 2. Navigate to your desired CSV file and select it. + 3. Click **Insert X Records**, where X is the number of records in your CSV. + 4. The CSV will load, and you will be redirected back to browse table data. #### Add a Record -1) Click the plus icon at the top right of the table browser. -2) The Studio will pre-populate existing table attributes in JSON format. +1. Click the plus icon at the top right of the table browser. +2. The Studio will pre-populate existing table attributes in JSON format. - *The primary key is not included, but you can add it in and set it to your desired value. Auto-maintained fields are not included and cannot be manually set. You may enter a JSON array to insert multiple records in a single transaction.* -3) Enter values to be added to the record. + _The primary key is not included, but you can add it in and set it to your desired value. Auto-maintained fields are not included and cannot be manually set. You may enter a JSON array to insert multiple records in a single transaction._ - *You may add new attributes to the JSON; they will be reflexively added to the table.* -4) Click the **Add New** button. +3. Enter values to be added to the record. + _You may add new attributes to the JSON; they will be reflexively added to the table._ -#### Edit a Record +4. Click the **Add New** button. -1) Click the record/row you would like to edit. -2) Modify the desired values. +#### Edit a Record - *You may add new attributes to the JSON; they will be reflexively added to the table.* +1. Click the record/row you would like to edit. +2. Modify the desired values. -3) Click the **save icon**. + _You may add new attributes to the JSON; they will be reflexively added to the table._ +3. Click the **save icon**. #### Delete a Record Deleting a record is permanent and irreversible. If transaction logging is turned on, the delete transaction will be recorded as well as the data that was deleted. -1) Click the record/row you would like to delete. -2) Click the **delete icon**. -3) Confirm deletion by clicking the **check icon**. +1. Click the record/row you would like to delete. +2. Click the **delete icon**. +3. Confirm deletion by clicking the **check icon**. ## Browse Table Data @@ -115,18 +110,14 @@ The following section assumes you have selected the appropriate table from the s The first page of table data is automatically loaded on table selection. Paging controls are at the bottom of the table. Here you can: -* Page left and right using the arrows. -* Type in the desired page. -* Change the page size (the amount of records displayed in the table). - +- Page left and right using the arrows. +- Type in the desired page. +- Change the page size (the amount of records displayed in the table). #### Refresh Table Data Click the refresh icon at the top right of the table browser. - - #### Automatically Refresh Table Data Toggle the auto switch at the top right of the table browser. The table data will now automatically refresh every 15 seconds. Filters and pages will remain set for refreshed data. - diff --git a/site/versioned_docs/version-4.1/harperdb-studio/organizations.md b/site/versioned_docs/version-4.1/harperdb-studio/organizations.md index 54df0eb1..ec19c50e 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/organizations.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/organizations.md @@ -3,43 +3,46 @@ title: Organizations --- # Organizations -HarperDB Studio organizations provide the ability to group HarperDB Cloud Instances. Organization behavior is as follows: -* Billing occurs at the organization level to a single credit card. -* Organizations retain their own unique HarperDB Cloud subdomain. -* Cloud instances reside within an organization. -* Studio users can be invited to organizations to share instances. +HarperDB Studio organizations provide the ability to group HarperDB Cloud Instances. Organization behavior is as follows: +- Billing occurs at the organization level to a single credit card. +- Organizations retain their own unique HarperDB Cloud subdomain. +- Cloud instances reside within an organization. +- Studio users can be invited to organizations to share instances. An organization is automatically created for you when you sign up for HarperDB Studio. If you only have one organization, the Studio will automatically bring you to your organization’s page. --- ## List Organizations + A summary view of all organizations your user belongs to can be viewed on the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. You can navigate to this page at any time by clicking the **all organizations** link at the top of the HarperDB Studio. ## Create a New Organization + A new organization can be created as follows: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the **Create a New Organization** card. -3) Fill out new organization details - * Enter Organization Name - *This is used for descriptive purposes only.* - * Enter Organization Subdomain - *Part of the URL that will be used to identify your HarperDB Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com).* -4) Click Create Organization. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the **Create a New Organization** card. +3. Fill out new organization details + - Enter Organization Name + _This is used for descriptive purposes only._ + - Enter Organization Subdomain + _Part of the URL that will be used to identify your HarperDB Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com)._ +4. Click Create Organization. ## Delete an Organization An organization cannot be deleted until all instances have been removed. An organization can be deleted as follows: -1) Navigate to the HarperDB Studio Organizations page. -2) Identify the proper organization card and click the trash can icon. -3) Enter the organization name into the text box. +1. Navigate to the HarperDB Studio Organizations page. +2. Identify the proper organization card and click the trash can icon. +3. Enter the organization name into the text box. + + _This is done for confirmation purposes to ensure you do not accidentally delete an organization._ - *This is done for confirmation purposes to ensure you do not accidentally delete an organization.* -4) Click the **Do It** button. +4. Click the **Do It** button. ## Manage Users @@ -49,11 +52,11 @@ HarperDB Studio organization owners can manage users including inviting new user A new user can be invited to an organization as follows: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) In the **add user** box, enter the new user’s email address. -5) Click **Add User**. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. In the **add user** box, enter the new user’s email address. +5. Click **Add User**. Users may or may not already be HarperDB Studio users when adding them to an organization. If the HarperDB Studio account already exists, the user will receive an email notification alerting them to the organization invitation. If the user does not have a HarperDB Studio account, they will receive an email welcoming them to HarperDB Studio. @@ -63,11 +66,11 @@ Users may or may not already be HarperDB Studio users when adding them to an org Organization owners have full access to the organization including the ability to manage organization users, create, modify, and delete instances, and delete the organization. Users must have accepted their invitation prior to being promoted to an owner. A user’s organization owner status can be toggled owner as follows: -1) Navigate to the HarperDB Studio Organizations page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) Click the appropriate user from the **existing users** section. -5) Toggle the **Is Owner** switch to the desired status. +1. Navigate to the HarperDB Studio Organizations page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. Click the appropriate user from the **existing users** section. +5. Toggle the **Is Owner** switch to the desired status. --- @@ -75,35 +78,32 @@ Organization owners have full access to the organization including the ability t Users may be removed from an organization at any time. Removing a user from an organization will not delete their HarperDB Studio account, it will only remove their access to the specified organization. A user can be removed from an organization as follows: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) Click the appropriate user from the **existing users** section. -5) Type **DELETE** in the text box in the **Delete User** row. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. Click the appropriate user from the **existing users** section. +5. Type **DELETE** in the text box in the **Delete User** row. - *This is done for confirmation purposes to ensure you do not accidentally delete a user.* -6) Click **Delete User**. + _This is done for confirmation purposes to ensure you do not accidentally delete a user._ + +6. Click **Delete User**. ## Manage Billing Billing is configured per organization and will be billed to the stored credit card at appropriate intervals (monthly or annually depending on the registered instance). Billing settings can be configured as follows: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **billing** at the top of the screen. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **billing** at the top of the screen. Here organization owners can view invoices, manage coupons, and manage the associated credit card. - - -*HarperDB billing and payments are managed via Stripe.* - - +_HarperDB billing and payments are managed via Stripe._ ### Add a Coupon Coupons are applicable towards any paid tier or user-installed instance and you can change your subscription at any time. Coupons can be added to your Organization as follows: -1) In the coupons panel of the **billing** page, enter your coupon code. -2) Click **Add Coupon**. -3) The coupon will then be available and displayed in the coupons panel. \ No newline at end of file +1. In the coupons panel of the **billing** page, enter your coupon code. +2. Click **Add Coupon**. +3. The coupon will then be available and displayed in the coupons panel. diff --git a/site/versioned_docs/version-4.1/harperdb-studio/query-instance-data.md b/site/versioned_docs/version-4.1/harperdb-studio/query-instance-data.md index 5dd2d8c6..22801dbc 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/query-instance-data.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/query-instance-data.md @@ -6,14 +6,14 @@ title: Query Instance Data SQL queries can be executed directly through the HarperDB Studio with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. -3) Select your desired instance. -4) Click **query** in the instance control bar. -5) Enter your SQL query in the SQL query window. -6) Click **Execute**. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +2. Click the appropriate organization that the instance belongs to. +3. Select your desired instance. +4. Click **query** in the instance control bar. +5. Enter your SQL query in the SQL query window. +6. Click **Execute**. -*Please note, the Studio will execute the query exactly as entered. For example, if you attempt to `SELECT *` from a table with millions of rows, you will most likely crash your browser.* +_Please note, the Studio will execute the query exactly as entered. For example, if you attempt to `SELECT _` from a table with millions of rows, you will most likely crash your browser.\* ## Browse Query Results Set @@ -21,9 +21,9 @@ SQL queries can be executed directly through the HarperDB Studio with the follow The first page of results set data is automatically loaded on query execution. Paging controls are at the bottom of the table. Here you can: -* Page left and right using the arrows. -* Type in the desired page. -* Change the page size (the amount of records displayed in the table). +- Page left and right using the arrows. +- Type in the desired page. +- Change the page size (the amount of records displayed in the table). #### Refresh Results Set @@ -37,12 +37,11 @@ Toggle the auto switch at the top right of the results set table. The results se Query history is stored in your local browser cache. Executed queries are listed with the most recent at the top in the **query history** section. - #### Rerun Previous Query -* Identify the query from the **query history** list. -* Click the appropriate query. It will be loaded into the **sql query** input box. -* Click **Execute**. +- Identify the query from the **query history** list. +- Click the appropriate query. It will be loaded into the **sql query** input box. +- Click **Execute**. #### Clear Query History @@ -50,4 +49,4 @@ Click the trash can icon at the top right of the **query history** section. ## Create Charts -The HarperDB Studio includes a charting feature where you can build charts based on your specified queries. Visit the Charts documentation for more information. \ No newline at end of file +The HarperDB Studio includes a charting feature where you can build charts based on your specified queries. Visit the Charts documentation for more information. diff --git a/site/versioned_docs/version-4.1/harperdb-studio/resources.md b/site/versioned_docs/version-4.1/harperdb-studio/resources.md index 01bd8f8a..528f4e11 100644 --- a/site/versioned_docs/version-4.1/harperdb-studio/resources.md +++ b/site/versioned_docs/version-4.1/harperdb-studio/resources.md @@ -10,14 +10,12 @@ HarperDB Studio resources are available regardless of whether or not you are log The [HarperDB Marketplace](https://studio.harperdb.io/resources/marketplace/active) is a collection of SDKs and connectors that enable developers to expand upon HarperDB for quick and easy solution development. Extensions are built and supported by the HarperDB Community. Each extension is hosted on the appropriate package manager or host. - - To download a Marketplace extension: -1) Navigate to the [HarperDB Marketplace](https://studio.harperdb.io/resources/marketplace/active) page. -2) Identity the extension you would like to use. -3) Either click the link to the package. -4) Follow the extension’s instructions to proceed. +1. Navigate to the [HarperDB Marketplace](https://studio.harperdb.io/resources/marketplace/active) page. +2. Identity the extension you would like to use. +3. Either click the link to the package. +4. Follow the extension’s instructions to proceed. You can submit your rating for each extension by clicking on the stars. @@ -27,10 +25,10 @@ HarperDB offers standard drivers to connect real-time HarperDB data with BI, ana To download a driver: -1) Navigate to the [HarperDB Drivers](https://studio.harperdb.io/resources/marketplace/active) page. -2) Identity the driver you would like to use. -3) Click the download link. -4) For additional instructions, visit the support link on the driver card. +1. Navigate to the [HarperDB Drivers](https://studio.harperdb.io/resources/marketplace/active) page. +2. Identity the driver you would like to use. +3. Click the download link. +4. For additional instructions, visit the support link on the driver card. ## Video Tutorials diff --git a/site/versioned_docs/version-4.1/index.md b/site/versioned_docs/version-4.1/index.md index 27237f68..13869814 100644 --- a/site/versioned_docs/version-4.1/index.md +++ b/site/versioned_docs/version-4.1/index.md @@ -6,12 +6,12 @@ title: Documentation HarperDB's documentation covers installation, getting started, APIs, security, and much more. Browse the topics at left, or choose one of the commonly used documentation sections below. -*** +--- -* [Install HarperDB Locally](./install-harperdb/) -* [Getting Started](./getting-started/) -* [HarperDB Operations API](https://api.harperdb.io) -* [HarperDB Studio](./harperdb-studio/) -* [HarperDB Cloud](./harperdb-cloud/) -* [Developer Project Examples](https://github.com/search?q=harperdb) -* [Support](./support) +- [Install HarperDB Locally](./install-harperdb/) +- [Getting Started](./getting-started/) +- [HarperDB Operations API](https://api.harperdb.io) +- [HarperDB Studio](./harperdb-studio/) +- [HarperDB Cloud](./harperdb-cloud/) +- [Developer Project Examples](https://github.com/search?q=harperdb) +- [Support](./support) diff --git a/site/versioned_docs/version-4.1/install-harperdb/index.md b/site/versioned_docs/version-4.1/install-harperdb/index.md index 917d656d..818772c4 100644 --- a/site/versioned_docs/version-4.1/install-harperdb/index.md +++ b/site/versioned_docs/version-4.1/install-harperdb/index.md @@ -7,9 +7,11 @@ title: Install HarperDB This documentation contains information for installing HarperDB locally. Note that if you’d like to get up and running quickly, you can try a [managed instance with HarperDB Cloud](https://studio.harperdb.io/sign-up). HarperDB is a cross-platform database; we recommend Linux for production use, but HarperDB can run on Windows and Mac as well, for development purposes. Installation is usually very simple and just takes a few steps, but there are a few different options documented here. HarperDB runs on Node.js, so if you do not have it installed, you need to do that first (if you have installed, you can skip to installing HarperDB, itself). Node.js can be downloaded and installed from [their site](https://nodejs.org/). For Linux and Mac, we recommend installing and managing Node versions with [NVM, which has instructions for installation](https://github.com/nvm-sh/nvm), but generally NVM can be installed with: + ```bash curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash ``` + And then logout and login, and then install Node.js using nvm. We recommend using LTS, but support all currently maintained Node versions (which is currently version 14 and newer, and make sure to always uses latest minor/patch for the major version): ```bash @@ -17,6 +19,7 @@ nvm install 18 ``` ### Install and Start HarperDB + Then you can install HarperDB with NPM and start it: ```bash @@ -28,8 +31,6 @@ HarperDB will automatically start after installation. If you are setting up a production server on Linux, [we have much more extensive documentation on how to configure volumes for database storage, set up a systemd script, configure your operating system for use a database server in our linux installation guide](./linux). - - # With Docker If you would like to run HarperDB in Docker, install [Docker Desktop](https://docs.docker.com/desktop/) on your Mac or Windows computer. Otherwise, install the [Docker Engine](https://docs.docker.com/engine/install/) on your Linux server. @@ -54,7 +55,7 @@ For more information visit the [HarperDB Command Line Interface](../harperdb-cli HarperDB comes with binaries for standard AMD64/x64 or ARM64 CPU architectures on Linux, Windows (x64 only), and Mac (including Apple Silicon). However, if you are installing on a less common platform (Alpine, for example), you will need to ensure that you have build tools installed for the installation process to compile the binaries (this is handled automatically), including: -* [Go](https://go.dev/dl/): version 1.19.1 -* GCC -* Make -* Python v3.7, v3.8, v3.9, or v3.10 +- [Go](https://go.dev/dl/): version 1.19.1 +- GCC +- Make +- Python v3.7, v3.8, v3.9, or v3.10 diff --git a/site/versioned_docs/version-4.1/install-harperdb/linux.md b/site/versioned_docs/version-4.1/install-harperdb/linux.md index c40d9563..25fcd429 100644 --- a/site/versioned_docs/version-4.1/install-harperdb/linux.md +++ b/site/versioned_docs/version-4.1/install-harperdb/linux.md @@ -23,6 +23,7 @@ For this example, we will use an AWS Ubuntu Server 22.04 LTS m5.large EC2 Instan --- ### (Optional) LVM Configuration + Logical Volume Manager (LVM) can be used to stripe multiple disks together to form a single logical volume. If striping disks together is not a requirement, skip these steps. Find disk that already has a partition @@ -104,6 +105,7 @@ echo "LABEL=hdb_data /home/ubuntu/hdb ext4 defaults,noatime 0 1" | sudo tee -a / ``` ### Configure Linux and Install Prerequisites + If a swap file or partition does not already exist, create and enable a 2GB swap file ```bash @@ -140,6 +142,7 @@ nvm install ``` ### Install and Start HarperDB + Here is an example of installing HarperDB with minimal configuration. ```bash diff --git a/site/versioned_docs/version-4.1/logging.md b/site/versioned_docs/version-4.1/logging.md index bfb3a3bf..bceee337 100644 --- a/site/versioned_docs/version-4.1/logging.md +++ b/site/versioned_docs/version-4.1/logging.md @@ -9,23 +9,28 @@ HarperDB maintains a log of events that take place throughout operation. Log mes All logs (except for the install log) are stored in the main log file in the hdb directory `/log/hdb.log`. The install log is located in the HarperDB application directory most likely located in your npm directory `npm/harperdb/logs`. Each log message has several key components for consistent reporting of events. A log message has a format of: + ``` [] [] ...[]: ``` + For example, a typical log entry looks like: + ``` 2023-03-09T14:25:05.269Z [notify] [main/0]: HarperDB successfully started. ``` + The components of a log entry are: -* timestamp - This is the date/time stamp when the event occurred -* level - This is an associated log level that gives a rough guide to the importance and urgency of the message. The available log levels in order of least urgent (and more verbose) are: `trace`, `debug`, `info`, `warn`, `error`, `fatal`, and `notify`. -* thread/id - This reports the name of the thread and the thread id, that the event was reported on. Note that NATS logs are recorded by their process name and there is no thread id for them since they are a separate process. Key threads are: - * main - This is the thread that is responsible for managing all other threads and routes incoming requests to the other threads - * http - These are the worker threads that handle the primary workload of incoming HTTP requests to the operations API and custom functions. - * Clustering* - These are threads and processes that handle replication. - * job - These are job threads that have been started to handle operations that are executed in a separate job thread. -* tags - Logging from a custom function will include a "custom-function" tag in the log entry. Most logs will not have any additional tags. -* message - This is the main message that was reported. + +- timestamp - This is the date/time stamp when the event occurred +- level - This is an associated log level that gives a rough guide to the importance and urgency of the message. The available log levels in order of least urgent (and more verbose) are: `trace`, `debug`, `info`, `warn`, `error`, `fatal`, and `notify`. +- thread/id - This reports the name of the thread and the thread id, that the event was reported on. Note that NATS logs are recorded by their process name and there is no thread id for them since they are a separate process. Key threads are: + - main - This is the thread that is responsible for managing all other threads and routes incoming requests to the other threads + - http - These are the worker threads that handle the primary workload of incoming HTTP requests to the operations API and custom functions. + - Clustering\* - These are threads and processes that handle replication. + - job - These are job threads that have been started to handle operations that are executed in a separate job thread. +- tags - Logging from a custom function will include a "custom-function" tag in the log entry. Most logs will not have any additional tags. +- message - This is the main message that was reported. We try to keep logging to a minimum by default, to do this the default log level is `error`. If you require more information from the logs, increasing the log level down will provide that. @@ -35,7 +40,7 @@ The log level can be changed by modifying `logging.level` in the config file `ha HarperDB clustering utilizes two [Nats](https://nats.io/) servers, named Hub and Leaf. The Hub server is responsible for establishing the mesh network that connects instances of HarperDB and the Leaf server is responsible for managing the message stores (streams) that replicate and store messages between instances. Due to the verbosity of these servers there is a separate -log level configuration for them. To adjust their log verbosity set `clustering.logLevel` in the config file `harperdb-config.yaml`. Valid log levels from least verbose are +log level configuration for them. To adjust their log verbosity set `clustering.logLevel` in the config file `harperdb-config.yaml`. Valid log levels from least verbose are `error`, `warn`, `info`, `debug` and `trace`. ## Log File vs Standard Streams @@ -53,15 +58,12 @@ To access specific logs you may query the HarperDB API. Logs can be queried usin ```json { - "operation": "read_log", - "start": 0, - "limit": 1000, - "level": "error", - "from": "2021-01-25T22:05:27.464+0000", - "until": "2021-01-25T23:05:27.464+0000", - "order": "desc" + "operation": "read_log", + "start": 0, + "limit": 1000, + "level": "error", + "from": "2021-01-25T22:05:27.464+0000", + "until": "2021-01-25T23:05:27.464+0000", + "order": "desc" } ``` - - - diff --git a/site/versioned_docs/version-4.1/reference/content-types.md b/site/versioned_docs/version-4.1/reference/content-types.md index c8a1bad8..06d59559 100644 --- a/site/versioned_docs/version-4.1/reference/content-types.md +++ b/site/versioned_docs/version-4.1/reference/content-types.md @@ -11,15 +11,17 @@ For request body content, the content type should be specified with the `Content The following content types are supported: ## JSON - application/json + JSON is the most widely used content type, and is relatively readable and easy to work with. However, JSON does not support all the data types that are supported by HarperDB, and can't be used to natively encode data types like binary data or explicit Maps/Sets. Also, JSON is not as efficient as binary formats. When using JSON, compression is recommended (this also follows standard HTTP protocol with the `Accept-Encoding` header) to improve network transfer performance (although there is server performance overhead). JSON is a good choice for web development and when standard JSON types are sufficient and when combined with compression and debuggability/observability is important. ## CBOR - application/cbor + CBOR is a highly efficient binary format, and is a recommended format for most production use cases with HarperDB. CBOR supports the full range of HarperDB data types, including binary data, typed dates, and explicit Maps/Sets. CBOR is very performant and space efficient even without compression. Compression will still yield better network transfer size/performance, but compressed CBOR is generally not any smaller than compressed JSON. CBOR also natively supports streaming for optimal performance (using indefinite length arrays). The CBOR format has excellent standardization and HarperDB's CBOR provides an excellent balance of performance and size efficiency. ## MessagePack - application/x-msgpack + MessagePack is another efficient binary format like CBOR, with a support for all HarperDB data types. MessagePack generally has wider adoption than CBOR and can be useful in systems that don't have CBOR support (or good support). However, MessagePack does not have native support for streaming of arrays of data (for query results), and so query results are returned as a (concatenated) sequence of MessagePack objects/maps. MessagePack decoders used with HarperDB's MessagePack must be prepared to decode a direct sequence of MessagePack values to properly read responses. ## Comma-separated Values (CSV) - text/csv -Comma-separated values is an easy to use and understand format that can be readily imported into spreadsheets or used for data processing. CSV lacks hierarchical structure most data types, and shouldn't be used for frequent/production use, but when you need it, it is available. - +Comma-separated values is an easy to use and understand format that can be readily imported into spreadsheets or used for data processing. CSV lacks hierarchical structure most data types, and shouldn't be used for frequent/production use, but when you need it, it is available. diff --git a/site/versioned_docs/version-4.1/reference/data-types.md b/site/versioned_docs/version-4.1/reference/data-types.md index 78a8a684..105323b4 100644 --- a/site/versioned_docs/version-4.1/reference/data-types.md +++ b/site/versioned_docs/version-4.1/reference/data-types.md @@ -7,31 +7,37 @@ title: HarperDB Supported Data Types HarperDB supports a rich set of data types for use in records in databases. Various data types can be used from both direct JavaScript interfaces in Custom Functions and the HTTP operations APIs. Using JSON for communication naturally limits the data types to those available in JSON (HarperDB’s supports all of JSON data types), but JavaScript code and alternate data formats facilitate the use of additional data types. As of v4.1, HarperDB supports MessagePack and CBOR, which allows for all of HarperDB supported data types. This includes: ## Boolean + true or false. ## String + Strings, or text, are a sequence of any unicode characters and are internally encoded with UTF-8. ## Number + Numbers can be stored as signed integers up to 64-bit or floating point with 64-bit floating point precision, and numbers are automatically stored using the most optimal type. JSON is parsed by JS, so the maximum safe (precise) integer is 9007199254740991 (larger numbers can be stored, but aren’t guaranteed integer precision). Custom Functions may use BigInt numbers to store/access larger 64-bit integers, but integers beyond 64-bit can’t be stored with integer precision (will be stored as standard double-precision numbers). ## Object/Map + Objects, or maps, that hold a set named properties can be stored in HarperDB. When provided as JSON objects or JavaScript objects, all property keys are stored as strings. The order of properties is also preserved in HarperDB’s storage. Duplicate property keys are not allowed (they are dropped in parsing any incoming data). ## Array + Arrays hold an ordered sequence of values and can be stored in HarperDB. There is no support for sparse arrays, although you can use objects to store data with numbers (converted to strings) as properties. ## Null + A null value can be stored in HarperDB property values as well. ## Date + Dates can be stored as a specific data type. This is not supported in JSON, but is supported by MessagePack and CBOR. Custom Functions can also store and use Dates using JavaScript Date instances. ## Binary Data + Binary data can be stored in property values as well. JSON doesn’t have any support for encoding binary data, but MessagePack and CBOR support binary data in data structures, and this will be preserved in HarperDB. Custom Functions can also store binary data by using NodeJS’s Buffer or Uint8Array instances to hold the binary data. ## Explicit Map/Set -Explicit instances of JavaScript Maps and Sets can be stored and preserved in HarperDB as well. This can’t be represented with JSON, but can be with CBOR. - - +Explicit instances of JavaScript Maps and Sets can be stored and preserved in HarperDB as well. This can’t be represented with JSON, but can be with CBOR. diff --git a/site/versioned_docs/version-4.1/reference/dynamic-schema.md b/site/versioned_docs/version-4.1/reference/dynamic-schema.md index b2394550..7b1a7e06 100644 --- a/site/versioned_docs/version-4.1/reference/dynamic-schema.md +++ b/site/versioned_docs/version-4.1/reference/dynamic-schema.md @@ -16,8 +16,8 @@ HarperDB schemas are analogous to a namespace that groups tables together. A sch HarperDB tables group records together with a common data pattern. To create a table users must provide a table name and a primary key. -* **Table Name**: Used to identify the table. -* **Primary Key**: This is a required attribute that serves as the unique identifier for a record and is also known as the `hash_attribute` in HarperDB. +- **Table Name**: Used to identify the table. +- **Primary Key**: This is a required attribute that serves as the unique identifier for a record and is also known as the `hash_attribute` in HarperDB. Primary Key @@ -31,8 +31,8 @@ Additional attributes are reflexively added via insert and update operations (in HarperDB automatically creates two audit attributes used on each record. -* `__createdtime__`: The time the record was created in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. -* `__updatedtime__`: The time the record was updated in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. +- `__createdtime__`: The time the record was created in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. +- `__updatedtime__`: The time the record was updated in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. ### Dynamic Schema Example @@ -64,7 +64,7 @@ At this point the table does not have structure beyond what we provided, so the **dev.dog** -![](/img/v4.1/reference/dynamic\_schema\_2\_create\_table.png.webp) +![](/img/v4.1/reference/dynamic_schema_2_create_table.png.webp) **Insert Record** @@ -85,7 +85,7 @@ With a single record inserted and new attributes defined, our table now looks li **dev.dog** -![](/img/v4.1/reference/dynamic\_schema\_3\_insert\_record.png.webp) +![](/img/v4.1/reference/dynamic_schema_3_insert_record.png.webp) Indexes have been automatically created for `dog_name` and `owner_name` attributes. @@ -109,7 +109,7 @@ In this case, there is no change to the schema. Our table now looks like this: **dev.dog** -![](/img/v4.1/reference/dynamic\_schema\_4\_insert\_additional\_record.png.webp) +![](/img/v4.1/reference/dynamic_schema_4_insert_additional_record.png.webp) **Update Existing Record** @@ -130,7 +130,7 @@ Now we have a new attribute called `weight_lbs`. Our table now looks like this: **dev.dog** -![](/img/v4.1/reference/dynamic\_schema\_5\_update\_existing\_record.png.webp) +![](/img/v4.1/reference/dynamic_schema_5_update_existing_record.png.webp) **Query Table with SQL** @@ -145,4 +145,4 @@ Now if we query for all records where `weight_lbs` is `null` we expect to get ba This results in the expected two records being returned. -![](/img/v4.1/reference/dynamic\_schema\_6\_query\_table\_with\_sql.png.webp) +![](/img/v4.1/reference/dynamic_schema_6_query_table_with_sql.png.webp) diff --git a/site/versioned_docs/version-4.1/reference/headers.md b/site/versioned_docs/version-4.1/reference/headers.md index 330425bf..e2798c03 100644 --- a/site/versioned_docs/version-4.1/reference/headers.md +++ b/site/versioned_docs/version-4.1/reference/headers.md @@ -6,8 +6,8 @@ title: HarperDB Headers All HarperDB API responses include headers that are important for interoperability and debugging purposes. The following headers are returned with all HarperDB API responses: -| Key | Example Value | Description | -|-------------------|------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| -| server-timing | db;dur=7.165 | This reports the duration of the operation, in milliseconds. This follows the standard for Server-Timing and can be consumed by network monitoring tools. | -| hdb-response-time | 7.165 | This is the legacy header for reporting response time. It is deprecated and will be removed in 4.2. | -| content-type | application/json | This reports the MIME type of the returned content, which is negotiated based on the requested content type in the Accept header. | +| Key | Example Value | Description | +| ----------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| server-timing | db;dur=7.165 | This reports the duration of the operation, in milliseconds. This follows the standard for Server-Timing and can be consumed by network monitoring tools. | +| hdb-response-time | 7.165 | This is the legacy header for reporting response time. It is deprecated and will be removed in 4.2. | +| content-type | application/json | This reports the MIME type of the returned content, which is negotiated based on the requested content type in the Accept header. | diff --git a/site/versioned_docs/version-4.1/reference/index.md b/site/versioned_docs/version-4.1/reference/index.md index 70a3e37e..7be1fff4 100644 --- a/site/versioned_docs/version-4.1/reference/index.md +++ b/site/versioned_docs/version-4.1/reference/index.md @@ -6,9 +6,9 @@ title: Reference This section contains technical details and reference materials for HarperDB. -* [Storage Algorithm](./storage-algorithm) -* [Dynamic Schema](./dynamic-schema) -* [Headers](./headers) -* [Limitations](./limits) -* Content Types -* [Data Types](./data-types) +- [Storage Algorithm](./storage-algorithm) +- [Dynamic Schema](./dynamic-schema) +- [Headers](./headers) +- [Limitations](./limits) +- Content Types +- [Data Types](./data-types) diff --git a/site/versioned_docs/version-4.1/reference/limits.md b/site/versioned_docs/version-4.1/reference/limits.md index f6509b7b..fbcbc1cd 100644 --- a/site/versioned_docs/version-4.1/reference/limits.md +++ b/site/versioned_docs/version-4.1/reference/limits.md @@ -30,4 +30,4 @@ Additionally, they cannot contain the first 31 non-printing characters. Spaces a **Attribute Maximum** -HarperDB limits number of attributes to 10,000 per table. \ No newline at end of file +HarperDB limits number of attributes to 10,000 per table. diff --git a/site/versioned_docs/version-4.1/reference/storage-algorithm.md b/site/versioned_docs/version-4.1/reference/storage-algorithm.md index efd26d14..90a880d4 100644 --- a/site/versioned_docs/version-4.1/reference/storage-algorithm.md +++ b/site/versioned_docs/version-4.1/reference/storage-algorithm.md @@ -3,20 +3,25 @@ title: Storage Algorithm --- # Storage Algorithm + The HarperDB storage algorithm is fundamental to the HarperDB core functionality, enabling the [Dynamic Schema](./dynamic-schema) and all other user-facing functionality. HarperDB is built on top of Lightning Memory-Mapped Database (LMDB), a key-value store offering industry leading performance and functionality, which allows for our storage algorithm to store data in tables as rows/objects. This document will provide additional details on how data is stored within HarperDB. ## Query Language Agnostic + The HarperDB storage algorithm was designed to abstract the data storage from any individual query language. HarperDB currently supports both SQL and NoSQL on top of this storage algorithm, with the ability to add additional query languages in the future. This means data can be inserted via NoSQL and read via SQL while hitting the same underlying data storage. ## ACID Compliant + Utilizing Multi-Version Concurrency Control (MVCC) through LMDB, HarperDB offers ACID compliance independently on each node. Readers and writers operate independently of each other, meaning readers don’t block writers and writers don’t block readers. Each HarperDB table has a single writer process, avoiding deadlocks and assuring that writes are executed in the order in which they were received. HarperDB tables can have multiple reader processes operating at the same time for consistent, high scale reads. ## Universally Indexed + All top level attributes are automatically indexed immediately upon ingestion. The [HarperDB Dynamic Schema](./dynamic-schema) reflexively creates both the attribute and index reflexively as new schema metadata comes in. Indexes are agnostic of datatype, honoring the following order: booleans, numbers ordered naturally, strings ordered lexically. Within the LMDB implementation, table records are grouped together into a single LMDB environment file, where each attribute index is a sub-database (dbi) inside said environment file. An example of the indexing scheme can be seen below. ## Additional LMDB Benefits + HarperDB inherits both functional and performance benefits by implementing LMDB as the underlying key-value store. Data is memory-mapped, which enables quick data access without data duplication. All writers are fully serialized, making writes deadlock-free. LMDB is built to maximize operating system features and functionality, fully exploiting buffer cache and built to run in CPU cache. To learn more about LMDB, visit their documentation. ## HarperDB Indexing Example (Single Table) -![](/img/v4.1/reference/HarperDB-3.0-Storage-Algorithm.png.webp) \ No newline at end of file +![](/img/v4.1/reference/HarperDB-3.0-Storage-Algorithm.png.webp) diff --git a/site/versioned_docs/version-4.1/release-notes/End-of-Life.md b/site/versioned_docs/version-4.1/release-notes/End-of-Life.md index ca15f713..86853d5e 100644 --- a/site/versioned_docs/version-4.1/release-notes/End-of-Life.md +++ b/site/versioned_docs/version-4.1/release-notes/End-of-Life.md @@ -7,7 +7,7 @@ title: HarperDB Software Lifecycle Schedules The lifecycle schedules below form a part of HarperDB’s Support Policies. They include Major Releases and Minor Release that have reached their end of life date in the past 3 years. | **Release** | **Release Date** | **End of Life Date** | -|-------------|------------------|----------------------| +| ----------- | ---------------- | -------------------- | | 3.2 | 6/22 | 6/25 | | 3.3 | 9/22 | 9/25 | | 4.0 | 1/23 | 1/26 | diff --git a/site/versioned_docs/version-4.1/release-notes/index.md b/site/versioned_docs/version-4.1/release-notes/index.md index 8c0a3fb9..9de2801b 100644 --- a/site/versioned_docs/version-4.1/release-notes/index.md +++ b/site/versioned_docs/version-4.1/release-notes/index.md @@ -28,7 +28,6 @@ title: Release Notes [4.0.0 Tucker](./v4-tucker/4.0.0) - ### Past Releases [Meet Monkey](./v3-monkey/) Our 3rd Release Pup @@ -51,7 +50,7 @@ title: Release Notes [3.0.0 Monkey](./v3-monkey/3.0.0) -*** +--- [Meet Penny](./v2-penny/) Our 2nd Release Pup @@ -67,7 +66,7 @@ title: Release Notes [2.1.1 Penny](./v2-penny/2.1.1) -*** +--- [Meet Alby](./v1-alby/) Our 1st Release Pup diff --git a/site/versioned_docs/version-4.1/release-notes/v1-alby/1.1.0.md b/site/versioned_docs/version-4.1/release-notes/v1-alby/1.1.0.md index b42514a2..2256a825 100644 --- a/site/versioned_docs/version-4.1/release-notes/v1-alby/1.1.0.md +++ b/site/versioned_docs/version-4.1/release-notes/v1-alby/1.1.0.md @@ -4,74 +4,69 @@ sidebar_position: 89899 --- ### HarperDB 1.1.0, Alby Release + 4/18/2018 **Features** -* Users & Roles: +- Users & Roles: + - Limit/Assign access to all HarperDB operations + + - Limit/Assign access to schemas, tables & attributes + + - Limit/Assign access to specific SQL operations (`INSERT`, `UPDATE`, `DELETE`, `SELECT`) - * Limit/Assign access to all HarperDB operations +- Enhanced SQL parser + - Added extensive ANSI SQL Support. + - Added Array function, which allows for converting relational data into Object/Hierarchical data + - `Distinct_Array` Function: allows for removing duplicates in the Array function. + - Enhanced SQL Validation: Improved validation around structure of SQL, validating the schema, etc.. + - 10x performance improvement on SQL statements. - * Limit/Assign access to schemas, tables & attributes +- Export Function: can now call a NoSQL/SQL search and have it export to CSV or JSON. - * Limit/Assign access to specific SQL operations (`INSERT`, `UPDATE`, `DELETE`, `SELECT`) - -* Enhanced SQL parser - - * Added extensive ANSI SQL Support. - - * Added Array function, which allows for converting relational data into Object/Hierarchical data - - * `Distinct_Array` Function: allows for removing duplicates in the Array function. - - * Enhanced SQL Validation: Improved validation around structure of SQL, validating the schema, etc.. - - * 10x performance improvement on SQL statements. - -* Export Function: can now call a NoSQL/SQL search and have it export to CSV or JSON. +- Added upgrade function to CLI -* Added upgrade function to CLI +- Added ability to perform bulk update from CSV -* Added ability to perform bulk update from CSV +- Created landing page for HarperDB. -* Created landing page for HarperDB. +- Added CORS support to HarperDB -* Added CORS support to HarperDB - **Fixes** -* Fixed memory leak in CSV bulk loads +- Fixed memory leak in CSV bulk loads -* Corrected error when attempting to perform a `SQL DELETE` +- Corrected error when attempting to perform a `SQL DELETE` -* Added further validation to NoSQL `UPDATE` to validate schema & table exist +- Added further validation to NoSQL `UPDATE` to validate schema & table exist -* Fixed install issue occurring when part of the install path does not exist, the install would silently fail. +- Fixed install issue occurring when part of the install path does not exist, the install would silently fail. -* Fixed issues with replicated data when one of the replicas is down +- Fixed issues with replicated data when one of the replicas is down -* Removed logging of initial user’s credentials during install +- Removed logging of initial user’s credentials during install -* Can now use reserved words as aliases in SQL +- Can now use reserved words as aliases in SQL -* Removed user(s) password in results when calling `list_users` +- Removed user(s) password in results when calling `list_users` -* Corrected forwarding of operations to other nodes in a cluster +- Corrected forwarding of operations to other nodes in a cluster -* Corrected lag in schema meta-data passing to other nodes in a cluster +- Corrected lag in schema meta-data passing to other nodes in a cluster -* Drop table & schema now move the table & schema or table to the trash folder under the Database folder for later permanent deletion. +- Drop table & schema now move the table & schema or table to the trash folder under the Database folder for later permanent deletion. -* Bulk inserts no longer halt the entire operation if n records already exist, instead the return includes the hashes of records that have been skipped. +- Bulk inserts no longer halt the entire operation if n records already exist, instead the return includes the hashes of records that have been skipped. -* Added ability to accept EULA from command line +- Added ability to accept EULA from command line -* Corrected `search_by_value` not searching on the correct attribute +- Corrected `search_by_value` not searching on the correct attribute -* Added ability to increase the timeout of a request by adding `SERVER_TIMEOUT_MS` to config/settings.js +- Added ability to increase the timeout of a request by adding `SERVER_TIMEOUT_MS` to config/settings.js -* Add error handling resulting from SQL calculations. +- Add error handling resulting from SQL calculations. -* Standardized error responses as JSON. +- Standardized error responses as JSON. -* Corrected internal process generation to not allow more processes than machine has cores. \ No newline at end of file +- Corrected internal process generation to not allow more processes than machine has cores. diff --git a/site/versioned_docs/version-4.1/release-notes/v1-alby/1.2.0.md b/site/versioned_docs/version-4.1/release-notes/v1-alby/1.2.0.md index 095bf239..a504a7ad 100644 --- a/site/versioned_docs/version-4.1/release-notes/v1-alby/1.2.0.md +++ b/site/versioned_docs/version-4.1/release-notes/v1-alby/1.2.0.md @@ -4,39 +4,39 @@ sidebar_position: 89799 --- ### HarperDB 1.2.0, Alby Release + 7/10/2018 **Features** -* Time to Live: Conserve the resources of your edge device by setting data on devices to live for a specific period of time. -* Geo: HarperDB has implemented turf.js into its SQL parser to enable geo based analytics. -* Jobs: CSV Data loads, Exports & Time to Live now all run as back ground jobs. -* Exports: Perform queries that export into JSON or CSV and save to disk or S3. - +- Time to Live: Conserve the resources of your edge device by setting data on devices to live for a specific period of time. +- Geo: HarperDB has implemented turf.js into its SQL parser to enable geo based analytics. +- Jobs: CSV Data loads, Exports & Time to Live now all run as back ground jobs. +- Exports: Perform queries that export into JSON or CSV and save to disk or S3. **Fixes** -* Fixed issue where CSV data loads incorrectly report number of records loaded. -* Added validation to stop `BETWEEN` operations in SQL. -* Updated logging to not include internal variables in the logs. -* Cleaned up `add_role` response to not include internal variables. -* Removed old and unused dependencies. -* Build out further unit tests and integration tests. -* Fixed https to handle certificates properly. -* Improved stability of clustering & replication. -* Corrected issue where Objects and Arrays were not casting properly in `SQL SELECT` response. -* Fixed issue where Blob text was not being returned from `SQL SELECT`s. -* Fixed error being returned when querying on table with no data, now correctly returns empty array. -* Improved performance in SQL when searching on exact values. -* Fixed error when ./harperdb stop is called. -* Fixed logging issue causing instability in installer. -* Fixed `read_log` operation to accept date time. -* Added permissions checking to `export_to_s3`. -* Added ability to run SQL on `SELECT` without a `FROM`. -* Fixed issue where updating a user’s password was not encrypting properly. -* Fixed `user_guide.html` to point to readme on git repo. -* Created option to have HarperDB run as a foreground process. -* Updated `user_info` to return the correct role for a user. -* Fixed issue where HarperDB would not stop if the database root was deleted. -* Corrected error message on insert if an invalid schema is provided. -* Added permissions checks for user & role operations. \ No newline at end of file +- Fixed issue where CSV data loads incorrectly report number of records loaded. +- Added validation to stop `BETWEEN` operations in SQL. +- Updated logging to not include internal variables in the logs. +- Cleaned up `add_role` response to not include internal variables. +- Removed old and unused dependencies. +- Build out further unit tests and integration tests. +- Fixed https to handle certificates properly. +- Improved stability of clustering & replication. +- Corrected issue where Objects and Arrays were not casting properly in `SQL SELECT` response. +- Fixed issue where Blob text was not being returned from `SQL SELECT`s. +- Fixed error being returned when querying on table with no data, now correctly returns empty array. +- Improved performance in SQL when searching on exact values. +- Fixed error when ./harperdb stop is called. +- Fixed logging issue causing instability in installer. +- Fixed `read_log` operation to accept date time. +- Added permissions checking to `export_to_s3`. +- Added ability to run SQL on `SELECT` without a `FROM`. +- Fixed issue where updating a user’s password was not encrypting properly. +- Fixed `user_guide.html` to point to readme on git repo. +- Created option to have HarperDB run as a foreground process. +- Updated `user_info` to return the correct role for a user. +- Fixed issue where HarperDB would not stop if the database root was deleted. +- Corrected error message on insert if an invalid schema is provided. +- Added permissions checks for user & role operations. diff --git a/site/versioned_docs/version-4.1/release-notes/v1-alby/1.3.0.md b/site/versioned_docs/version-4.1/release-notes/v1-alby/1.3.0.md index ad196159..e3a5215f 100644 --- a/site/versioned_docs/version-4.1/release-notes/v1-alby/1.3.0.md +++ b/site/versioned_docs/version-4.1/release-notes/v1-alby/1.3.0.md @@ -4,24 +4,24 @@ sidebar_position: 89699 --- ### HarperDB 1.3.0, Alby Release + 11/2/2018 **Features** -* Upgrade: Upgrade to newest version via command line. -* SQL Support: Added `IS NULL` for SQL parser. -* Added attribute validation to search operations. - +- Upgrade: Upgrade to newest version via command line. +- SQL Support: Added `IS NULL` for SQL parser. +- Added attribute validation to search operations. **Fixes** -* Fixed `SELECT` calculations, i.e. `SELECT` 2+2. -* Fixed select OR not returning expected results. -* No longer allowing reserved words for schema and table names. -* Corrected process interruptions from improper SQL statements. -* Improved message handling between spawned processes that replace killed processes. -* Enhanced error handling for updates to tables that do not exist. -* Fixed error handling for NoSQL responses when `get_attributes` is provided with invalid attributes. -* Fixed issue with new columns not being updated properly in update statements. -* Now validating roles, tables and attributes when creating or updating roles. -* Fixed an issue where in some cases `undefined` was being returned after dropping a role +- Fixed `SELECT` calculations, i.e. `SELECT` 2+2. +- Fixed select OR not returning expected results. +- No longer allowing reserved words for schema and table names. +- Corrected process interruptions from improper SQL statements. +- Improved message handling between spawned processes that replace killed processes. +- Enhanced error handling for updates to tables that do not exist. +- Fixed error handling for NoSQL responses when `get_attributes` is provided with invalid attributes. +- Fixed issue with new columns not being updated properly in update statements. +- Now validating roles, tables and attributes when creating or updating roles. +- Fixed an issue where in some cases `undefined` was being returned after dropping a role diff --git a/site/versioned_docs/version-4.1/release-notes/v1-alby/1.3.1.md b/site/versioned_docs/version-4.1/release-notes/v1-alby/1.3.1.md index 77e3ffe4..56927389 100644 --- a/site/versioned_docs/version-4.1/release-notes/v1-alby/1.3.1.md +++ b/site/versioned_docs/version-4.1/release-notes/v1-alby/1.3.1.md @@ -4,26 +4,26 @@ sidebar_position: 89698 --- ### HarperDB 1.3.1, Alby Release + 2/26/2019 **Features** -* Clustering connection direction appointment -* Foundations for threading/multi processing -* UUID autogen for hash attributes that were not provided -* Added cluster status operation - +- Clustering connection direction appointment +- Foundations for threading/multi processing +- UUID autogen for hash attributes that were not provided +- Added cluster status operation **Bug Fixes and Enhancements** -* More logging -* Clustering communication enhancements -* Clustering queue ordering by timestamps -* Cluster re connection enhancements -* Number of system core(s) detection -* Node LTS (10.15) compatibility -* Update/Alter users enhancements -* General performance enhancements -* Warning is logged if different versions of harperdb are connected via clustering -* Fixed need to restart after user creation/alteration -* Fixed SQL error that occurred on selecting from an empty table \ No newline at end of file +- More logging +- Clustering communication enhancements +- Clustering queue ordering by timestamps +- Cluster re connection enhancements +- Number of system core(s) detection +- Node LTS (10.15) compatibility +- Update/Alter users enhancements +- General performance enhancements +- Warning is logged if different versions of harperdb are connected via clustering +- Fixed need to restart after user creation/alteration +- Fixed SQL error that occurred on selecting from an empty table diff --git a/site/versioned_docs/version-4.1/release-notes/v2-penny/2.1.1.md b/site/versioned_docs/version-4.1/release-notes/v2-penny/2.1.1.md index e1314a5f..c59337d7 100644 --- a/site/versioned_docs/version-4.1/release-notes/v2-penny/2.1.1.md +++ b/site/versioned_docs/version-4.1/release-notes/v2-penny/2.1.1.md @@ -4,24 +4,25 @@ sidebar_position: 79898 --- ### HarperDB 2.1.1, Penny Release + 05/22/2020 **Highlights** -* CORE-1007 Added the ability to perform `SQL INSERT` & `UPDATE` with function calls & expressions on values. -* CORE-1023 Fixed minor bug in final SQL step incorrectly trying to translate ordinals to alias in `ORDER BY` statement. -* CORE-1020 Fixed bug allowing 'null' and 'undefined' string values to be passed in as valid hash values. -* CORE-1006 Added SQL functionality that enables `JOIN` statements across different schemas. -* CORE-1005 Implemented JSONata library to handle our JSON document search functionality in SQL, creating the `SEARCH_JSON` function. -* CORE-1009 Updated schema validation to allow all printable ASCII characters to be used in schema/table/attribute names, except, forward slashes and backticks. Same rules apply now for hash attribute values. -* CORE-1003 Fixed handling of ORDER BY statements with function aliases. -* CORE-1004 Fixed bug related to `SELECT*` on `JOIN` queries with table columns with the same name. -* CORE-996 Fixed an issue where the `transact_to_cluster` flag is lost for CSV URL loads, fixed an issue where new attributes created in CSV bulk load do not sync to the cluster. -* CORE-994 Added new operation `system_information`. This operation returns info & metrics for the OS, time, memory, cpu, disk, network. -* CORE-993 Added new custom date functions for AlaSQL & UTC updates. -* CORE-991 Changed jobs to spawn a new process which will run the intended job without impacting a main HarperDB process. -* CORE-992 HTTPS enabled by default. -* CORE-990 Updated `describe_table` to add the record count for the table for LMDB data storage. -* CORE-989 Killed the socket cluster processes prior to HarperDB processes to eliminate a false uptime. -* CORE-975 Updated time values set by SQL Date Functions to be in epoch format. -* CORE-974 Added date functions to `SQL SELECT` column alias functionality. \ No newline at end of file +- CORE-1007 Added the ability to perform `SQL INSERT` & `UPDATE` with function calls & expressions on values. +- CORE-1023 Fixed minor bug in final SQL step incorrectly trying to translate ordinals to alias in `ORDER BY` statement. +- CORE-1020 Fixed bug allowing 'null' and 'undefined' string values to be passed in as valid hash values. +- CORE-1006 Added SQL functionality that enables `JOIN` statements across different schemas. +- CORE-1005 Implemented JSONata library to handle our JSON document search functionality in SQL, creating the `SEARCH_JSON` function. +- CORE-1009 Updated schema validation to allow all printable ASCII characters to be used in schema/table/attribute names, except, forward slashes and backticks. Same rules apply now for hash attribute values. +- CORE-1003 Fixed handling of ORDER BY statements with function aliases. +- CORE-1004 Fixed bug related to `SELECT*` on `JOIN` queries with table columns with the same name. +- CORE-996 Fixed an issue where the `transact_to_cluster` flag is lost for CSV URL loads, fixed an issue where new attributes created in CSV bulk load do not sync to the cluster. +- CORE-994 Added new operation `system_information`. This operation returns info & metrics for the OS, time, memory, cpu, disk, network. +- CORE-993 Added new custom date functions for AlaSQL & UTC updates. +- CORE-991 Changed jobs to spawn a new process which will run the intended job without impacting a main HarperDB process. +- CORE-992 HTTPS enabled by default. +- CORE-990 Updated `describe_table` to add the record count for the table for LMDB data storage. +- CORE-989 Killed the socket cluster processes prior to HarperDB processes to eliminate a false uptime. +- CORE-975 Updated time values set by SQL Date Functions to be in epoch format. +- CORE-974 Added date functions to `SQL SELECT` column alias functionality. diff --git a/site/versioned_docs/version-4.1/release-notes/v2-penny/2.2.0.md b/site/versioned_docs/version-4.1/release-notes/v2-penny/2.2.0.md index 267168cd..a669ca8b 100644 --- a/site/versioned_docs/version-4.1/release-notes/v2-penny/2.2.0.md +++ b/site/versioned_docs/version-4.1/release-notes/v2-penny/2.2.0.md @@ -4,40 +4,41 @@ sidebar_position: 79799 --- ### HarperDB 2.2.0, Penny Release + 08/24/2020 **Features/Updates** -* CORE-997 Updated the data format for CSV data loads being sync'd across a cluster to take up less resources -* CORE-1018 Adds SQL functionality for `BETWEEN` statements -* CORE-1032 Updates permissions to allow regular users (i.e. non-super users) to call the `get_job` operation -* CORE-1036 On create/drop table we auto create/drop the related transactions environments for the schema.table -* CORE-1042 Built raw functions to write to a tables transaction log for insert/update/delete operations -* CORE-1057 Implemented write transaction into lmdb create/update/delete functions -* CORE-1048 Adds `SEARCH` wildcard handling for role permissions standards -* CORE-1059 Added config setting to disable transaction logging for an instance -* CORE-1076 Adds permissions filter to describe operations -* CORE-1043 Change clustering catchup to use the new transaction log -* CORE-1052 Removed word "master" from source -* CORE-1061 Added new operation called `delete_transactions_before` this will tail a transaction log for a specific schema / table -* CORE-1040 On HarperDB startup make sure all tables have a transaction environment -* CORE-1055 Added 2 new setting to change the server headersTimeout & keepAliveTimeout from the config file -* CORE-1044 Created new operation `read_transaction_log` which will allow a user to get transactions for a table by `timestamp`, `username`, or `hash_value` -* CORE-1043 Change clustering catchup to use the new transaction log -* CORE-1089 Added new attribute to `system_information` for table/transaction log data size in bytes & transaction log record count -* CORE-1101 Fix to store empty strings rather than considering them null & fix to be able to search on empty strings in SQL/NoSQL. -* CORE-1054 Updates permissions object to remove delete attribute permission and update table attribute permission key to `attribute_permissions` -* CORE-1092 Do not allow the `__createdtime__` to be updated -* CORE-1085 Updates create schema/table & drop schema/table/attribute operations permissions to require super user role and adds integration tests to validate -* CORE-1071 Updates response messages and status codes from `describe_schema` and `describe_table` operations to provide standard language/status code when a schema item is not found -* CORE-1049 Updates response message for SQL update op with no matching rows -* CORE-1096 Added tracking of the origin in the transaction log. This origin object stores the node name, timestamp of the transaction from the originating node & the user. +- CORE-997 Updated the data format for CSV data loads being sync'd across a cluster to take up less resources +- CORE-1018 Adds SQL functionality for `BETWEEN` statements +- CORE-1032 Updates permissions to allow regular users (i.e. non-super users) to call the `get_job` operation +- CORE-1036 On create/drop table we auto create/drop the related transactions environments for the schema.table +- CORE-1042 Built raw functions to write to a tables transaction log for insert/update/delete operations +- CORE-1057 Implemented write transaction into lmdb create/update/delete functions +- CORE-1048 Adds `SEARCH` wildcard handling for role permissions standards +- CORE-1059 Added config setting to disable transaction logging for an instance +- CORE-1076 Adds permissions filter to describe operations +- CORE-1043 Change clustering catchup to use the new transaction log +- CORE-1052 Removed word "master" from source +- CORE-1061 Added new operation called `delete_transactions_before` this will tail a transaction log for a specific schema / table +- CORE-1040 On HarperDB startup make sure all tables have a transaction environment +- CORE-1055 Added 2 new setting to change the server headersTimeout & keepAliveTimeout from the config file +- CORE-1044 Created new operation `read_transaction_log` which will allow a user to get transactions for a table by `timestamp`, `username`, or `hash_value` +- CORE-1043 Change clustering catchup to use the new transaction log +- CORE-1089 Added new attribute to `system_information` for table/transaction log data size in bytes & transaction log record count +- CORE-1101 Fix to store empty strings rather than considering them null & fix to be able to search on empty strings in SQL/NoSQL. +- CORE-1054 Updates permissions object to remove delete attribute permission and update table attribute permission key to `attribute_permissions` +- CORE-1092 Do not allow the `__createdtime__` to be updated +- CORE-1085 Updates create schema/table & drop schema/table/attribute operations permissions to require super user role and adds integration tests to validate +- CORE-1071 Updates response messages and status codes from `describe_schema` and `describe_table` operations to provide standard language/status code when a schema item is not found +- CORE-1049 Updates response message for SQL update op with no matching rows +- CORE-1096 Added tracking of the origin in the transaction log. This origin object stores the node name, timestamp of the transaction from the originating node & the user. **Bug Fixes** -* CORE-1028 Fixes bug for simple `SQL SELECT` queries not returning aliases and incorrectly returning hash values when not requested in query -* CORE-1037 Fixed an issue where numbers with leading zero i.e. 00123 are converted to numbers rather than being honored as strings. -* CORE-1063 Updates permission error response shape to consolidate issues into individual objects per schema/table combo -* CORE-1098 Fixed an issue where transaction environments were remaining in the global cache after being dropped. -* CORE-1086 Fixed issue where responses from insert/update were incorrect with skipped records. -* CORE-1079 Fixes SQL bugs around invalid schema/table and special characters in `WHERE` clause \ No newline at end of file +- CORE-1028 Fixes bug for simple `SQL SELECT` queries not returning aliases and incorrectly returning hash values when not requested in query +- CORE-1037 Fixed an issue where numbers with leading zero i.e. 00123 are converted to numbers rather than being honored as strings. +- CORE-1063 Updates permission error response shape to consolidate issues into individual objects per schema/table combo +- CORE-1098 Fixed an issue where transaction environments were remaining in the global cache after being dropped. +- CORE-1086 Fixed issue where responses from insert/update were incorrect with skipped records. +- CORE-1079 Fixes SQL bugs around invalid schema/table and special characters in `WHERE` clause diff --git a/site/versioned_docs/version-4.1/release-notes/v2-penny/2.2.2.md b/site/versioned_docs/version-4.1/release-notes/v2-penny/2.2.2.md index 827c63db..fca00967 100644 --- a/site/versioned_docs/version-4.1/release-notes/v2-penny/2.2.2.md +++ b/site/versioned_docs/version-4.1/release-notes/v2-penny/2.2.2.md @@ -4,13 +4,14 @@ sidebar_position: 79797 --- ### HarperDB 2.2.2, Penny Release + 10/27/2020 -* CORE-1154 Allowed transaction logging to be disabled even if clustering is enabled. -* CORE-1153 Fixed issue where `delete_files_before` was writing to transaction log. -* CORE-1152 Fixed issue where no more than 4 HarperDB forks would be created. -* CORE-1112 Adds handling for system timestamp attributes in permissions. -* CORE-1131 Adds better handling for checking perms on operations with action value in JSON. -* CORE-1113 Fixes validation bug checking for super user/cluster user permissions and other permissions. -* CORE-1135 Adds validation for valid keys in role API operations. -* CORE-1073 Adds new `import_from_s3` operation to API. +- CORE-1154 Allowed transaction logging to be disabled even if clustering is enabled. +- CORE-1153 Fixed issue where `delete_files_before` was writing to transaction log. +- CORE-1152 Fixed issue where no more than 4 HarperDB forks would be created. +- CORE-1112 Adds handling for system timestamp attributes in permissions. +- CORE-1131 Adds better handling for checking perms on operations with action value in JSON. +- CORE-1113 Fixes validation bug checking for super user/cluster user permissions and other permissions. +- CORE-1135 Adds validation for valid keys in role API operations. +- CORE-1073 Adds new `import_from_s3` operation to API. diff --git a/site/versioned_docs/version-4.1/release-notes/v2-penny/2.2.3.md b/site/versioned_docs/version-4.1/release-notes/v2-penny/2.2.3.md index eca953e2..06b89d4e 100644 --- a/site/versioned_docs/version-4.1/release-notes/v2-penny/2.2.3.md +++ b/site/versioned_docs/version-4.1/release-notes/v2-penny/2.2.3.md @@ -4,6 +4,7 @@ sidebar_position: 79796 --- ### HarperDB 2.2.3, Penny Release + 11/16/2020 -* CORE-1158 Performance improvements to core delete function and configuration of `delete_files_before` to run in batches with a pause into between. \ No newline at end of file +- CORE-1158 Performance improvements to core delete function and configuration of `delete_files_before` to run in batches with a pause into between. diff --git a/site/versioned_docs/version-4.1/release-notes/v2-penny/2.3.0.md b/site/versioned_docs/version-4.1/release-notes/v2-penny/2.3.0.md index 2b248490..a027eedb 100644 --- a/site/versioned_docs/version-4.1/release-notes/v2-penny/2.3.0.md +++ b/site/versioned_docs/version-4.1/release-notes/v2-penny/2.3.0.md @@ -4,19 +4,20 @@ sidebar_position: 79699 --- ### HarperDB 2.3.0, Penny Release + 12/03/2020 **Features/Updates** -* CORE-1191, CORE-1190, CORE-1125, CORE-1157, CORE-1126, CORE-1140, CORE-1134, CORE-1123, CORE-1124, CORE-1122 Added JWT Authentication option (See documentation for more information) -* CORE-1128, CORE-1143, CORE-1140, CORE-1129 Added `upsert` operation -* CORE-1187 Added `get_configuration` operation which allows admins to view their configuration settings. -* CORE-1175 Added new internal LMDB function to copy an environment for use in future features. -* CORE-1166 Updated packages to address security vulnerabilities. +- CORE-1191, CORE-1190, CORE-1125, CORE-1157, CORE-1126, CORE-1140, CORE-1134, CORE-1123, CORE-1124, CORE-1122 Added JWT Authentication option (See documentation for more information) +- CORE-1128, CORE-1143, CORE-1140, CORE-1129 Added `upsert` operation +- CORE-1187 Added `get_configuration` operation which allows admins to view their configuration settings. +- CORE-1175 Added new internal LMDB function to copy an environment for use in future features. +- CORE-1166 Updated packages to address security vulnerabilities. **Bug Fixes** -* CORE-1195 Modified `drop_attribute` to drop after data cleanse completes. -* CORE-1149 Fix SQL bug regarding self joins and updates alasql to 0.6.5 release. -* CORE-1168 Fix inconsistent invalid schema/table errors. -* CORE-1162 Fix bug which caused `delete_files_before` to cause tables to grow in size due to an open cursor issue. \ No newline at end of file +- CORE-1195 Modified `drop_attribute` to drop after data cleanse completes. +- CORE-1149 Fix SQL bug regarding self joins and updates alasql to 0.6.5 release. +- CORE-1168 Fix inconsistent invalid schema/table errors. +- CORE-1162 Fix bug which caused `delete_files_before` to cause tables to grow in size due to an open cursor issue. diff --git a/site/versioned_docs/version-4.1/release-notes/v2-penny/2.3.1.md b/site/versioned_docs/version-4.1/release-notes/v2-penny/2.3.1.md index 51291a01..03df0186 100644 --- a/site/versioned_docs/version-4.1/release-notes/v2-penny/2.3.1.md +++ b/site/versioned_docs/version-4.1/release-notes/v2-penny/2.3.1.md @@ -4,9 +4,10 @@ sidebar_position: 79698 --- ### HarperDB 2.3.1, Penny Release + 1/29/2021 **Bug Fixes** -* CORE-1218 A bug in HarperDB 2.3.0 was identified related to manually calling the `create_attribute` operation. This bug caused secondary indexes to be overwritten by the most recently inserted or updated value for the index, thereby causing a search operation filtered with that index to only return the most recently inserted/updated row. Note, this issue does not affect attributes that are reflexively/automatically created. It only affects attributes created using `create_attribute`. To resolve this issue in 2.3.0 or earlier, drop and recreate your table using reflexive attribute creation. In 2.3.1, drop and recreate your table and use either reflexive attribute creation or `create_attribute`. -* CORE-1219 Increased maximum table attributes from 1000 to 10000 \ No newline at end of file +- CORE-1218 A bug in HarperDB 2.3.0 was identified related to manually calling the `create_attribute` operation. This bug caused secondary indexes to be overwritten by the most recently inserted or updated value for the index, thereby causing a search operation filtered with that index to only return the most recently inserted/updated row. Note, this issue does not affect attributes that are reflexively/automatically created. It only affects attributes created using `create_attribute`. To resolve this issue in 2.3.0 or earlier, drop and recreate your table using reflexive attribute creation. In 2.3.1, drop and recreate your table and use either reflexive attribute creation or `create_attribute`. +- CORE-1219 Increased maximum table attributes from 1000 to 10000 diff --git a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.0.0.md b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.0.0.md index 2907ee6c..10319747 100644 --- a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.0.0.md +++ b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.0.0.md @@ -4,28 +4,29 @@ sidebar_position: 69999 --- ### HarperDB 3.0, Monkey Release + 5/18/2021 **Features/Updates** -* CORE-1217, CORE-1226, CORE-1232 Create new `search_by_conditions` operation. -* CORE-1304 Upgrade to Node 12.22.1. -* CORE-1235 Adds new upgrade/install functionality. -* CORE-1206, CORE-1248, CORE-1252 Implement `lmdb-store` library for optimized performance. -* CORE-1062 Added alias operation for `delete_files_before`, named `delete_records_before`. -* CORE-1243 Change `HTTPS_ON` settings value to false by default. -* CORE-1189 Implement fastify web server, resulting in improved performance. -* CORE-1221 Update user API to use role name instead of role id. -* CORE-1225 Updated dependencies to eliminate npm security warnings. -* CORE-1241 Adds 3.0 update directive and refactors/fixes update functionality. +- CORE-1217, CORE-1226, CORE-1232 Create new `search_by_conditions` operation. +- CORE-1304 Upgrade to Node 12.22.1. +- CORE-1235 Adds new upgrade/install functionality. +- CORE-1206, CORE-1248, CORE-1252 Implement `lmdb-store` library for optimized performance. +- CORE-1062 Added alias operation for `delete_files_before`, named `delete_records_before`. +- CORE-1243 Change `HTTPS_ON` settings value to false by default. +- CORE-1189 Implement fastify web server, resulting in improved performance. +- CORE-1221 Update user API to use role name instead of role id. +- CORE-1225 Updated dependencies to eliminate npm security warnings. +- CORE-1241 Adds 3.0 update directive and refactors/fixes update functionality. **Bug Fixes** -* CORE-1299 Remove all references to the `PROJECT_DIR` setting. This setting is problematic when using node version managers and upgrading the version of node and then installing a new instance of HarperDB. -* CORE-1288 Fix bug with drop table/schema that was causing 'env required' error log. -* CORE-1285 Update warning log when trying to create an attribute that already exists. -* CORE-1254 Added logic to manage data collisions in clustering. -* CORE-1212 Add pre-check to `drop_user` that returns error if user doesn't exist. -* CORE-1114 Update response code and message from `add_user` when user already exists. -* CORE-1111 Update response from `create_attribute` to match the create schema/table response. -* CORE-1205 Fixed bug that prevented schema/table from being dropped if name was a number or had a wildcard value in it. Updated validation for insert, upsert and update. \ No newline at end of file +- CORE-1299 Remove all references to the `PROJECT_DIR` setting. This setting is problematic when using node version managers and upgrading the version of node and then installing a new instance of HarperDB. +- CORE-1288 Fix bug with drop table/schema that was causing 'env required' error log. +- CORE-1285 Update warning log when trying to create an attribute that already exists. +- CORE-1254 Added logic to manage data collisions in clustering. +- CORE-1212 Add pre-check to `drop_user` that returns error if user doesn't exist. +- CORE-1114 Update response code and message from `add_user` when user already exists. +- CORE-1111 Update response from `create_attribute` to match the create schema/table response. +- CORE-1205 Fixed bug that prevented schema/table from being dropped if name was a number or had a wildcard value in it. Updated validation for insert, upsert and update. diff --git a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.0.md b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.0.md index 148690f6..f14acb8e 100644 --- a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.0.md +++ b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.0.md @@ -4,20 +4,21 @@ sidebar_position: 69899 --- ### HarperDB 3.1.0, Monkey Release + 8/24/2021 **Features/Updates** -* CORE-1320, CORE-1321, CORE-1323, CORE-1324 Version 1.0 of HarperDB Custom Functions -* CORE-1275, CORE-1276, CORE-1278, CORE-1279, CORE-1280, CORE-1282, CORE-1283, CORE-1305, CORE-1314 IPC server for communication between HarperDB processes, including HarperDB, HarperDB Clustering, and HarperDB Functions -* CORE-1352, CORE-1355, CORE-1356, CORE-1358 Implement pm2 for HarperDB process management -* CORE-1292, CORE-1308, CORE-1312, CORE-1334, CORE-1338 Updated installation process to start HarperDB immediately on install and to accept all config settings via environment variable or command line arguments -* CORE-1310 Updated licensing functionality -* CORE-1301 Updated validation for performance improvement -* CORE-1359 Add `hdb-response-time` header which returns the HarperDB response time in milliseconds -* CORE-1330, CORE-1309 New config settings: `LOG_TO_FILE`, `LOG_TO_STDSTREAMS`, `IPC_SERVER_PORT`, `RUN_IN_FOREGROUND`, `CUSTOM_FUNCTIONS`, `CUSTOM_FUNCTIONS_PORT`, `CUSTOM_FUNCTIONS_DIRECTORY`, `MAX_CUSTOM_FUNCTION_PROCESSES` +- CORE-1320, CORE-1321, CORE-1323, CORE-1324 Version 1.0 of HarperDB Custom Functions +- CORE-1275, CORE-1276, CORE-1278, CORE-1279, CORE-1280, CORE-1282, CORE-1283, CORE-1305, CORE-1314 IPC server for communication between HarperDB processes, including HarperDB, HarperDB Clustering, and HarperDB Functions +- CORE-1352, CORE-1355, CORE-1356, CORE-1358 Implement pm2 for HarperDB process management +- CORE-1292, CORE-1308, CORE-1312, CORE-1334, CORE-1338 Updated installation process to start HarperDB immediately on install and to accept all config settings via environment variable or command line arguments +- CORE-1310 Updated licensing functionality +- CORE-1301 Updated validation for performance improvement +- CORE-1359 Add `hdb-response-time` header which returns the HarperDB response time in milliseconds +- CORE-1330, CORE-1309 New config settings: `LOG_TO_FILE`, `LOG_TO_STDSTREAMS`, `IPC_SERVER_PORT`, `RUN_IN_FOREGROUND`, `CUSTOM_FUNCTIONS`, `CUSTOM_FUNCTIONS_PORT`, `CUSTOM_FUNCTIONS_DIRECTORY`, `MAX_CUSTOM_FUNCTION_PROCESSES` **Bug Fixes** -* CORE-1315 Corrected issue in HarperDB restart scenario -* CORE-1370 Update some of the validation error handlers so that they don't log full stack \ No newline at end of file +- CORE-1315 Corrected issue in HarperDB restart scenario +- CORE-1370 Update some of the validation error handlers so that they don't log full stack diff --git a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.1.md b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.1.md index 0adbeb21..8f90dc10 100644 --- a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.1.md +++ b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.1.md @@ -4,15 +4,16 @@ sidebar_position: 69898 --- ### HarperDB 3.1.1, Monkey Release + 9/23/2021 **Features/Updates** -* CORE-1393 Added utility function to add settings from env/cmd vars to the settings file on every run/restart -* CORE-1395 Create a setting which will allow to enable the local Studio to be served from an instance of HarperDB -* CORE-1397 Update the stock 404 response to not return the request URL -* General updates to optimize Docker container +- CORE-1393 Added utility function to add settings from env/cmd vars to the settings file on every run/restart +- CORE-1395 Create a setting which will allow to enable the local Studio to be served from an instance of HarperDB +- CORE-1397 Update the stock 404 response to not return the request URL +- General updates to optimize Docker container **Bug Fixes** -* CORE-1399 Added fixes for complex SQL alias issues \ No newline at end of file +- CORE-1399 Added fixes for complex SQL alias issues diff --git a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.2.md b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.2.md index f1c192b6..706e5956 100644 --- a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.2.md +++ b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.2.md @@ -4,12 +4,13 @@ sidebar_position: 69897 --- ### HarperDB 3.1.2, Monkey Release + 10/21/2021 **Features/Updates** -* Updated the installation ASCII art to reflect the new HarperDB logo +- Updated the installation ASCII art to reflect the new HarperDB logo **Bug Fixes** -* CORE-1408 Corrects issue where `drop_attribute` was not properly setting the LMDB version number causing tables to behave unexpectedly \ No newline at end of file +- CORE-1408 Corrects issue where `drop_attribute` was not properly setting the LMDB version number causing tables to behave unexpectedly diff --git a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.3.md b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.3.md index 2d484f8d..1a7d3301 100644 --- a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.3.md +++ b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.3.md @@ -4,8 +4,9 @@ sidebar_position: 69896 --- ### HarperDB 3.1.3, Monkey Release + 1/14/2022 **Bug Fixes** -* CORE-1446 Fix for scans on indexes larger than 1 million entries causing queries to never return \ No newline at end of file +- CORE-1446 Fix for scans on indexes larger than 1 million entries causing queries to never return diff --git a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.4.md b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.4.md index ae0074fd..3fa86ead 100644 --- a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.4.md +++ b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.4.md @@ -4,8 +4,9 @@ sidebar_position: 69895 --- ### HarperDB 3.1.4, Monkey Release + 2/24/2022 **Features/Updates** -* CORE-1460 Added new setting `STORAGE_WRITE_ASYNC`. If this setting is true, LMDB will have faster write performance at the expense of not being crash safe. The default for this setting is false, which results in HarperDB being crash safe. \ No newline at end of file +- CORE-1460 Added new setting `STORAGE_WRITE_ASYNC`. If this setting is true, LMDB will have faster write performance at the expense of not being crash safe. The default for this setting is false, which results in HarperDB being crash safe. diff --git a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.5.md b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.5.md index eff4b5b0..23661928 100644 --- a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.5.md +++ b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.1.5.md @@ -4,8 +4,9 @@ sidebar_position: 69894 --- ### HarperDB 3.1.5, Monkey Release + 3/4/2022 **Features/Updates** -* CORE-1498 Fixed incorrect autocasting of string that start with "0." that tries to convert to number but instead returns NaN. \ No newline at end of file +- CORE-1498 Fixed incorrect autocasting of string that start with "0." that tries to convert to number but instead returns NaN. diff --git a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.2.0.md b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.2.0.md index 003575d8..fa215082 100644 --- a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.2.0.md +++ b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.2.0.md @@ -4,10 +4,11 @@ sidebar_position: 69799 --- ### HarperDB 3.2.0, Monkey Release + 3/25/2022 **Features/Updates** -* CORE-1391 Bug fix related to orphaned HarperDB background processes. -* CORE-1509 Updated node version check, updated Node.js version, updated project dependencies. -* CORE-1518 Remove final call from logger. \ No newline at end of file +- CORE-1391 Bug fix related to orphaned HarperDB background processes. +- CORE-1509 Updated node version check, updated Node.js version, updated project dependencies. +- CORE-1518 Remove final call from logger. diff --git a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.2.1.md b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.2.1.md index dc511a70..4cc983a4 100644 --- a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.2.1.md +++ b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.2.1.md @@ -4,8 +4,9 @@ sidebar_position: 69798 --- ### HarperDB 3.2.1, Monkey Release + 6/1/2022 **Features/Updates** -* CORE-1573 Added logic to track the pid of the foreground process if running in foreground. Then on stop, use that pid to kill the process. Logic was also added to kill the pm2 daemon when stop is called. \ No newline at end of file +- CORE-1573 Added logic to track the pid of the foreground process if running in foreground. Then on stop, use that pid to kill the process. Logic was also added to kill the pm2 daemon when stop is called. diff --git a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.3.0.md b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.3.0.md index 3e3ca784..236704dd 100644 --- a/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.3.0.md +++ b/site/versioned_docs/version-4.1/release-notes/v3-monkey/3.3.0.md @@ -5,8 +5,8 @@ sidebar_position: 69699 ### HarperDB 3.3.0 - Monkey -* CORE-1595 Added new role type `structure_user`, this enables non-superusers to be able to create/drop schema/table/attribute. -* CORE-1501 Improved performance for drop_table. -* CORE-1599 Added two new operations for custom functions `install_node_modules` & `audit_node_modules`. -* CORE-1598 Added `skip_node_modules` flag to `package_custom_function_project` operation. This flag allows for not bundling project dependencies and deploying a smaller project to other nodes. Use this flag in tandem with `install_node_modules`. -* CORE-1707 Binaries are now included for Linux on AMD64, Linux on ARM64, and macOS. GCC, Make, Python are no longer required when installing on these platforms. +- CORE-1595 Added new role type `structure_user`, this enables non-superusers to be able to create/drop schema/table/attribute. +- CORE-1501 Improved performance for drop_table. +- CORE-1599 Added two new operations for custom functions `install_node_modules` & `audit_node_modules`. +- CORE-1598 Added `skip_node_modules` flag to `package_custom_function_project` operation. This flag allows for not bundling project dependencies and deploying a smaller project to other nodes. Use this flag in tandem with `install_node_modules`. +- CORE-1707 Binaries are now included for Linux on AMD64, Linux on ARM64, and macOS. GCC, Make, Python are no longer required when installing on these platforms. diff --git a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.0.md b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.0.md index d2aa32b2..b94ea2f8 100644 --- a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.0.md +++ b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.0.md @@ -4,121 +4,128 @@ sidebar_position: 59999 --- ### HarperDB 4.0.0, Tucker Release + 11/2/2022 **Networking & Data Replication (Clustering)** -The HarperDB clustering internals have been rewritten and the underlying technology for Clustering has been completely replaced with [NATS](https://nats.io/), an enterprise grade connective technology responsible for addressing, discovery and exchanging of messages that drive the common patterns in distributed systems. -* CORE-1464, CORE-1470, : Remove SocketCluster dependencies and all code related to them. -* CORE-1465, CORE-1485, CORE-1537, CORE-1538, CORE-1558, CORE-1583, CORE_1665, CORE-1710, CORE-1801, CORE-1865 :Add nats-`server` code as dependency, on install of HarperDB download nats-`server` is possible else fallback to building from source code. -* CORE-1593, CORE-1761: Add `nats.js` as project dependency. -* CORE-1466: Build NATS configs on `harperdb run` based on HarperDB YAML configuration. -* CORE-1467, CORE-1508: Launch and manage NATS servers with PM2. -* CORE-1468, CORE-1507: Create a process which reads the work queue stream and processes transactions. -* CORE-1481, CORE-1529, CORE-1698, CORE-1502, CORE-1696: On upgrade to 4.0, update pre-existing clustering configurations, create table transaction streams, create work queue stream, update `hdb_nodes` table, create clustering folder structure, and rebuild self-signed certs. -* CORE-1494, CORE-1521, CORE-1755: Build out internals to interface with NATS. -* CORE-1504: Update existing hooks to save transactions to work with NATS. -* CORE-1514, CORE-1515, CORE-1516, CORE-1527, CORE-1532: Update `add_node`, `update_node`, and `remove_node` operations to no longer need host and port in payload. These operations now manage dynamically sourcing of table level transaction streams between nodes and work queues. -* CORE-1522: Create `NATSReplyService` process which handles the receiving NATS based requests from remote instances and sending back appropriate responses. -* CORE-1471, CORE-1568, CORE-1563, CORE-1534, CORE-1569: Update `cluster_status` operation. -* CORE-1611: Update pre-existing transaction log operations to be audit log operations. -* CORE-1541, CORE-1612, CORE-1613: Create translation log operations which interface with streams. -* CORE-1668: Update NATS serialization / deserialization to use MessagePack. -* CORE-1673: Add `system_info` param to `hdb_nodes` table and update on `add_node` and `cluster_status`. -* CORE-1477, CORE-1493, CORE-1557, CORE-1596, CORE-1577: Both a full HarperDB restart & just clustering restart call the NATS server with a reload directive to maintain full uptime while servers refresh. -* CORE-1474:HarperDB install adds clustering folder structure. -* CORE-1530: Post `drop_table` HarperDB purges the related transaction stream. -* CORE-1567: Set NATS config to always use TLS. -* CORE-1543: Removed the `transact_to_cluster` attribute from the bulk load operations. Now bulk loads always replicate. -* CORE-1533, CORE-1556, CORE-1561, CORE-1562, CORE-1564: New operation `configure_cluster`, this operation enables bulk publishing and subscription of multiple tables to multiple instances of HarperDB. -* CORE-1535: Create work queue stream on install of HarperDB. This stream receives transactions from remote instances of HarperDB which are then ingested in order. -* CORE-1551: Create transaction streams on the remote node if they do not exist when performing `add_node` or `update_node`. -* CORE-1594, CORE-1605, CORE-1749, CORE-1767, CORE-1770: Optimize the work queue stream and its consumer to be more performant and validate exact once delivery. -* CORE-1621, CORE-1692, CORE-1570, CORE-1693: NATS stream names are MD5 hashed to avoid characters that HarperDB allows, but NATS may not. -* CORE-1762: Add a new optional attribute to `add_node` and `update_node` named `opt_start_time`. This attribute sets a starting time to start synchronizing transactions. -* CORE-1785: Optimizations and bug fixes in regards to sourcing data from remote instances on HarperDB. -* CORE-1588: Created new operation `set_cluster_routes` to enable setting routes for instances of HarperDB to mesh together. -* CORE-1589: Created new operation `get_cluster_routes` to allow for retrieval of routes used to connect the instance of HarperDB to the mesh. -* CORE-1590: Created new operation `delete_cluster_routes` to allow for removal of routes used to connect the instance of HarperDB to the mesh. -* CORE-1667: Fix old environment variable `CLUSTERING_PORT` not mapping to new hub server port. -* CORE-1609: Allow `remove_node` to be called when the other node cannot be reached. -* CORE-1815: Add transaction lock to `add_node` and `update_node` to avoid concurrent nats source update bug. -* CORE-1848: Update stream configs if the node name has been changed in the YAML configuration. -* CORE-1873: Update `add_node` and `update_node` so that it auto-creates schema/table on both local and remote node respectively +The HarperDB clustering internals have been rewritten and the underlying technology for Clustering has been completely replaced with [NATS](https://nats.io/), an enterprise grade connective technology responsible for addressing, discovery and exchanging of messages that drive the common patterns in distributed systems. +- CORE-1464, CORE-1470, : Remove SocketCluster dependencies and all code related to them. +- CORE-1465, CORE-1485, CORE-1537, CORE-1538, CORE-1558, CORE-1583, CORE_1665, CORE-1710, CORE-1801, CORE-1865 :Add nats-`server` code as dependency, on install of HarperDB download nats-`server` is possible else fallback to building from source code. +- CORE-1593, CORE-1761: Add `nats.js` as project dependency. +- CORE-1466: Build NATS configs on `harperdb run` based on HarperDB YAML configuration. +- CORE-1467, CORE-1508: Launch and manage NATS servers with PM2. +- CORE-1468, CORE-1507: Create a process which reads the work queue stream and processes transactions. +- CORE-1481, CORE-1529, CORE-1698, CORE-1502, CORE-1696: On upgrade to 4.0, update pre-existing clustering configurations, create table transaction streams, create work queue stream, update `hdb_nodes` table, create clustering folder structure, and rebuild self-signed certs. +- CORE-1494, CORE-1521, CORE-1755: Build out internals to interface with NATS. +- CORE-1504: Update existing hooks to save transactions to work with NATS. +- CORE-1514, CORE-1515, CORE-1516, CORE-1527, CORE-1532: Update `add_node`, `update_node`, and `remove_node` operations to no longer need host and port in payload. These operations now manage dynamically sourcing of table level transaction streams between nodes and work queues. +- CORE-1522: Create `NATSReplyService` process which handles the receiving NATS based requests from remote instances and sending back appropriate responses. +- CORE-1471, CORE-1568, CORE-1563, CORE-1534, CORE-1569: Update `cluster_status` operation. +- CORE-1611: Update pre-existing transaction log operations to be audit log operations. +- CORE-1541, CORE-1612, CORE-1613: Create translation log operations which interface with streams. +- CORE-1668: Update NATS serialization / deserialization to use MessagePack. +- CORE-1673: Add `system_info` param to `hdb_nodes` table and update on `add_node` and `cluster_status`. +- CORE-1477, CORE-1493, CORE-1557, CORE-1596, CORE-1577: Both a full HarperDB restart & just clustering restart call the NATS server with a reload directive to maintain full uptime while servers refresh. +- CORE-1474:HarperDB install adds clustering folder structure. +- CORE-1530: Post `drop_table` HarperDB purges the related transaction stream. +- CORE-1567: Set NATS config to always use TLS. +- CORE-1543: Removed the `transact_to_cluster` attribute from the bulk load operations. Now bulk loads always replicate. +- CORE-1533, CORE-1556, CORE-1561, CORE-1562, CORE-1564: New operation `configure_cluster`, this operation enables bulk publishing and subscription of multiple tables to multiple instances of HarperDB. +- CORE-1535: Create work queue stream on install of HarperDB. This stream receives transactions from remote instances of HarperDB which are then ingested in order. +- CORE-1551: Create transaction streams on the remote node if they do not exist when performing `add_node` or `update_node`. +- CORE-1594, CORE-1605, CORE-1749, CORE-1767, CORE-1770: Optimize the work queue stream and its consumer to be more performant and validate exact once delivery. +- CORE-1621, CORE-1692, CORE-1570, CORE-1693: NATS stream names are MD5 hashed to avoid characters that HarperDB allows, but NATS may not. +- CORE-1762: Add a new optional attribute to `add_node` and `update_node` named `opt_start_time`. This attribute sets a starting time to start synchronizing transactions. +- CORE-1785: Optimizations and bug fixes in regards to sourcing data from remote instances on HarperDB. +- CORE-1588: Created new operation `set_cluster_routes` to enable setting routes for instances of HarperDB to mesh together. +- CORE-1589: Created new operation `get_cluster_routes` to allow for retrieval of routes used to connect the instance of HarperDB to the mesh. +- CORE-1590: Created new operation `delete_cluster_routes` to allow for removal of routes used to connect the instance of HarperDB to the mesh. +- CORE-1667: Fix old environment variable `CLUSTERING_PORT` not mapping to new hub server port. +- CORE-1609: Allow `remove_node` to be called when the other node cannot be reached. +- CORE-1815: Add transaction lock to `add_node` and `update_node` to avoid concurrent nats source update bug. +- CORE-1848: Update stream configs if the node name has been changed in the YAML configuration. +- CORE-1873: Update `add_node` and `update_node` so that it auto-creates schema/table on both local and remote node respectively **Data Storage** We have made improvements to how we store, index, and retrieve data. -* CORE-1619: Enabled new concurrent flushing technology for improved write performance. -* CORE-1701: Optimize search performance for `search_by_conditions` when executing multiple AND conditions. -* CORE-1652: Encode the values of secondary indices more efficiently for faster access. -* CORE-1670: Store updated timestamp in `lmdb.js`' version property. -* CORE-1651: Enabled multiple value indexing of array values which allows for the ability to search on specific elements in an array more efficiently. -* CORE-1649, CORE-1659: Large text values (larger than 255 bytes) are no longer stored in separate blob index. Now they are segmented and delimited in the same index to increase search performance. -* Complex objects and object arrays are no longer stored in a separate index to preserve storage and increase write throughput. -* CORE-1650, CORE-1724, CORE-1738: Improved internals around interpreting attribute values. -* CORE-1657: Deferred property decoding allows large objects to be stored, but individual attributes can be accessed (like with get_attributes) without incurring the cost of decoding the entire object. -* CORE-1658: Enable in-memory caching of records for even faster access to frequently accessed data. -* CORE-1693: Wrap updates in async transactions to ensure ACID-compliant updates. -* CORE-1653: Upgrade to 4.0 rebuilds tables to reflect changes made to index improvements. -* CORE-1753: Removed old `node-lmdb` dependency. -* CORE-1787: Freeze objects returned from queries. -* CORE-1821: Read the `WRITE_ASYNC` setting which enables LMDB nosync. + +- CORE-1619: Enabled new concurrent flushing technology for improved write performance. +- CORE-1701: Optimize search performance for `search_by_conditions` when executing multiple AND conditions. +- CORE-1652: Encode the values of secondary indices more efficiently for faster access. +- CORE-1670: Store updated timestamp in `lmdb.js`' version property. +- CORE-1651: Enabled multiple value indexing of array values which allows for the ability to search on specific elements in an array more efficiently. +- CORE-1649, CORE-1659: Large text values (larger than 255 bytes) are no longer stored in separate blob index. Now they are segmented and delimited in the same index to increase search performance. +- Complex objects and object arrays are no longer stored in a separate index to preserve storage and increase write throughput. +- CORE-1650, CORE-1724, CORE-1738: Improved internals around interpreting attribute values. +- CORE-1657: Deferred property decoding allows large objects to be stored, but individual attributes can be accessed (like with get_attributes) without incurring the cost of decoding the entire object. +- CORE-1658: Enable in-memory caching of records for even faster access to frequently accessed data. +- CORE-1693: Wrap updates in async transactions to ensure ACID-compliant updates. +- CORE-1653: Upgrade to 4.0 rebuilds tables to reflect changes made to index improvements. +- CORE-1753: Removed old `node-lmdb` dependency. +- CORE-1787: Freeze objects returned from queries. +- CORE-1821: Read the `WRITE_ASYNC` setting which enables LMDB nosync. **Logging** HarperDB has increased logging specificity by breaking out logs based on components logging. There are specific log files each for HarperDB Core, Custom Functions, Hub Server, Leaf Server, and more. -* CORE-1497: Remove `pino` and `winston` dependencies. -* CORE-1426: All logging is output via `stdout` and `stderr`, our default logging is then picked up by PM2 which handles writing out to file. -* CORE-1431: Improved `read_log` operation validation. -* CORE-1433, CORE-1463: Added log rotation. -* CORE-1553, CORE-1555, CORE-1552, CORE-1554, CORE-1704: Performance gain by only serializing objects and arrays if the log is for the level defined in configuration. -* CORE-1436: Upgrade to 4.0 updates internals for logging changes. -* CORE-1428, CORE-1440, CORE-1442, CORE-1434, CORE-1435, CORE-1439, CORE-1482, CORE-1751, CORE-1752: Bug fixes, performance improvements and improved unit tests. -* CORE-1691: Convert non-PM2 managed log file writes to use Node.js `fs.appendFileSync` function. + +- CORE-1497: Remove `pino` and `winston` dependencies. +- CORE-1426: All logging is output via `stdout` and `stderr`, our default logging is then picked up by PM2 which handles writing out to file. +- CORE-1431: Improved `read_log` operation validation. +- CORE-1433, CORE-1463: Added log rotation. +- CORE-1553, CORE-1555, CORE-1552, CORE-1554, CORE-1704: Performance gain by only serializing objects and arrays if the log is for the level defined in configuration. +- CORE-1436: Upgrade to 4.0 updates internals for logging changes. +- CORE-1428, CORE-1440, CORE-1442, CORE-1434, CORE-1435, CORE-1439, CORE-1482, CORE-1751, CORE-1752: Bug fixes, performance improvements and improved unit tests. +- CORE-1691: Convert non-PM2 managed log file writes to use Node.js `fs.appendFileSync` function. **Configuration** HarperDB has updated its configuration from a properties file to YAML. -* CORE-1448, CORE-1449, CORE-1519, CORE-1587: Upgrade automatically converts the pre-existing settings file to YAML. -* CORE-1445, CORE-1534, CORE-1444, CORE-1858: Build out new logic to create, update, and interpret the YAML configuration file. -* Installer has updated prompts to reflect YAML settings. -* CORE-1447: Create an alias for the `configure_cluster` operation as `set_configuration`. -* CORE-1461, CORE-1462, CORE-1483: Unit test improvements. -* CORE-1492: Improvements to get_configuration and set_configuration operations. -* CORE-1503: Modify HarperDB configuration for more granular certificate definition. -* CORE-1591: Update `routes` IP param to `host` and to `leaf` config in `harperdb.conf` -* CORE-1519: Fix issue when switching between old and new versions of HarperDB we are getting the config parameter is undefined error on npm install. + +- CORE-1448, CORE-1449, CORE-1519, CORE-1587: Upgrade automatically converts the pre-existing settings file to YAML. +- CORE-1445, CORE-1534, CORE-1444, CORE-1858: Build out new logic to create, update, and interpret the YAML configuration file. +- Installer has updated prompts to reflect YAML settings. +- CORE-1447: Create an alias for the `configure_cluster` operation as `set_configuration`. +- CORE-1461, CORE-1462, CORE-1483: Unit test improvements. +- CORE-1492: Improvements to get_configuration and set_configuration operations. +- CORE-1503: Modify HarperDB configuration for more granular certificate definition. +- CORE-1591: Update `routes` IP param to `host` and to `leaf` config in `harperdb.conf` +- CORE-1519: Fix issue when switching between old and new versions of HarperDB we are getting the config parameter is undefined error on npm install. **Broad NodeJS and Platform Support** -* CORE-1624: HarperDB can now run on multiple versions of NodeJS, from v14 to v19. We primarily test on v18, so that is the preferred version. + +- CORE-1624: HarperDB can now run on multiple versions of NodeJS, from v14 to v19. We primarily test on v18, so that is the preferred version. **Windows 10 and 11** -* CORE-1088: HarperDB now runs natively on Windows 10 and 11 without the need to run in a container or installed in WSL. Windows is only intended for evaluation and development purposes, not for production work loads. + +- CORE-1088: HarperDB now runs natively on Windows 10 and 11 without the need to run in a container or installed in WSL. Windows is only intended for evaluation and development purposes, not for production work loads. **Extra Changes and Bug Fixes** -* CORE-1520: Refactor installer to remove all waterfall code and update to use Promises. -* CORE-1573: Stop the PM2 daemon and any logging processes when stopping hdb. -* CORE-1586: When HarperDB is running in foreground stop any additional logging processes from being spawned. -* CORE-1626: Update docker file to accommodate new `harperdb.conf` file. -* CORE-1592, CORE-1526, CORE-1660, CORE-1646, CORE-1640, CORE-1689, CORE-1711, CORE-1601, CORE-1726, CORE-1728, CORE-1736, CORE-1735, CORE-1745, CORE-1729, CORE-1748, CORE-1644, CORE-1750, CORE-1757, CORE-1727, CORE-1740, CORE-1730, CORE-1777, CORE-1778, CORE-1782, CORE-1775, CORE-1771, CORE-1774, CORE-1759, CORE-1772, CORE-1861, CORE-1862, CORE-1863, CORE-1870, CORE-1869:Changes for CI/CD pipeline and integration tests. -* CORE-1661: Fixed issue where old boot properties file caused an error when attempting to install 4.0.0. -* CORE-1697, CORE-1814, CORE-1855: Upgrade fastify dependency to new major version 4. -* CORE-1629: Jobs are now running as processes managed by the PM2 daemon. -* CORE-1733: Update LICENSE to reflect our EULA on our site. -* CORE-1606: Enable Custom Functions by default. -* CORE-1714: Include pre-built binaries for most common platforms (darwin-arm64, darwin-x64, linux-arm64, linux-x64, win32-x64). -* CORE-1628: Fix issue where setting license through environment variable not working. -* CORE-1602, CORE-1760, CORE-1838, CORE-1839, CORE-1847, CORE-1773: HarperDB Docker container improvements. -* CORE-1706: Add support for encoding HTTP responses with MessagePack. -* CORE-1709: Improve the way lmdb.js dependencies are installed. -* CORE-1758: Remove/update unnecessary HTTP headers. -* CORE-1756: On `npm install` and `harperdb install` change the node version check from an error to a warning if the installed Node.js version does not match our preferred version. -* CORE-1791: Optimizations to authenticated user caching. -* CORE-1794: Update README to discuss Windows support & Node.js versions -* CORE-1837: Fix issue where Custom Function directory was not being created on install. -* CORE-1742: Add more validation to audit log - check schema/table exists and log is enabled. -* CORE-1768: Fix issue where when running in foreground HarperDB process is not stopping on `harperdb stop`. -* CORE-1864: Fix to semver checks on upgrade. -* CORE-1850: Fix issue where a `cluster_user` type role could not be altered. + +- CORE-1520: Refactor installer to remove all waterfall code and update to use Promises. +- CORE-1573: Stop the PM2 daemon and any logging processes when stopping hdb. +- CORE-1586: When HarperDB is running in foreground stop any additional logging processes from being spawned. +- CORE-1626: Update docker file to accommodate new `harperdb.conf` file. +- CORE-1592, CORE-1526, CORE-1660, CORE-1646, CORE-1640, CORE-1689, CORE-1711, CORE-1601, CORE-1726, CORE-1728, CORE-1736, CORE-1735, CORE-1745, CORE-1729, CORE-1748, CORE-1644, CORE-1750, CORE-1757, CORE-1727, CORE-1740, CORE-1730, CORE-1777, CORE-1778, CORE-1782, CORE-1775, CORE-1771, CORE-1774, CORE-1759, CORE-1772, CORE-1861, CORE-1862, CORE-1863, CORE-1870, CORE-1869:Changes for CI/CD pipeline and integration tests. +- CORE-1661: Fixed issue where old boot properties file caused an error when attempting to install 4.0.0. +- CORE-1697, CORE-1814, CORE-1855: Upgrade fastify dependency to new major version 4. +- CORE-1629: Jobs are now running as processes managed by the PM2 daemon. +- CORE-1733: Update LICENSE to reflect our EULA on our site. +- CORE-1606: Enable Custom Functions by default. +- CORE-1714: Include pre-built binaries for most common platforms (darwin-arm64, darwin-x64, linux-arm64, linux-x64, win32-x64). +- CORE-1628: Fix issue where setting license through environment variable not working. +- CORE-1602, CORE-1760, CORE-1838, CORE-1839, CORE-1847, CORE-1773: HarperDB Docker container improvements. +- CORE-1706: Add support for encoding HTTP responses with MessagePack. +- CORE-1709: Improve the way lmdb.js dependencies are installed. +- CORE-1758: Remove/update unnecessary HTTP headers. +- CORE-1756: On `npm install` and `harperdb install` change the node version check from an error to a warning if the installed Node.js version does not match our preferred version. +- CORE-1791: Optimizations to authenticated user caching. +- CORE-1794: Update README to discuss Windows support & Node.js versions +- CORE-1837: Fix issue where Custom Function directory was not being created on install. +- CORE-1742: Add more validation to audit log - check schema/table exists and log is enabled. +- CORE-1768: Fix issue where when running in foreground HarperDB process is not stopping on `harperdb stop`. +- CORE-1864: Fix to semver checks on upgrade. +- CORE-1850: Fix issue where a `cluster_user` type role could not be altered. diff --git a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.1.md b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.1.md index 9e148e63..2a85f511 100644 --- a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.1.md +++ b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.1.md @@ -4,9 +4,10 @@ sidebar_position: 59998 --- ### HarperDB 4.0.1, Tucker Release + 01/20/2023 **Bug Fixes** -* CORE-1992 Local studio was not loading because the path got mangled in the build. -* CORE-2001 Fixed deploy_custom_function_project after node update broke it. +- CORE-1992 Local studio was not loading because the path got mangled in the build. +- CORE-2001 Fixed deploy_custom_function_project after node update broke it. diff --git a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.2.md b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.2.md index b65d1427..bedbd970 100644 --- a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.2.md +++ b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.2.md @@ -4,9 +4,10 @@ sidebar_position: 59997 --- ### HarperDB 4.0.2, Tucker Release + 01/24/2023 **Bug Fixes** -* CORE-2003 Fix bug where if machine had one core thread config would default to zero. -* Update to lmdb 2.7.3 and msgpackr 1.7.0 +- CORE-2003 Fix bug where if machine had one core thread config would default to zero. +- Update to lmdb 2.7.3 and msgpackr 1.7.0 diff --git a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.3.md b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.3.md index 67aaae56..ad1cbf8a 100644 --- a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.3.md +++ b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.3.md @@ -4,8 +4,9 @@ sidebar_position: 59996 --- ### HarperDB 4.0.3, Tucker Release + 01/26/2023 **Bug Fixes** -* CORE-2007 Add update nodes 4.0.0 launch script to build script to fix clustering upgrade. +- CORE-2007 Add update nodes 4.0.0 launch script to build script to fix clustering upgrade. diff --git a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.4.md b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.4.md index 2a30c9d1..3f052465 100644 --- a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.4.md +++ b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.4.md @@ -4,8 +4,9 @@ sidebar_position: 59995 --- ### HarperDB 4.0.4, Tucker Release + 01/27/2023 **Bug Fixes** -* CORE-2009 Fixed bug where add node was not being called when upgrading clustering. \ No newline at end of file +- CORE-2009 Fixed bug where add node was not being called when upgrading clustering. diff --git a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.5.md b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.5.md index dc66721f..1696d6d4 100644 --- a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.5.md +++ b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.5.md @@ -4,11 +4,11 @@ sidebar_position: 59994 --- ### HarperDB 4.0.5, Tucker Release + 02/15/2023 **Bug Fixes** -* CORE-2029 Improved the upgrade process for handling existing user TLS certificates and correctly configuring TLS settings. Added a prompt to upgrade to determine if new certificates should be created or existing certificates should be kept/used. -* Fix the way NATS connections are honored in a local environment. -* Do not define the certificate authority path to NATS if it is not defined in the HarperDB config. - +- CORE-2029 Improved the upgrade process for handling existing user TLS certificates and correctly configuring TLS settings. Added a prompt to upgrade to determine if new certificates should be created or existing certificates should be kept/used. +- Fix the way NATS connections are honored in a local environment. +- Do not define the certificate authority path to NATS if it is not defined in the HarperDB config. diff --git a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.6.md b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.6.md index bf97d148..1cdc1bd7 100644 --- a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.6.md +++ b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.6.md @@ -4,8 +4,9 @@ sidebar_position: 59993 --- ### HarperDB 4.0.6, Tucker Release + 03/09/2023 **Bug Fixes** -* Fixed a data serialization error that occurs when a large number of different record structures are persisted in a single table. +- Fixed a data serialization error that occurs when a large number of different record structures are persisted in a single table. diff --git a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.7.md b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.7.md index 7d48666a..c4d1fbbf 100644 --- a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.7.md +++ b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.0.7.md @@ -4,8 +4,9 @@ sidebar_position: 59992 --- ### HarperDB 4.0.7, Tucker Release + 03/10/2023 **Bug Fixes** -* Update lmdb.js dependency \ No newline at end of file +- Update lmdb.js dependency diff --git a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.1.0.md b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.1.0.md index 55472591..c1b5f8ef 100644 --- a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.1.0.md +++ b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.1.0.md @@ -5,7 +5,7 @@ sidebar_position: 59899 ### HarperDB 4.1.0, Tucker Release -HarperDB 4.1 introduces the ability to use worker threads for concurrently handling HTTP requests. Previously this was handled by processes. This shift provides important benefits in terms of better control of traffic delegation with support for optimized load tracking and session affinity, better debuggability, and reduced memory footprint. +HarperDB 4.1 introduces the ability to use worker threads for concurrently handling HTTP requests. Previously this was handled by processes. This shift provides important benefits in terms of better control of traffic delegation with support for optimized load tracking and session affinity, better debuggability, and reduced memory footprint. This means debugging will be much easier for custom functions. If you install/run HarperDB locally, most modern IDEs like WebStorm and VSCode support worker thread debugging, so you can start HarperDB in your IDE, and set breakpoints in your custom functions and debug them. @@ -23,39 +23,41 @@ Custom Functions will no longer automatically load static file routes, instead t Updates to S3 import and export mean that these operations now require the bucket `region` in the request. Also, if referencing a nested object it should be done in the `key` parameter. See examples [here](https://api.harperdb.io/#aa74bbdf-668c-4536-80f1-b91bb13e5024). -Due to the AWS SDK v2 reaching end of life support we have updated to v3. This has caused some breaking changes in our operations `import_from_s3` and `export_to_s3`: -* A new attribute `region` will need to be supplied -* The `bucket` attribute can no longer have trailing slashes. Slashes will now need to be in the `key`. - -Starting HarperDB without any command (just `harperdb`) now runs HarperDB like a standard process, in the foreground. This means you can use standard unix tooling for interacting with the process and is conducive for running HarperDB with systemd or any other process management tool. If you wish to have HarperDB launch itself in separate background process (and immediately terminate the shell process), you can do so by running `harperdb start`. - -Internal Tickets completed: -* CORE-609 - Ensure that attribute names are always added to global schema as Strings -* CORE-1549 - Remove fastify-static code from Custom Functions server which auto serves content from "static" folder -* CORE-1655 - Iterator based queries -* CORE-1764 - Fix issue where describe_all operation returns an empty object for non super-users if schema(s) do not yet have table(s) -* CORE-1854 - Switch to using worker threads instead of processes for handling concurrency -* CORE-1877 - Extend the csv_url_load operation to allow for additional headers to be passed to the remote server when the csv is being downloaded -* CORE-1893 - Add last updated timestamp to describe operations -* CORE-1896 - Fix issue where Select * from system.hdb_info returns wrong HDB version number after Instance Upgrade -* CORE-1904 - Fix issue when executing GEOJSON query in SQL -* CORE-1905 - Add HarperDB YAML configuration setting which defines the storage location of NATS streams -* CORE-1906 - Add HarperDB YAML configuration setting defining the storage location of tables. -* CORE-1655 - Streaming binary format serialization -* CORE-1943 - Add configuration option to set mount point for audit tables -* CORE-1921 - Update NATS transaction lifecycle to handle message deduplication in work queue streams. -* CORE-1963 - Update logging for better readability, reduced duplication, and request context information. -* CORE-1968 - In server\nats\natsIngestService.js remove the js_msg.working(); line to improve performance. -* CORE-1976 - Fix error when calling describe_table operation with no schema or table defined in payload. -* CORE-1983 - Fix issue where create_attribute operation does not validate request for required attributes -* CORE-2015 - Remove PM2 logs that get logged in console when starting HDB -* CORE-2048 - systemd script for 4.1 -* CORE-2052 - Include thread information in system_information for visibility of threads -* CORE-2061 - Add a better error msg when clustering is enabled without a cluster user set -* CORE-2068 - Create new log rotate logic since pm2 log-rotate no longer used -* CORE-2072 - Update to Node 18.15.0 -* CORE-2090 - Upgrade Testing from v4.0.x and v3.x to v4.1. -* CORE-2091 - Run the performance tests -* CORE-2092 - Allow for automatic patch version updates of certain packages -* CORE-2109 - Add verify option to clustering TLS configuration -* CORE-2111 - Update AWS SDK to v3 +Due to the AWS SDK v2 reaching end of life support we have updated to v3. This has caused some breaking changes in our operations `import_from_s3` and `export_to_s3`: + +- A new attribute `region` will need to be supplied +- The `bucket` attribute can no longer have trailing slashes. Slashes will now need to be in the `key`. + +Starting HarperDB without any command (just `harperdb`) now runs HarperDB like a standard process, in the foreground. This means you can use standard unix tooling for interacting with the process and is conducive for running HarperDB with systemd or any other process management tool. If you wish to have HarperDB launch itself in separate background process (and immediately terminate the shell process), you can do so by running `harperdb start`. + +Internal Tickets completed: + +- CORE-609 - Ensure that attribute names are always added to global schema as Strings +- CORE-1549 - Remove fastify-static code from Custom Functions server which auto serves content from "static" folder +- CORE-1655 - Iterator based queries +- CORE-1764 - Fix issue where describe_all operation returns an empty object for non super-users if schema(s) do not yet have table(s) +- CORE-1854 - Switch to using worker threads instead of processes for handling concurrency +- CORE-1877 - Extend the csv_url_load operation to allow for additional headers to be passed to the remote server when the csv is being downloaded +- CORE-1893 - Add last updated timestamp to describe operations +- CORE-1896 - Fix issue where Select \* from system.hdb_info returns wrong HDB version number after Instance Upgrade +- CORE-1904 - Fix issue when executing GEOJSON query in SQL +- CORE-1905 - Add HarperDB YAML configuration setting which defines the storage location of NATS streams +- CORE-1906 - Add HarperDB YAML configuration setting defining the storage location of tables. +- CORE-1655 - Streaming binary format serialization +- CORE-1943 - Add configuration option to set mount point for audit tables +- CORE-1921 - Update NATS transaction lifecycle to handle message deduplication in work queue streams. +- CORE-1963 - Update logging for better readability, reduced duplication, and request context information. +- CORE-1968 - In server\nats\natsIngestService.js remove the js_msg.working(); line to improve performance. +- CORE-1976 - Fix error when calling describe_table operation with no schema or table defined in payload. +- CORE-1983 - Fix issue where create_attribute operation does not validate request for required attributes +- CORE-2015 - Remove PM2 logs that get logged in console when starting HDB +- CORE-2048 - systemd script for 4.1 +- CORE-2052 - Include thread information in system_information for visibility of threads +- CORE-2061 - Add a better error msg when clustering is enabled without a cluster user set +- CORE-2068 - Create new log rotate logic since pm2 log-rotate no longer used +- CORE-2072 - Update to Node 18.15.0 +- CORE-2090 - Upgrade Testing from v4.0.x and v3.x to v4.1. +- CORE-2091 - Run the performance tests +- CORE-2092 - Allow for automatic patch version updates of certain packages +- CORE-2109 - Add verify option to clustering TLS configuration +- CORE-2111 - Update AWS SDK to v3 diff --git a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.1.1.md b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.1.1.md index 0dce0bd7..47230621 100644 --- a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.1.1.md +++ b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.1.1.md @@ -4,13 +4,14 @@ sidebar_position: 59898 --- ### HarperDB 4.1.1, Tucker Release + 06/16/2023 -* HarperDB uses improved logic for determining default heap limits and thread counts. When running in a restricted container and on NodeJS 18.15+, HarperDB will use the constrained memory limit to determine heap limits for each thread. In more memory constrained servers with many CPU cores, a reduced default thread count will be used to ensure that excessive memory is not used by many workers. You may still define your own thread count (with `http`/`threads`) in the [configuration](../../configuration). -* An option has been added for [disabling the republishing NATS messages](../../configuration), which can provide improved replication performance in a fully connected network. -* Improvements to our OpenShift container. -* Dependency security updates. +- HarperDB uses improved logic for determining default heap limits and thread counts. When running in a restricted container and on NodeJS 18.15+, HarperDB will use the constrained memory limit to determine heap limits for each thread. In more memory constrained servers with many CPU cores, a reduced default thread count will be used to ensure that excessive memory is not used by many workers. You may still define your own thread count (with `http`/`threads`) in the [configuration](../../configuration). +- An option has been added for [disabling the republishing NATS messages](../../configuration), which can provide improved replication performance in a fully connected network. +- Improvements to our OpenShift container. +- Dependency security updates. -* **Bug Fixes** +- **Bug Fixes** -* Fixed a bug in reporting database metrics in the `system_information` operation. \ No newline at end of file +- Fixed a bug in reporting database metrics in the `system_information` operation. diff --git a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.1.2.md b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.1.2.md index 2a62db64..fc5e16f4 100644 --- a/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.1.2.md +++ b/site/versioned_docs/version-4.1/release-notes/v4-tucker/4.1.2.md @@ -4,10 +4,10 @@ sidebar_position: 59897 --- ### HarperDB 4.1.2, Tucker Release -06/16/2023 -* HarperDB has updated binary dependencies to support older glibc versions back 2.17. -* A new CLI command was added to get the current status of whether HarperDB is running and the cluster status. This is available with `harperdb status`. -* Improvements to our OpenShift container. -* Dependency security updates. +06/16/2023 +- HarperDB has updated binary dependencies to support older glibc versions back 2.17. +- A new CLI command was added to get the current status of whether HarperDB is running and the cluster status. This is available with `harperdb status`. +- Improvements to our OpenShift container. +- Dependency security updates. diff --git a/site/versioned_docs/version-4.1/security/basic-auth.md b/site/versioned_docs/version-4.1/security/basic-auth.md index 3f393e90..1ef1689b 100644 --- a/site/versioned_docs/version-4.1/security/basic-auth.md +++ b/site/versioned_docs/version-4.1/security/basic-auth.md @@ -4,67 +4,54 @@ title: Authentication # Authentication -HarperDB uses Basic Auth and JSON Web Tokens (JWTs) to secure our HTTP requests. In the context of an HTTP transaction, **basic access authentication** is a method for an HTTP user agent to provide a user name and password when making a request. - - - -** ***You do not need to log in separately. Basic Auth is added to each HTTP request like create_schema, create_table, insert etc… via headers.*** ** - - - -A header is added to each HTTP request. The header key is **“Authorization”** the header value is **“Basic <<your username and password buffer token>>”** - - +HarperDB uses Basic Auth and JSON Web Tokens (JWTs) to secure our HTTP requests. In the context of an HTTP transaction, **basic access authentication** is a method for an HTTP user agent to provide a user name and password when making a request. +** \***You do not need to log in separately. Basic Auth is added to each HTTP request like create_schema, create_table, insert etc… via headers.**\* ** +A header is added to each HTTP request. The header key is **“Authorization”** the header value is **“Basic <<your username and password buffer token>>”** ## Authentication in HarperDB Studio In the below code sample, you can see where we add the authorization header to the request. This needs to be added for each and every HTTP request for HarperDB. -*Note: This function uses btoa. Learn about [btoa here](https://developer.mozilla.org/en-US/docs/Web/API/btoa).* +_Note: This function uses btoa. Learn about [btoa here](https://developer.mozilla.org/en-US/docs/Web/API/btoa)._ ```javascript -function callHarperDB(call_object, operation, callback){ - - const options = { - "method": "POST", - "hostname": call_object.endpoint_url, - "port": call_object.endpoint_port, - "path": "/", - "headers": { - "content-type": "application/json", - "authorization": "Basic " + btoa(call_object.username + ':' + call_object.password), - "cache-control": "no-cache" - - } - }; - - const http_req = http.request(options, function (hdb_res) { - let chunks = []; - - hdb_res.on("data", function (chunk) { - chunks.push(chunk); - }); - - hdb_res.on("end", function () { - const body = Buffer.concat(chunks); - if (isJson(body)) { - return callback(null, JSON.parse(body)); - } else { - return callback(body, null); - - } - - }); - }); - - http_req.on("error", function (chunk) { - return callback("Failed to connect", null); - }); - - http_req.write(JSON.stringify(operation)); - http_req.end(); - +function callHarperDB(call_object, operation, callback) { + const options = { + method: 'POST', + hostname: call_object.endpoint_url, + port: call_object.endpoint_port, + path: '/', + headers: { + 'content-type': 'application/json', + 'authorization': 'Basic ' + btoa(call_object.username + ':' + call_object.password), + 'cache-control': 'no-cache', + }, + }; + + const http_req = http.request(options, function (hdb_res) { + let chunks = []; + + hdb_res.on('data', function (chunk) { + chunks.push(chunk); + }); + + hdb_res.on('end', function () { + const body = Buffer.concat(chunks); + if (isJson(body)) { + return callback(null, JSON.parse(body)); + } else { + return callback(body, null); + } + }); + }); + + http_req.on('error', function (chunk) { + return callback('Failed to connect', null); + }); + + http_req.write(JSON.stringify(operation)); + http_req.end(); } -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.1/security/certificate-management.md b/site/versioned_docs/version-4.1/security/certificate-management.md index 8b2fe046..90e5ebf2 100644 --- a/site/versioned_docs/version-4.1/security/certificate-management.md +++ b/site/versioned_docs/version-4.1/security/certificate-management.md @@ -25,6 +25,7 @@ We have a few recommended options for enabling HTTPS in a production setting. To enable HTTPS, set the `operationsApi.network.https` and `customFunctions.network.https` to `true` and restart HarperDB. To replace the certificates, either replace the contents of the existing certificate files at `/keys/`, or update the HarperDB configuration with the path of your new certificate files, and then restart HarperDB. + ```yaml operationsApi: tls: @@ -32,6 +33,7 @@ operationsApi: certificateAuthority: ~/hdb/keys/ca.pem privateKey: ~/hdb/keys/privateKey.pem ``` + ```yaml customFunctions: tls: @@ -42,7 +44,7 @@ customFunctions: ### Option: Nginx Reverse Proxy -Instead of enabling HTTPS for HarperDB, Nginx can be used as a reverse proxy for HarperDB. +Instead of enabling HTTPS for HarperDB, Nginx can be used as a reverse proxy for HarperDB. Install Nginx, configure Nginx to use certificates issued from your own CA or a public CA, then configure Nginx to listen for HTTPS requests and forward to HarperDB as HTTP requests. @@ -56,4 +58,4 @@ Examples of these types of services include an AWS Application Load Balancer or ### Additional Considerations -It is possible to use different certificates for the Operations API and the Custom Functions API. In scenarios where only your Custom Functions endpoints need to be exposed to the Internet and the Operations API is reserved for HarperDB administration, you may want to use a private CA to issue certificates for the Operations API and a public CA for the Custom Functions API certificates. \ No newline at end of file +It is possible to use different certificates for the Operations API and the Custom Functions API. In scenarios where only your Custom Functions endpoints need to be exposed to the Internet and the Operations API is reserved for HarperDB administration, you may want to use a private CA to issue certificates for the Operations API and a public CA for the Custom Functions API certificates. diff --git a/site/versioned_docs/version-4.1/security/configuration.md b/site/versioned_docs/version-4.1/security/configuration.md index 550ad6aa..12ae0c1d 100644 --- a/site/versioned_docs/version-4.1/security/configuration.md +++ b/site/versioned_docs/version-4.1/security/configuration.md @@ -6,56 +6,37 @@ title: Configuration HarperDB was set up to require very minimal configuration to work out of the box. There are, however, some best practices we encourage for anyone building an app with HarperDB. - - ## CORS HarperDB allows for managing [cross-origin HTTP requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS). By default, HarperDB enables CORS for all domains if you need to disable CORS completely or set up an access list of domains you can do the following: -1) Open the harperdb-config.yaml file this can be found in <ROOTPATH>, the location you specified during install. - -2) In harperdb-config.yaml there should be 2 entries under `operationsApi.network`: cors and corsAccessList. - * `cors` - - 1) To turn off, change to: `cors: false` - - 2) To turn on, change to: `cors: true` - - * `corsAccessList` - - 1) The `corsAccessList` will only be recognized by the system when `cors` is `true` - - 2) To create an access list you set `corsAccessList` to a comma-separated list of domains. - - i.e. `corsAccessList` is `https://harperdb.io,https://products.harperdb.io` - - 3) To clear out the access list and allow all domains: `corsAccessList` is `[null]` - - -## SSL +1. Open the harperdb-config.yaml file this can be found in <ROOTPATH>, the location you specified during install. -HarperDB provides the option to use an HTTP or HTTPS and HTTP/2 interface. The default port for the server is 9925. +2. In harperdb-config.yaml there should be 2 entries under `operationsApi.network`: cors and corsAccessList. + - `cors` + 1. To turn off, change to: `cors: false` + 2. To turn on, change to: `cors: true` + - `corsAccessList` + 1. The `corsAccessList` will only be recognized by the system when `cors` is `true` + 2. To create an access list you set `corsAccessList` to a comma-separated list of domains. + i.e. `corsAccessList` is `https://harperdb.io,https://products.harperdb.io` -These default ports can be changed by updating the `operationsApi.network.port` value in `/harperdb-config.yaml` - + 3. To clear out the access list and allow all domains: `corsAccessList` is `[null]` +## SSL -By default, HTTPS is turned off and HTTP is turned on. It is recommended that you never directly expose HarperDB's HTTP interface through a publicly available port. HTTP is intended for local or private network use. +HarperDB provides the option to use an HTTP or HTTPS and HTTP/2 interface. The default port for the server is 9925. +These default ports can be changed by updating the `operationsApi.network.port` value in `/harperdb-config.yaml` +By default, HTTPS is turned off and HTTP is turned on. It is recommended that you never directly expose HarperDB's HTTP interface through a publicly available port. HTTP is intended for local or private network use. You can toggle HTTPS and HTTP in the settings file. By setting `operationsApi.network.https` to true/false. When `https` is set to `false`, the server will use HTTP (version 1.1). Enabling HTTPS will enable both HTTPS/1.1 and HTTPS/2. - - HarperDB automatically generates a certificate (certificate.pem), a certificate authority (ca.pem) and a private key file (privateKey.pem) which live at `/keys/`. - - You can replace these with your own certificates and key. - - -**Changes to these settings require a restart. Use operation `harperdb restart` from HarperDB Operations API.** \ No newline at end of file +**Changes to these settings require a restart. Use operation `harperdb restart` from HarperDB Operations API.** diff --git a/site/versioned_docs/version-4.1/security/index.md b/site/versioned_docs/version-4.1/security/index.md index 51f8ce0b..c3bad492 100644 --- a/site/versioned_docs/version-4.1/security/index.md +++ b/site/versioned_docs/version-4.1/security/index.md @@ -6,8 +6,7 @@ title: Security HarperDB uses role-based, attribute-level security to ensure that users can only gain access to the data they’re supposed to be able to access. Our granular permissions allow for unparalleled flexibility and control, and can actually lower the total cost of ownership compared to other database solutions, since you no longer have to replicate subsets of your data to isolate use cases. -* [JWT Authentication](./jwt-auth) -* [Basic Authentication](./basic-auth) -* [Configuration](./configuration) -* [Users and Roles](./users-and-roles) - +- [JWT Authentication](./jwt-auth) +- [Basic Authentication](./basic-auth) +- [Configuration](./configuration) +- [Users and Roles](./users-and-roles) diff --git a/site/versioned_docs/version-4.1/security/jwt-auth.md b/site/versioned_docs/version-4.1/security/jwt-auth.md index f5678915..a7823bd7 100644 --- a/site/versioned_docs/version-4.1/security/jwt-auth.md +++ b/site/versioned_docs/version-4.1/security/jwt-auth.md @@ -3,13 +3,14 @@ title: JWT Authentication --- # JWT Authentication + HarperDB uses token based authentication with JSON Web Tokens, JWTs. This consists of two primary operations `create_authentication_tokens` and `refresh_operation_token`. These generate two types of tokens, as follows: -* The `operation_token` which is used to authenticate all HarperDB operations in the Bearer Token Authorization Header. The default expiry is one day. +- The `operation_token` which is used to authenticate all HarperDB operations in the Bearer Token Authorization Header. The default expiry is one day. -* The `refresh_token` which is used to generate a new `operation_token` upon expiry. This token is used in the Bearer Token Authorization Header for the `refresh_operation_token` operation only. The default expiry is thirty days. +- The `refresh_token` which is used to generate a new `operation_token` upon expiry. This token is used in the Bearer Token Authorization Header for the `refresh_operation_token` operation only. The default expiry is thirty days. The `create_authentication_tokens` operation can be used at any time to refresh both tokens in the event that both have expired or been lost. @@ -19,9 +20,9 @@ Users must initially create tokens using their HarperDB credentials. The followi ```json { - "operation": "create_authentication_tokens", - "username": "username", - "password": "password" + "operation": "create_authentication_tokens", + "username": "username", + "password": "password" } ``` @@ -41,14 +42,14 @@ An example expected return object is: ```json { - "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDUwNjQ2MDAsInN1YiI6Im9wZXJhdGlvbiJ9.MpQA-9CMjA-mn-7mHyUXSuSC_-kqMqJXp_NDiKLFtbtMRbodCuY3DzH401rvy_4vb0yCELf0B5EapLVY1545sv80nxSl6FoZFxQaDWYXycoia6zHpiveR8hKlmA6_XTWHJbY2FM1HAFrdtt3yUTiF-ylkdNbPG7u7fRjTmHfsZ78gd2MNWIDkHoqWuFxIyqk8XydQpsjULf2Uacirt9FmHfkMZ-Jr_rRpcIEW0FZyLInbm6uxLfseFt87wA0TbZ0ofImjAuaW_3mYs-3H48CxP152UJ0jByPb0kHsk1QKP7YHWx1-Wce9NgNADfG5rfgMHANL85zvkv8sJmIGZIoSpMuU3CIqD2rgYnMY-L5dQN1fgfROrPMuAtlYCRK7r-IpjvMDQtRmCiNG45nGsM4DTzsa5GyDrkGssd5OBhl9gr9z9Bb5HQVYhSKIOiy72dK5dQNBklD4eGLMmo-u322zBITmE0lKaBcwYGJw2mmkYcrjDOmsDseU6Bf_zVUd9WF3FqwNkhg4D7nrfNSC_flalkxPHckU5EC_79cqoUIX2ogufBW5XgYbU4WfLloKcIpb51YTZlZfwBHlHPSyaq_guaXFaeCUXKq39_i1n0HRF_mRaxNru0cNDFT9Fm3eD7V8axFijSVAMDyQs_JR7SY483YDKUfN4l-vw-EVynImr4", - "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDc1NzAyMDAsInN1YiI6InJlZnJlc2gifQ.acaCsk-CJWIMLGDZdGnsthyZsJfQ8ihXLyE8mTji8PgGkpbwhs7e1O0uitMgP_pGjHq2tey1BHSwoeCL49b18WyMIB10hK-q2BXGKQkykltjTrQbg7VsdFi0h57mGfO0IqAwYd55_hzHZNnyJMh4b0iPQFDwU7iTD7x9doHhZAvzElpkWbc_NKVw5_Mw3znjntSzbuPN105zlp4Niurin-_5BnukwvoJWLEJ-ZlF6hE4wKhaMB1pWTJjMvJQJE8khTTvlUN8tGxmzoaDYoe1aCGNxmDEQnx8Y5gKzVd89sylhqi54d2nQrJ2-ElfEDsMoXpR01Ps6fNDFtLTuPTp7ixj8LvgL2nCjAg996Ga3PtdvXJAZPDYCqqvaBkZZcsiqOgqLV0vGo3VVlfrcgJXQImMYRr_Inu0FCe47A93IAWuQTs-KplM1KdGJsHSnNBV6oe6QEkROJT5qZME-8xhvBYvOXqp9Znwg39bmiBCMxk26Ce66_vw06MNgoa3D5AlXPWemfdVKPZDnj_aLVjZSs0gAfFElcVn7l9yjWJOaT2Muk26U8bJl-2BEq_DSclqKHODuYM5kkPKIdE4NFrsqsDYuGxcA25rlNETFyl0q-UXj1aoz_joy5Hdnr4mFELmjnoo4jYQuakufP9xeGPsj1skaodKl0mmoGcCD6v1F60" + "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDUwNjQ2MDAsInN1YiI6Im9wZXJhdGlvbiJ9.MpQA-9CMjA-mn-7mHyUXSuSC_-kqMqJXp_NDiKLFtbtMRbodCuY3DzH401rvy_4vb0yCELf0B5EapLVY1545sv80nxSl6FoZFxQaDWYXycoia6zHpiveR8hKlmA6_XTWHJbY2FM1HAFrdtt3yUTiF-ylkdNbPG7u7fRjTmHfsZ78gd2MNWIDkHoqWuFxIyqk8XydQpsjULf2Uacirt9FmHfkMZ-Jr_rRpcIEW0FZyLInbm6uxLfseFt87wA0TbZ0ofImjAuaW_3mYs-3H48CxP152UJ0jByPb0kHsk1QKP7YHWx1-Wce9NgNADfG5rfgMHANL85zvkv8sJmIGZIoSpMuU3CIqD2rgYnMY-L5dQN1fgfROrPMuAtlYCRK7r-IpjvMDQtRmCiNG45nGsM4DTzsa5GyDrkGssd5OBhl9gr9z9Bb5HQVYhSKIOiy72dK5dQNBklD4eGLMmo-u322zBITmE0lKaBcwYGJw2mmkYcrjDOmsDseU6Bf_zVUd9WF3FqwNkhg4D7nrfNSC_flalkxPHckU5EC_79cqoUIX2ogufBW5XgYbU4WfLloKcIpb51YTZlZfwBHlHPSyaq_guaXFaeCUXKq39_i1n0HRF_mRaxNru0cNDFT9Fm3eD7V8axFijSVAMDyQs_JR7SY483YDKUfN4l-vw-EVynImr4", + "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDc1NzAyMDAsInN1YiI6InJlZnJlc2gifQ.acaCsk-CJWIMLGDZdGnsthyZsJfQ8ihXLyE8mTji8PgGkpbwhs7e1O0uitMgP_pGjHq2tey1BHSwoeCL49b18WyMIB10hK-q2BXGKQkykltjTrQbg7VsdFi0h57mGfO0IqAwYd55_hzHZNnyJMh4b0iPQFDwU7iTD7x9doHhZAvzElpkWbc_NKVw5_Mw3znjntSzbuPN105zlp4Niurin-_5BnukwvoJWLEJ-ZlF6hE4wKhaMB1pWTJjMvJQJE8khTTvlUN8tGxmzoaDYoe1aCGNxmDEQnx8Y5gKzVd89sylhqi54d2nQrJ2-ElfEDsMoXpR01Ps6fNDFtLTuPTp7ixj8LvgL2nCjAg996Ga3PtdvXJAZPDYCqqvaBkZZcsiqOgqLV0vGo3VVlfrcgJXQImMYRr_Inu0FCe47A93IAWuQTs-KplM1KdGJsHSnNBV6oe6QEkROJT5qZME-8xhvBYvOXqp9Znwg39bmiBCMxk26Ce66_vw06MNgoa3D5AlXPWemfdVKPZDnj_aLVjZSs0gAfFElcVn7l9yjWJOaT2Muk26U8bJl-2BEq_DSclqKHODuYM5kkPKIdE4NFrsqsDYuGxcA25rlNETFyl0q-UXj1aoz_joy5Hdnr4mFELmjnoo4jYQuakufP9xeGPsj1skaodKl0mmoGcCD6v1F60" } ``` ## Using JWT Authentication Tokens -The `operation_token` value is used to authenticate all operations in place of our standard Basic auth. In order to pass the token you will need to create an Bearer Token Authorization Header like the following request: +The `operation_token` value is used to authenticate all operations in place of our standard Basic auth. In order to pass the token you will need to create an Bearer Token Authorization Header like the following request: ```bash curl --location --request POST 'http:/localhost:9925' \ @@ -90,8 +91,8 @@ The `refresh_token` also expires at a set interval, but a longer interval. Once Token timeouts are configurable in [harperdb-config.yaml](../configuration) with the following parameters: -* `operationsApi.authentication.operationTokenTimeout`: Defines the length of time until the operation_token expires (default 1d). +- `operationsApi.authentication.operationTokenTimeout`: Defines the length of time until the operation_token expires (default 1d). -* `operationsApi.authentication.refreshTokenTimeout`: Defines the length of time until the refresh_token expires (default 30d). +- `operationsApi.authentication.refreshTokenTimeout`: Defines the length of time until the refresh_token expires (default 30d). A full list of valid values for both parameters can be found [here](https://github.com/vercel/ms). diff --git a/site/versioned_docs/version-4.1/security/users-and-roles.md b/site/versioned_docs/version-4.1/security/users-and-roles.md index 77c8ec82..c060b6fd 100644 --- a/site/versioned_docs/version-4.1/security/users-and-roles.md +++ b/site/versioned_docs/version-4.1/security/users-and-roles.md @@ -4,95 +4,85 @@ title: Users & Roles # Users & Roles -HarperDB utilizes a Role-Based Access Control (RBAC) framework to manage access to HarperDB instances. A user is assigned a role that determines the user’s permissions to access database resources and run core operations. +HarperDB utilizes a Role-Based Access Control (RBAC) framework to manage access to HarperDB instances. A user is assigned a role that determines the user’s permissions to access database resources and run core operations. ## Roles in HarperDB Role permissions in HarperDB are broken into two categories – permissions around database manipulation and permissions around database definition. +**Database Manipulation**: A role defines CRUD (create, read, update, delete) permissions against database resources (i.e. data) in a HarperDB instance. +1. At the table-level access, permissions must be explicitly defined when adding or altering a role – _i.e. HarperDB will assume CRUD access to be FALSE if not explicitly provided in the permissions JSON passed to the `add_role` and/or `alter_role` API operations._ -**Database Manipulation**: A role defines CRUD (create, read, update, delete) permissions against database resources (i.e. data) in a HarperDB instance. - -1) At the table-level access, permissions must be explicitly defined when adding or altering a role – *i.e. HarperDB will assume CRUD access to be FALSE if not explicitly provided in the permissions JSON passed to the `add_role` and/or `alter_role` API operations.* - -2) At the attribute-level, permissions for attributes in all tables included in the permissions set will be assigned based on either the specific attribute-level permissions defined in the table’s permission set or, if there are no attribute-level permissions defined, permissions will be based on the table’s CRUD set. - - -**Database Definition**: Permissions related to managing schemas, tables, roles, users, and other system settings and operations are restricted to the built-in `super_user` role. - +2. At the attribute-level, permissions for attributes in all tables included in the permissions set will be assigned based on either the specific attribute-level permissions defined in the table’s permission set or, if there are no attribute-level permissions defined, permissions will be based on the table’s CRUD set. +**Database Definition**: Permissions related to managing schemas, tables, roles, users, and other system settings and operations are restricted to the built-in `super_user` role. **Built-In Roles** There are three built-in roles within HarperDB. See full breakdown of operations restricted to only super_user roles [here](#role-based-operation-restrictions). -* `super_user` - This role provides full access to all operations and methods within a HarperDB instance, this can be considered the admin role. +- `super_user` - This role provides full access to all operations and methods within a HarperDB instance, this can be considered the admin role. + - This role provides full access to all Database Definition operations and the ability to run Database Manipulation operations across the entire database schema with no restrictions. - * This role provides full access to all Database Definition operations and the ability to run Database Manipulation operations across the entire database schema with no restrictions. - -* `cluster_user` - This role is an internal system role type that is managed internally to allow clustered instances to communicate with one another. +- `cluster_user` - This role is an internal system role type that is managed internally to allow clustered instances to communicate with one another. + - This role is an internally managed role to facilitate communication between clustered instances. - * This role is an internally managed role to facilitate communication between clustered instances. - -* `structure_user` - This role provides specific access for creation and deletion of data. - - * When defining this role type you can either assign a value of true which will allow the role to create and drop schemas & tables. Alternatively the role type can be assigned a string array. The values in this array are schemas and allows the role to only create and drop tables in the designated schemas. +- `structure_user` - This role provides specific access for creation and deletion of data. + - When defining this role type you can either assign a value of true which will allow the role to create and drop schemas & tables. Alternatively the role type can be assigned a string array. The values in this array are schemas and allows the role to only create and drop tables in the designated schemas. **User-Defined Roles** In addition to built-in roles, admins (i.e. users assigned to the super_user role) can create customized roles for other users to interact with and manipulate the data within explicitly defined tables and attributes. -* Unless the user-defined role is given `super_user` permissions, permissions must be defined explicitly within the request body JSON. - -* Describe operations will return metadata for all schemas, tables, and attributes that a user-defined role has CRUD permissions for. +- Unless the user-defined role is given `super_user` permissions, permissions must be defined explicitly within the request body JSON. +- Describe operations will return metadata for all schemas, tables, and attributes that a user-defined role has CRUD permissions for. **Role Permissions** -When creating a new, user-defined role in a HarperDB instance, you must provide a role name and the permissions to assign to that role. *Reminder, only super users can create and manage roles.* - -* `role` name used to easily identify the role assigned to individual users. +When creating a new, user-defined role in a HarperDB instance, you must provide a role name and the permissions to assign to that role. _Reminder, only super users can create and manage roles._ - *Roles can be altered/dropped based on the role name used in and returned from a successful `add_role` , `alter_role`, or `list_roles` operation.* +- `role` name used to easily identify the role assigned to individual users. -* `permissions` used to explicitly defined CRUD access to existing table data. + _Roles can be altered/dropped based on the role name used in and returned from a successful `add_role` , `alter_role`, or `list_roles` operation._ +- `permissions` used to explicitly defined CRUD access to existing table data. Example JSON for `add_role` request ```json { - "operation":"add_role", - "role":"software_developer", - "permission":{ - "super_user":false, - "schema_name":{ - "tables": { - "table_name1": { - "read":true, - "insert":true, - "update":true, - "delete":false, - "attribute_permissions":[ - { - "attribute_name":"attribute1", - "read":true, - "insert":true, - "update":true - } - ] - }, - "table_name2": { - "read":true, - "insert":true, - "update":true, - "delete":false, - "attribute_permissions":[] - } - } - } - } + "operation": "add_role", + "role": "software_developer", + "permission": { + "super_user": false, + "schema_name": { + "tables": { + "table_name1": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "attribute1", + "read": true, + "insert": true, + "update": true + } + ] + }, + "table_name2": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [] + } + } + } + } } ``` @@ -100,18 +90,17 @@ Example JSON for `add_role` request There are two parts to a permissions set: -* `super_user` – boolean value indicating if role should be provided super_user access. - - *If `super_user` is set to true, there should be no additional schema-specific permissions values included since the role will have access to the entire database schema. If permissions are included in the body of the operation, they will stored within HarperDB, but ignored, as super_users have full access to the database.* +- `super_user` – boolean value indicating if role should be provided super_user access. -* `permissions`: Schema tables that a role should have specific CRUD access to should be included in the final, schema-specific `permissions` JSON. + _If `super_user` is set to true, there should be no additional schema-specific permissions values included since the role will have access to the entire database schema. If permissions are included in the body of the operation, they will stored within HarperDB, but ignored, as super_users have full access to the database._ - *For user-defined roles (i.e. non-super_user roles, blank permissions will result in the user being restricted from accessing any of the database schema.* +- `permissions`: Schema tables that a role should have specific CRUD access to should be included in the final, schema-specific `permissions` JSON. + _For user-defined roles (i.e. non-super_user roles, blank permissions will result in the user being restricted from accessing any of the database schema._ **Table Permissions JSON** -Each table that a role should be given some level of CRUD permissions to must be included in the `tables` array for its schema in the roles permissions JSON passed to the API (*see example above*). +Each table that a role should be given some level of CRUD permissions to must be included in the `tables` array for its schema in the roles permissions JSON passed to the API (_see example above_). ```json { @@ -131,138 +120,132 @@ Each table that a role should be given some level of CRUD permissions to must be } ``` - **Important Notes About Table Permissions** -1) If a schema and/or any of its tables are not included in the permissions JSON, the role will not have any CRUD access to the schema and/or tables. - -2) If a table-level CRUD permission is set to false, any attribute-level with that same CRUD permission set to true will return an error. +1. If a schema and/or any of its tables are not included in the permissions JSON, the role will not have any CRUD access to the schema and/or tables. +2. If a table-level CRUD permission is set to false, any attribute-level with that same CRUD permission set to true will return an error. **Important Notes About Attribute Permissions** -1) If there are attribute-specific CRUD permissions that need to be enforced on a table, those need to be explicitly described in the `attribute_permissions` array. - -2) If a non-hash attribute is given some level of CRUD access, that same access will be assigned to the table’s `hash_attribute`, even if it is not explicitly defined in the permissions JSON. +1. If there are attribute-specific CRUD permissions that need to be enforced on a table, those need to be explicitly described in the `attribute_permissions` array. - *See table_name1’s permission set for an example of this – even though the table’s hash attribute is not specifically defined in the attribute_permissions array, because the role has CRUD access to ‘attribute1’, the role will have the same access to the table’s hash attribute.* +2. If a non-hash attribute is given some level of CRUD access, that same access will be assigned to the table’s `hash_attribute`, even if it is not explicitly defined in the permissions JSON. -3) If attribute-level permissions are set – *i.e. attribute_permissions.length > 0* – any table attribute not explicitly included will be assumed to have not CRUD access (with the exception of the `hash_attribute` described in #2). + _See table_name1’s permission set for an example of this – even though the table’s hash attribute is not specifically defined in the attribute_permissions array, because the role has CRUD access to ‘attribute1’, the role will have the same access to the table’s hash attribute._ - *See table_name1’s permission set for an example of this – in this scenario, the role will have the ability to create, insert and update ‘attribute1’ and the table’s hash attribute but no other attributes on that table.* +3. If attribute-level permissions are set – _i.e. attribute_permissions.length > 0_ – any table attribute not explicitly included will be assumed to have not CRUD access (with the exception of the `hash_attribute` described in #2). -4) If an `attribute_permissions` array is empty, the role’s access to a table’s attributes will be based on the table-level CRUD permissions. + _See table_name1’s permission set for an example of this – in this scenario, the role will have the ability to create, insert and update ‘attribute1’ and the table’s hash attribute but no other attributes on that table._ - *See table_name2’s permission set for an example of this.* +4. If an `attribute_permissions` array is empty, the role’s access to a table’s attributes will be based on the table-level CRUD permissions. -5) The `__createdtime__` and `__updatedtime__` attributes that HarperDB manages internally can have read perms set but, if set, all other attribute-level permissions will be ignored. + _See table_name2’s permission set for an example of this._ -6) Please note that DELETE permissions are not included as a part of an individual attribute-level permission set. That is because it is not possible to delete individual attributes from a row, rows must be deleted in full. +5. The `__createdtime__` and `__updatedtime__` attributes that HarperDB manages internally can have read perms set but, if set, all other attribute-level permissions will be ignored. - * If a role needs the ability to delete rows from a table, that permission should be set on the table-level. - - * The practical approach to deleting an individual attribute of a row would be to set that attribute to null via an update statement. +6. Please note that DELETE permissions are not included as a part of an individual attribute-level permission set. That is because it is not possible to delete individual attributes from a row, rows must be deleted in full. + - If a role needs the ability to delete rows from a table, that permission should be set on the table-level. + - The practical approach to deleting an individual attribute of a row would be to set that attribute to null via an update statement. ## Role-Based Operation Restrictions The table below includes all API operations available in HarperDB and indicates whether or not the operation is restricted to super_user roles. -*Keep in mind that non-super_user roles will also be restricted within the operations they do have access to by the schema-level CRUD permissions set for the roles.* - -| Schemas and Tables | Restricted to Super_Users | -|--------------------|:---------------------------:| -| describe_all | | -| describe_schema | | -| describe_table | | -| create_schema | X | -| drop_schema | X | -| create_table | X | -| drop_table | X | -| create_attribute | | -| drop_attribute | X | - - -| NoSQL Operations | Restricted to Super_Users | -|----------------------|:---------------------------:| -| insert | | -| update | | -| upsert | | -| delete | | -| search_by_hash | | -| search_by_value | | -| search_by_conditions | | - -| SQL Operations | Restricted to Super_Users | -|-----------------|:---------------------------:| -| select | | -| insert | | -| update | | -| delete | | - -| Bulk Operations | Restricted to Super_Users | -|------------------|:---------------------------:| -| csv_data_load | | -| csv_file_load | | -| csv_url_load | | -| import_from_s3 | | - -| Users and Roles | Restricted to Super_Users | -|-----------------|:---------------------------:| -| list_roles | X | -| add_role | X | -| alter_role | X | -| drop_role | X | -| list_users | X | -| user_info | | -| add_user | X | -| alter_user | X | -| drop_user | X | - -| Clustering | Restricted to Super_Users | -|-----------------------|:---------------------------:| -| cluster_set_routes | X | -| cluster_get_routes | X | -| cluster_delete_routes | X | -| add_node | X | -| update_node | X | -| cluster_status | X | -| remove_node | X | -| configure_cluster | X | - - -| Custom Functions | Restricted to Super_Users | -|----------------------------------|:---------------------------:| -| custom_functions_status | X | -| get_custom_functions | X | -| get_custom_function | X | -| set_custom_function | X | -| drop_custom_function | X | -| add_custom_function_project | X | -| drop_custom_function_project | X | -| package_custom_function_project | X | -| deploy_custom_function_project | X | - -| Registration | Restricted to Super_Users | -|-------------------|:---------------------------:| -| registration_info | | -| get_fingerprint | X | -| set_license | X | - -| Jobs | Restricted to Super_Users | -|----------------------------|:---------------------------:| -| get_job | | -| search_jobs_by_start_date | X | - -| Logs | Restricted to Super_Users | -|--------------------------------|:---------------------------:| -| read_log | X | -| read_transaction_log | X | -| delete_transaction_logs_before | X | -| read_audit_log | X | -| delete_audit_logs_before | X | +_Keep in mind that non-super_user roles will also be restricted within the operations they do have access to by the schema-level CRUD permissions set for the roles._ + +| Schemas and Tables | Restricted to Super_Users | +| ------------------ | :-----------------------: | +| describe_all | | +| describe_schema | | +| describe_table | | +| create_schema | X | +| drop_schema | X | +| create_table | X | +| drop_table | X | +| create_attribute | | +| drop_attribute | X | + +| NoSQL Operations | Restricted to Super_Users | +| -------------------- | :-----------------------: | +| insert | | +| update | | +| upsert | | +| delete | | +| search_by_hash | | +| search_by_value | | +| search_by_conditions | | + +| SQL Operations | Restricted to Super_Users | +| -------------- | :-----------------------: | +| select | | +| insert | | +| update | | +| delete | | + +| Bulk Operations | Restricted to Super_Users | +| --------------- | :-----------------------: | +| csv_data_load | | +| csv_file_load | | +| csv_url_load | | +| import_from_s3 | | + +| Users and Roles | Restricted to Super_Users | +| --------------- | :-----------------------: | +| list_roles | X | +| add_role | X | +| alter_role | X | +| drop_role | X | +| list_users | X | +| user_info | | +| add_user | X | +| alter_user | X | +| drop_user | X | + +| Clustering | Restricted to Super_Users | +| --------------------- | :-----------------------: | +| cluster_set_routes | X | +| cluster_get_routes | X | +| cluster_delete_routes | X | +| add_node | X | +| update_node | X | +| cluster_status | X | +| remove_node | X | +| configure_cluster | X | + +| Custom Functions | Restricted to Super_Users | +| ------------------------------- | :-----------------------: | +| custom_functions_status | X | +| get_custom_functions | X | +| get_custom_function | X | +| set_custom_function | X | +| drop_custom_function | X | +| add_custom_function_project | X | +| drop_custom_function_project | X | +| package_custom_function_project | X | +| deploy_custom_function_project | X | + +| Registration | Restricted to Super_Users | +| ----------------- | :-----------------------: | +| registration_info | | +| get_fingerprint | X | +| set_license | X | + +| Jobs | Restricted to Super_Users | +| ------------------------- | :-----------------------: | +| get_job | | +| search_jobs_by_start_date | X | + +| Logs | Restricted to Super_Users | +| ------------------------------ | :-----------------------: | +| read_log | X | +| read_transaction_log | X | +| delete_transaction_logs_before | X | +| read_audit_log | X | +| delete_audit_logs_before | X | | Utilities | Restricted to Super_Users | -|-----------------------|:-------------------------:| +| --------------------- | :-----------------------: | | delete_records_before | X | | export_local | X | | export_to_s3 | X | @@ -272,17 +255,15 @@ The table below includes all API operations available in HarperDB and indicates | get_configuration | X | | configure_cluster | X | -| Token Authentication | Restricted to Super_Users | -|------------------------------|:---------------------------:| -| create_authentication_tokens | | -| refresh_operation_token | | +| Token Authentication | Restricted to Super_Users | +| ---------------------------- | :-----------------------: | +| create_authentication_tokens | | +| refresh_operation_token | | ## Error: Must execute as User -**You may have gotten an error like,** `Error: Must execute as <>`. - -This means that you installed HarperDB as `<>`. Because HarperDB stores files natively on the operating system, we only allow the HarperDB executable to be run by a single user. This prevents permissions issues on files. - +**You may have gotten an error like,** `Error: Must execute as <>`. +This means that you installed HarperDB as `<>`. Because HarperDB stores files natively on the operating system, we only allow the HarperDB executable to be run by a single user. This prevents permissions issues on files. -For example if you installed as user_a, but later wanted to run as user_b. User_b may not have access to the hdb files HarperDB needs. This also keeps HarperDB more secure as it allows you to lock files down to a specific user and prevents other users from accessing your files. \ No newline at end of file +For example if you installed as user_a, but later wanted to run as user_b. User_b may not have access to the hdb files HarperDB needs. This also keeps HarperDB more secure as it allows you to lock files down to a specific user and prevents other users from accessing your files. diff --git a/site/versioned_docs/version-4.1/sql-guide/date-functions.md b/site/versioned_docs/version-4.1/sql-guide/date-functions.md index f632b4ed..9ecebdb1 100644 --- a/site/versioned_docs/version-4.1/sql-guide/date-functions.md +++ b/site/versioned_docs/version-4.1/sql-guide/date-functions.md @@ -40,6 +40,7 @@ Referencing this variable will evaluate as the current Unix Timestamp in millise "current_timestamp_result": 1587568845765 } ``` + ### DATE([date_string]) Formats and returns the date_string argument in UTC in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. @@ -64,9 +65,8 @@ If a date_string is not provided, the function will return the current UTC date/ Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. - | Key | Shorthand | -|--------------|-----------| +| ------------ | --------- | | years | y | | quarters | Q | | months | M | @@ -77,7 +77,6 @@ Adds the defined amount of time to the date provided in UTC and returns the resu | seconds | s | | milliseconds | ms | - ``` "SELECT DATE_ADD(1587568845765, 1, 'days') AS date_add_result" AND "SELECT DATE_ADD(1587568845765, 1, 'd') AS date_add_result" both return @@ -99,13 +98,14 @@ AS date_add_result2" returns Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. Accepted interval values: -* years -* months -* weeks -* days -* hours -* minutes -* seconds + +- years +- months +- weeks +- days +- hours +- minutes +- seconds ``` "SELECT DATE_DIFF(CURRENT_TIMESTAMP, 1650643129017, 'hours') @@ -132,7 +132,7 @@ AS date_format_result" returns Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date_sub interval values- Either string value (key or shorthand) can be passed as the interval argument. | Key | Shorthand | -|--------------|-----------| +| ------------ | --------- | | years | y | | quarters | Q | | months | M | @@ -143,7 +143,6 @@ Subtracts the defined amount of time from the date provided in UTC and returns t | seconds | s | | milliseconds | ms | - ``` "SELECT DATE_SUB(1587568845765, 2, 'years') AS date_sub_result" returns { @@ -155,15 +154,15 @@ Subtracts the defined amount of time from the date provided in UTC and returns t Extracts and returns the date_part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” -| date_part | Example return value* | -|--------------|------------------------| -| year | “2020” | -| month | “3” | -| day | “26” | - | hour | “15” | -| minute | “13” | -| second | “2” | -| millisecond | “41” | +| date_part | Example return value\* | +| ----------- | ---------------------- | +| year | “2020” | +| month | “3” | +| day | “26” | +| hour | “15” | +| minute | “13” | +| second | “2” | +| millisecond | “41” | ``` "SELECT EXTRACT(1587568845765, 'year') AS extract_result" returns @@ -184,6 +183,7 @@ Returns the current Unix Timestamp in milliseconds. ``` ### GET_SERVER_TIME() + Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. ``` @@ -194,6 +194,7 @@ Returns the current date/time value based on the server’s timezone in `YYYY-MM ``` ### OFFSET_UTC(date, offset) + Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. ``` @@ -211,6 +212,7 @@ Returns the UTC date time value with the offset provided included in the return ``` ### NOW() + Returns the current Unix Timestamp in milliseconds. ``` @@ -219,4 +221,3 @@ Returns the current Unix Timestamp in milliseconds. "now_result": 1587568845765 } ``` - diff --git a/site/versioned_docs/version-4.1/sql-guide/delete.md b/site/versioned_docs/version-4.1/sql-guide/delete.md index 6e227192..0ddbc6fd 100644 --- a/site/versioned_docs/version-4.1/sql-guide/delete.md +++ b/site/versioned_docs/version-4.1/sql-guide/delete.md @@ -6,8 +6,6 @@ title: Delete HarperDB supports deleting records from a table with condition support. - - ``` DELETE FROM dev.dog WHERE age < 4 diff --git a/site/versioned_docs/version-4.1/sql-guide/features-matrix.md b/site/versioned_docs/version-4.1/sql-guide/features-matrix.md index db9a216c..e0614eec 100644 --- a/site/versioned_docs/version-4.1/sql-guide/features-matrix.md +++ b/site/versioned_docs/version-4.1/sql-guide/features-matrix.md @@ -6,78 +6,77 @@ title: SQL Features Matrix HarperDB provides access to most SQL functions, and we’re always expanding that list. Check below to see if we cover what you need. If not, feel free to [add a Feature Request](https://feedback.harperdb.io/). - | INSERT | | -|------------------------------------|-----| -| Values - multiple values supported | ✔ | +| ---------------------------------- | --- | +| Values - multiple values supported | ✔ | | Sub-SELECT | ✗ | -| UPDATE | | -|-----------------|-----| -| SET | ✔ | -| Sub-SELECT | ✗ | -| Conditions | ✔ | -| Date Functions* | ✔ | -| Math Functions | ✔ | +| UPDATE | | +| ---------------- | --- | +| SET | ✔ | +| Sub-SELECT | ✗ | +| Conditions | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | | DELETE | | -|------------|-----| -| FROM | ✔ | +| ---------- | --- | +| FROM | ✔ | | Sub-SELECT | ✗ | -| Conditions | ✔ | +| Conditions | ✔ | -| SELECT | | -|-----------------------|-----| -| Column SELECT | ✔ | -| Aliases | ✔ | -| Aggregator Functions | ✔ | -| Date Functions* | ✔ | -| Math Functions | ✔ | -| Constant Values | ✔ | -| Distinct | ✔ | -| Sub-SELECT | ✗ | +| SELECT | | +| -------------------- | --- | +| Column SELECT | ✔ | +| Aliases | ✔ | +| Aggregator Functions | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | +| Constant Values | ✔ | +| Distinct | ✔ | +| Sub-SELECT | ✗ | -| FROM | | -|-------------------|-----| -| Multi-table JOIN | ✔ | -| INNER JOIN | ✔ | -| LEFT OUTER JOIN | ✔ | -| LEFT INNER JOIN | ✔ | -| RIGHT OUTER JOIN | ✔ | -| RIGHT INNER JOIN | ✔ | -| FULL JOIN | ✔ | -| UNION | ✗ | -| Sub-SELECT | ✗ | -| TOP | ✔ | +| FROM | | +| ---------------- | --- | +| Multi-table JOIN | ✔ | +| INNER JOIN | ✔ | +| LEFT OUTER JOIN | ✔ | +| LEFT INNER JOIN | ✔ | +| RIGHT OUTER JOIN | ✔ | +| RIGHT INNER JOIN | ✔ | +| FULL JOIN | ✔ | +| UNION | ✗ | +| Sub-SELECT | ✗ | +| TOP | ✔ | | WHERE | | -|----------------------------|-----| -| Multi-Conditions | ✔ | -| Wildcards | ✔ | -| IN | ✔ | -| LIKE | ✔ | -| Bit-wise Operators AND, OR | ✔ | -| Bit-wise Operators NOT | ✔ | -| NULL | ✔ | -| BETWEEN | ✔ | -| EXISTS,ANY,ALL | ✔ | -| Compare columns | ✔ | -| Compare constants | ✔ | -| Date Functions* | ✔ | -| Math Functions | ✔ | -| Sub-SELECT | ✗ | +| -------------------------- | --- | +| Multi-Conditions | ✔ | +| Wildcards | ✔ | +| IN | ✔ | +| LIKE | ✔ | +| Bit-wise Operators AND, OR | ✔ | +| Bit-wise Operators NOT | ✔ | +| NULL | ✔ | +| BETWEEN | ✔ | +| EXISTS,ANY,ALL | ✔ | +| Compare columns | ✔ | +| Compare constants | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | +| Sub-SELECT | ✗ | | GROUP BY | | -|-----------------------|-----| -| Multi-Column GROUP BY | ✔ | +| --------------------- | --- | +| Multi-Column GROUP BY | ✔ | -| HAVING | | -|--------------------------------|-----| -| Aggregate function conditions | ✔ | +| HAVING | | +| ----------------------------- | --- | +| Aggregate function conditions | ✔ | | ORDER BY | | -|-----------------------|-----| -| Multi-Column ORDER BY | ✔ | -| Aliases | ✔ | -| Date Functions* | ✔ | -| Math Functions | ✔ | \ No newline at end of file +| --------------------- | --- | +| Multi-Column ORDER BY | ✔ | +| Aliases | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | diff --git a/site/versioned_docs/version-4.1/sql-guide/functions.md b/site/versioned_docs/version-4.1/sql-guide/functions.md index b9a10787..0360b1e8 100644 --- a/site/versioned_docs/version-4.1/sql-guide/functions.md +++ b/site/versioned_docs/version-4.1/sql-guide/functions.md @@ -7,147 +7,149 @@ title: HarperDB SQL Functions This SQL keywords reference contains the SQL functions available in HarperDB. ## Functions + ### Aggregate -| Keyword | Syntax | Description | -|-----------------|-------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| -| AVG | AVG(_expression_) | Returns the average of a given numeric expression. | -| COUNT | SELECT COUNT(_column_name_) FROM _schema.table_ WHERE _condition_ | Returns the number records that match the given criteria. Nulls are not counted. | -| GROUP_CONCAT | GROUP_CONCAT(_expression_) | Returns a string with concatenated values that are comma separated and that are non-null from a group. Will return null when there are non-null values. | -| MAX | SELECT MAX(_column_name_) FROM _schema.table_ WHERE _condition_ | Returns largest value in a specified column. | -| MIN | SELECT MIN(_column_name_) FROM _schema.table_ WHERE _condition_ | Returns smallest value in a specified column. | -| SUM | SUM(_column_name_) | Returns the sum of the numeric values provided. | -| ARRAY* | ARRAY(_expression_) | Returns a list of data as a field. | -| DISTINCT_ARRAY* | DISTINCT_ARRAY(_expression_) | When placed around a standard ARRAY() function, returns a distinct (deduplicated) results set. | +| Keyword | Syntax | Description | +| ---------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| AVG | AVG(_expression_) | Returns the average of a given numeric expression. | +| COUNT | SELECT COUNT(_column_name_) FROM _schema.table_ WHERE _condition_ | Returns the number records that match the given criteria. Nulls are not counted. | +| GROUP_CONCAT | GROUP*CONCAT(\_expression*) | Returns a string with concatenated values that are comma separated and that are non-null from a group. Will return null when there are non-null values. | +| MAX | SELECT MAX(_column_name_) FROM _schema.table_ WHERE _condition_ | Returns largest value in a specified column. | +| MIN | SELECT MIN(_column_name_) FROM _schema.table_ WHERE _condition_ | Returns smallest value in a specified column. | +| SUM | SUM(_column_name_) | Returns the sum of the numeric values provided. | +| ARRAY\* | ARRAY(_expression_) | Returns a list of data as a field. | +| DISTINCT_ARRAY\* | DISTINCT*ARRAY(\_expression*) | When placed around a standard ARRAY() function, returns a distinct (deduplicated) results set. | -*For more information on ARRAY() and DISTINCT_ARRAY() see [this blog](https://www.harperdb.io/post/sql-queries-to-complex-objects). +\*For more information on ARRAY() and DISTINCT_ARRAY() see [this blog](https://www.harperdb.io/post/sql-queries-to-complex-objects). ### Conversion -| Keyword | Syntax | Description | -|---------|--------------------------------------------------|------------------------------------------------------------------------| -| CAST | CAST(_expression AS datatype(length)_) | Converts a value to a specified datatype. | -| CONVERT | CONVERT(_data_type(length), expression, style_) | Converts a value from one datatype to a different, specified datatype. | - +| Keyword | Syntax | Description | +| ------- | ----------------------------------------------- | ---------------------------------------------------------------------- | +| CAST | CAST(_expression AS datatype(length)_) | Converts a value to a specified datatype. | +| CONVERT | CONVERT(_data_type(length), expression, style_) | Converts a value from one datatype to a different, specified datatype. | ### Date & Time -| Keyword | Syntax | Description | -|-------------------|-----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CURRENT_DATE | CURRENT_DATE() | Returns the current date in UTC in “YYYY-MM-DD” String format. | -| CURRENT_TIME | CURRENT_TIME() | Returns the current time in UTC in “HH:mm:ss.SSS” string format. | -| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | Referencing this variable will evaluate as the current Unix Timestamp in milliseconds. For more information, go here. | +| Keyword | Syntax | Description | +| ----------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------- | +| CURRENT_DATE | CURRENT_DATE() | Returns the current date in UTC in “YYYY-MM-DD” String format. | +| CURRENT_TIME | CURRENT_TIME() | Returns the current time in UTC in “HH:mm:ss.SSS” string format. | +| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | Referencing this variable will evaluate as the current Unix Timestamp in milliseconds. For more information, go here. | + | -| DATE | DATE([_date_string_]) | Formats and returns the date_string argument in UTC in ‘YYYY-MM-DDTHH:mm:ss.SSSZZ’ string format. If a date_string is not provided, the function will return the current UTC date/time value in the return format defined above. For more information, go here. | +| DATE | DATE([_date_string_]) | Formats and returns the date*string argument in UTC in ‘YYYY-MM-DDTHH:mm:ss.SSSZZ’ string format. If a date_string is not provided, the function will return the current UTC date/time value in the return format defined above. For more information, go here. | | -| DATE_ADD | DATE_ADD(_date, value, interval_) | Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | +| DATE_ADD | DATE_ADD(\_date, value, interval*) | Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | | -| DATE_DIFF | DATEDIFF(_date_1, date_2[, interval]_) | Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. For more information, go here. | +| DATE*DIFF | DATEDIFF(\_date_1, date_2[, interval]*) | Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. For more information, go here. | | -| DATE_FORMAT | DATE_FORMAT(_date, format_) | Formats and returns a date value in the String format provided. Find more details on accepted format values in the moment.js docs. For more information, go here. | +| DATE*FORMAT | DATE_FORMAT(\_date, format*) | Formats and returns a date value in the String format provided. Find more details on accepted format values in the moment.js docs. For more information, go here. | | -| DATE_SUB | DATE_SUB(_date, format_) | Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date_sub interval values- Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | +| DATE*SUB | DATE_SUB(\_date, format*) | Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date*sub interval values- Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | | -| DAY | DAY(_date_) | Return the day of the month for the given date. | +| DAY | DAY(\_date*) | Return the day of the month for the given date. | | -| DAYOFWEEK | DAYOFWEEK(_date_) | Returns the numeric value of the weekday of the date given(“YYYY-MM-DD”).NOTE: 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, and 6=Saturday. | -| EXTRACT | EXTRACT(_date, date_part_) | Extracts and returns the date_part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” For more information, go here. | +| DAYOFWEEK | DAYOFWEEK(_date_) | Returns the numeric value of the weekday of the date given(“YYYY-MM-DD”).NOTE: 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, and 6=Saturday. | +| EXTRACT | EXTRACT(_date, date_part_) | Extracts and returns the date*part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” For more information, go here. | | -| GETDATE | GETDATE() | Returns the current Unix Timestamp in milliseconds. | -| GET_SERVER_TIME | GET_SERVER_TIME() | Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. | -| OFFSET_UTC | OFFSET_UTC(_date, offset_) | Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. | -| NOW | NOW() | Returns the current Unix Timestamp in milliseconds. | +| GETDATE | GETDATE() | Returns the current Unix Timestamp in milliseconds. | +| GET_SERVER_TIME | GET_SERVER_TIME() | Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. | +| OFFSET_UTC | OFFSET_UTC(\_date, offset*) | Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. | +| NOW | NOW() | Returns the current Unix Timestamp in milliseconds. | | -| HOUR | HOUR(_datetime_) | Returns the hour part of a given date in range of 0 to 838. | +| HOUR | HOUR(_datetime_) | Returns the hour part of a given date in range of 0 to 838. | | -| MINUTE | MINUTE(_datetime_) | Returns the minute part of a time/datetime in range of 0 to 59. | +| MINUTE | MINUTE(_datetime_) | Returns the minute part of a time/datetime in range of 0 to 59. | | -| MONTH | MONTH(_date_) | Returns month part for a specified date in range of 1 to 12. | +| MONTH | MONTH(_date_) | Returns month part for a specified date in range of 1 to 12. | | -| SECOND | SECOND(_datetime_) | Returns the seconds part of a time/datetime in range of 0 to 59. | -| YEAR | YEAR(_date_) | Returns the year part for a specified date. | +| SECOND | SECOND(_datetime_) | Returns the seconds part of a time/datetime in range of 0 to 59. | +| YEAR | YEAR(_date_) | Returns the year part for a specified date. | | ### Logical -| Keyword | Syntax | Description | -|---------|--------------------------------------------------|--------------------------------------------------------------------------------------------| -| IF | IF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | -| IIF | IIF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | -| IFNULL | IFNULL(_expression, alt_value_) | Returns a specified value if the expression is null. | -| NULLIF | NULLIF(_expression_1, expression_2_) | Returns null if expression_1 is equal to expression_2, if not equal, returns expression_1. | +| Keyword | Syntax | Description | +| ------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------ | +| IF | IF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | +| IIF | IIF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | +| IFNULL | IFNULL(_expression, alt_value_) | Returns a specified value if the expression is null. | +| NULLIF | NULLIF(_expression_1, expression_2_) | Returns null if expression_1 is equal to expression_2, if not equal, returns expression_1. | ### Mathematical -| Keyword | Syntax | Description | -|---------|---------------------------------|-----------------------------------------------------------------------------------------------------| -| ABS | ABS(_expression_) | Returns the absolute value of a given numeric expression. | -| CEIL | CEIL(_number_) | Returns integer ceiling, the smallest integer value that is bigger than or equal to a given number. | -| EXP | EXP(_number_) | Returns e to the power of a specified number. | -| FLOOR | FLOOR(_number_) | Returns the largest integer value that is smaller than, or equal to, a given number. | -| RANDOM | RANDOM(_seed_) | Returns a pseudo random number. | -| ROUND | ROUND(_number,decimal_places_) | Rounds a given number to a specified number of decimal places. | -| SQRT | SQRT(_expression_) | Returns the square root of an expression. | - +| Keyword | Syntax | Description | +| ------- | ------------------------------ | --------------------------------------------------------------------------------------------------- | +| ABS | ABS(_expression_) | Returns the absolute value of a given numeric expression. | +| CEIL | CEIL(_number_) | Returns integer ceiling, the smallest integer value that is bigger than or equal to a given number. | +| EXP | EXP(_number_) | Returns e to the power of a specified number. | +| FLOOR | FLOOR(_number_) | Returns the largest integer value that is smaller than, or equal to, a given number. | +| RANDOM | RANDOM(_seed_) | Returns a pseudo random number. | +| ROUND | ROUND(_number,decimal_places_) | Rounds a given number to a specified number of decimal places. | +| SQRT | SQRT(_expression_) | Returns the square root of an expression. | ### String -| Keyword | Syntax | Description | -|-------------|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CONCAT | CONCAT(_string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together, resulting in a single string. | -| CONCAT_WS | CONCAT_WS(_separator, string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together with a separator, resulting in a single string. | -| INSTR | INSTR(_string_1, string_2_) | Returns the first position, as an integer, of string_2 within string_1. | -| LEN | LEN(_string_) | Returns the length of a string. | -| LOWER | LOWER(_string_) | Converts a string to lower-case. | -| REGEXP | SELECT _column_name_ FROM _schema.table_ WHERE _column_name_ REGEXP _pattern_ | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | -| REGEXP_LIKE | SELECT _column_name_ FROM _schema.table_ WHERE REGEXP_LIKE(_column_name, pattern_) | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | -| REPLACE | REPLACE(_string, old_string, new_string_) | Replaces all instances of old_string within new_string, with string. | -| SUBSTRING | SUBSTRING(_string, string_position, length_of_substring_) | Extracts a specified amount of characters from a string. | -| TRIM | TRIM([_character(s) FROM_] _string_) | Removes leading and trailing spaces, or specified character(s), from a string. | -| UPPER | UPPER(_string_) | Converts a string to upper-case. | +| Keyword | Syntax | Description | +| ----------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| CONCAT | CONCAT(_string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together, resulting in a single string. | +| CONCAT_WS | CONCAT*WS(\_separator, string_1, string_2, ...., string_n*) | Concatenates, or joins, two or more strings together with a separator, resulting in a single string. | +| INSTR | INSTR(_string_1, string_2_) | Returns the first position, as an integer, of string_2 within string_1. | +| LEN | LEN(_string_) | Returns the length of a string. | +| LOWER | LOWER(_string_) | Converts a string to lower-case. | +| REGEXP | SELECT _column_name_ FROM _schema.table_ WHERE _column_name_ REGEXP _pattern_ | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | +| REGEXP_LIKE | SELECT _column_name_ FROM _schema.table_ WHERE REGEXP*LIKE(\_column_name, pattern*) | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | +| REPLACE | REPLACE(_string, old_string, new_string_) | Replaces all instances of old_string within new_string, with string. | +| SUBSTRING | SUBSTRING(_string, string_position, length_of_substring_) | Extracts a specified amount of characters from a string. | +| TRIM | TRIM([_character(s) FROM_] _string_) | Removes leading and trailing spaces, or specified character(s), from a string. | +| UPPER | UPPER(_string_) | Converts a string to upper-case. | ## Operators + ### Logical Operators -| Keyword | Syntax | Description | -|----------|--------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------| -| BETWEEN | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ BETWEEN _value_1_ AND _value_2_ | (inclusive) Returns values(numbers, text, or dates) within a given range. | -| IN | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ IN(_value(s)_) | Used to specify multiple values in a WHERE clause. | -| LIKE | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_n_ LIKE _pattern_ | Searches for a specified pattern within a WHERE clause. | +| Keyword | Syntax | Description | +| ------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| BETWEEN | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ BETWEEN _value_1_ AND _value_2_ | (inclusive) Returns values(numbers, text, or dates) within a given range. | +| IN | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ IN(_value(s)_) | Used to specify multiple values in a WHERE clause. | +| LIKE | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_n_ LIKE _pattern_ | Searches for a specified pattern within a WHERE clause. | ## Queries + ### General -| Keyword | Syntax | Description | -|-----------|--------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------| -| DISTINCT | SELECT DISTINCT _column_name(s)_ FROM _schema.table_ | Returns only unique values, eliminating duplicate records. | -| FROM | FROM _schema.table_ | Used to list the schema(s), table(s), and any joins required for a SQL statement. | -| GROUP BY | SELECT _column_name(s)_ FROM _schema.table_ WHERE _condition_ GROUP BY _column_name(s)_ ORDER BY _column_name(s)_ | Groups rows that have the same values into summary rows. | -| HAVING | SELECT _column_name(s)_ FROM _schema.table_ WHERE _condition_ GROUP BY _column_name(s)_ HAVING _condition_ ORDER BY _column_name(s)_ | Filters data based on a group or aggregate function. | -| SELECT | SELECT _column_name(s)_ FROM _schema.table_ | Selects data from table. | -| WHERE | SELECT _column_name(s)_ FROM _schema.table_ WHERE _condition_ | Extracts records based on a defined condition. | +| Keyword | Syntax | Description | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- | +| DISTINCT | SELECT DISTINCT _column_name(s)_ FROM _schema.table_ | Returns only unique values, eliminating duplicate records. | +| FROM | FROM _schema.table_ | Used to list the schema(s), table(s), and any joins required for a SQL statement. | +| GROUP BY | SELECT _column_name(s)_ FROM _schema.table_ WHERE _condition_ GROUP BY _column_name(s)_ ORDER BY _column_name(s)_ | Groups rows that have the same values into summary rows. | +| HAVING | SELECT _column_name(s)_ FROM _schema.table_ WHERE _condition_ GROUP BY _column_name(s)_ HAVING _condition_ ORDER BY _column_name(s)_ | Filters data based on a group or aggregate function. | +| SELECT | SELECT _column_name(s)_ FROM _schema.table_ | Selects data from table. | +| WHERE | SELECT _column_name(s)_ FROM _schema.table_ WHERE _condition_ | Extracts records based on a defined condition. | ### Joins -| Keyword | Syntax | Description | -|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CROSS JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ CROSS JOIN _schema.table_2_ | Returns a paired combination of each row from _table_1_ with row from _table_2_. _Note: CROSS JOIN can return very large result sets and is generally considered bad practice._ | -| FULL OUTER | SELECT _column_name(s)_ FROM _schema.table_1_ FULL OUTER JOIN _schema.table_2_ ON _table_1.column_name_ _= table_2.column_name_ WHERE _condition_ | Returns all records when there is a match in either _table_1_ (left table) or _table_2_ (right table). | -| [INNER] JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ INNER JOIN _schema.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return only matching records from _table_1_ (left table) and _table_2_ (right table). The INNER keyword is optional and does not affect the result. | -| LEFT [OUTER] JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ LEFT OUTER JOIN _schema.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return all records from _table_1_ (left table) and matching data from _table_2_ (right table). The OUTER keyword is optional and does not affect the result. | -| RIGHT [OUTER] JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ RIGHT OUTER JOIN _schema.table_2_ ON _table_1.column_name = table_2.column_name_ | Return all records from _table_2_ (right table) and matching data from _table_1_ (left table). The OUTER keyword is optional and does not affect the result. | +| Keyword | Syntax | Description | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| CROSS JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ CROSS JOIN _schema.table_2_ | Returns a paired combination of each row from _table_1_ with row from _table_2_. _Note: CROSS JOIN can return very large result sets and is generally considered bad practice._ | +| FULL OUTER | SELECT _column_name(s)_ FROM _schema.table_1_ FULL OUTER JOIN _schema.table_2_ ON _table_1.column_name_ _= table_2.column_name_ WHERE _condition_ | Returns all records when there is a match in either _table_1_ (left table) or _table_2_ (right table). | +| [INNER] JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ INNER JOIN _schema.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return only matching records from _table_1_ (left table) and _table_2_ (right table). The INNER keyword is optional and does not affect the result. | +| LEFT [OUTER] JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ LEFT OUTER JOIN _schema.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return all records from _table_1_ (left table) and matching data from _table_2_ (right table). The OUTER keyword is optional and does not affect the result. | +| RIGHT [OUTER] JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ RIGHT OUTER JOIN _schema.table_2_ ON _table_1.column_name = table_2.column_name_ | Return all records from _table_2_ (right table) and matching data from _table_1_ (left table). The OUTER keyword is optional and does not affect the result. | ### Predicates -| Keyword | Syntax | Description | -|--------------|------------------------------------------------------------------------------|----------------------------| -| IS NOT NULL | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ IS NOT NULL | Tests for non-null values. | -| IS NULL | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ IS NULL | Tests for null values. | +| Keyword | Syntax | Description | +| ----------- | --------------------------------------------------------------------------- | -------------------------- | +| IS NOT NULL | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ IS NOT NULL | Tests for non-null values. | +| IS NULL | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ IS NULL | Tests for null values. | ### Statements | Keyword | Syntax | Description | -|---------|---------------------------------------------------------------------------------------------|-------------------------------------| +| ------- | ------------------------------------------------------------------------------------------- | ----------------------------------- | | DELETE | DELETE FROM _schema.table_ WHERE condition | Deletes existing data from a table. | | INSERT | INSERT INTO _schema.table(column_name(s))_ VALUES(_value(s)_) | Inserts new records into a table. | | UPDATE | UPDATE _schema.table_ SET _column_1 = value_1, column_2 = value_2, ....,_ WHERE _condition_ | Alters existing records in a table. | diff --git a/site/versioned_docs/version-4.1/sql-guide/index.md b/site/versioned_docs/version-4.1/sql-guide/index.md index a6a44875..aca19561 100644 --- a/site/versioned_docs/version-4.1/sql-guide/index.md +++ b/site/versioned_docs/version-4.1/sql-guide/index.md @@ -4,8 +4,6 @@ title: HarperDB SQL Guide # HarperDB SQL Guide -The purpose of this guide is to describe the available functionality of HarperDB as it relates to supported SQL functionality. The SQL parser is still actively being developed and this document will be updated as more features and functionality becomes available. **A high-level view of supported features can be found [here](./features-matrix).** +The purpose of this guide is to describe the available functionality of HarperDB as it relates to supported SQL functionality. The SQL parser is still actively being developed and this document will be updated as more features and functionality becomes available. **A high-level view of supported features can be found [here](./features-matrix).** - - -HarperDB adheres to the concept of schemas & tables. This allows developers to isolate table structures from each other all within one database. \ No newline at end of file +HarperDB adheres to the concept of schemas & tables. This allows developers to isolate table structures from each other all within one database. diff --git a/site/versioned_docs/version-4.1/sql-guide/insert.md b/site/versioned_docs/version-4.1/sql-guide/insert.md index a929fe7a..56ff1f3e 100644 --- a/site/versioned_docs/version-4.1/sql-guide/insert.md +++ b/site/versioned_docs/version-4.1/sql-guide/insert.md @@ -4,11 +4,9 @@ title: Insert # Insert -HarperDB supports inserting 1 to n records into a table. The primary key must be unique (not used by any other record). If no primary key is provided, it will be assigned an auto-generated UUID. HarperDB does not support selecting from one table to insert into another at this time. - - +HarperDB supports inserting 1 to n records into a table. The primary key must be unique (not used by any other record). If no primary key is provided, it will be assigned an auto-generated UUID. HarperDB does not support selecting from one table to insert into another at this time. ``` INSERT INTO dev.dog (id, dog_name, age, breed_id) VALUES(1, 'Penny', 5, 347), (2, 'Kato', 4, 347) -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.1/sql-guide/joins.md b/site/versioned_docs/version-4.1/sql-guide/joins.md index 8e820a82..e274e048 100644 --- a/site/versioned_docs/version-4.1/sql-guide/joins.md +++ b/site/versioned_docs/version-4.1/sql-guide/joins.md @@ -4,17 +4,14 @@ title: Joins # Joins -HarperDB allows developers to join any number of tables and currently supports the following join types: - -* INNER JOIN LEFT -* INNER JOIN LEFT -* OUTER JOIN +HarperDB allows developers to join any number of tables and currently supports the following join types: +- INNER JOIN LEFT +- INNER JOIN LEFT +- OUTER JOIN Here’s a basic example joining two tables from our Get Started example- joining a dogs table with a breeds table: - - ``` SELECT d.id, d.dog_name, d.owner_name, b.name, b.section FROM dev.dog AS d diff --git a/site/versioned_docs/version-4.1/sql-guide/json-search.md b/site/versioned_docs/version-4.1/sql-guide/json-search.md index 3a187db1..6e9e4415 100644 --- a/site/versioned_docs/version-4.1/sql-guide/json-search.md +++ b/site/versioned_docs/version-4.1/sql-guide/json-search.md @@ -8,28 +8,29 @@ HarperDB automatically indexes all top level attributes in a row / object writte ## Syntax -SEARCH_JSON(*expression, attribute*) - - +SEARCH_JSON(_expression, attribute_) Executes the supplied string _expression_ against data of the defined top level _attribute_ for each row. The expression both filters and defines output from the JSON document. + ### Example 1 + #### Search a string array Here are two records in the database: ```json [ - { - "id": 1, - "name": ["Harper", "Penny"] - }, - { - "id": 2, - "name": ["Penny"] - } + { + "id": 1, + "name": ["Harper", "Penny"] + }, + { + "id": 2, + "name": ["Penny"] + } ] ``` + Here is a simple query that gets any record with "Harper" found in the name. ``` @@ -39,9 +40,8 @@ WHERE search_json('"Harper" in *', name) ``` ### Example 2 -The purpose of this query is to give us every movie where at least two of our favorite actors from Marvel films have acted together. The results will return the movie title, the overview, release date and an object array of the actor’s name and their character name in the movie. - +The purpose of this query is to give us every movie where at least two of our favorite actors from Marvel films have acted together. The results will return the movie title, the overview, release date and an object array of the actor’s name and their character name in the movie. Both function calls evaluate the credits.cast attribute, this attribute is an object array of every cast member in a movie. @@ -55,39 +55,41 @@ FROM movies.credits c ON c.movie_id = m.id WHERE SEARCH_JSON($count($[name in ["Robert Downey Jr.", "Chris Evans", "Scarlett Johansson", "Mark Ruffalo", "Chris Hemsworth", "Jeremy Renner", "Clark Gregg", "Samuel L. Jackson", "Gwyneth Paltrow", "Don Cheadle"]]), c.`cast`) >= 2 ``` + A sample of this data from the movie The Avengers looks like ```json [ - { - "cast_id": 46, - "character": "Tony Stark / Iron Man", - "credit_id": "52fe4495c3a368484e02b251", - "gender": "male", - "id": 3223, - "name": "Robert Downey Jr.", - "order": 0 - }, - { - "cast_id": 2, - "character": "Steve Rogers / Captain America", - "credit_id": "52fe4495c3a368484e02b19b", - "gender": "male", - "id": 16828, - "name": "Chris Evans", - "order": 1 - }, - { - "cast_id": 307, - "character": "Bruce Banner / The Hulk", - "credit_id": "5e85e8083344c60015411cfa", - "gender": "male", - "id": 103, - "name": "Mark Ruffalo", - "order": 2 - } + { + "cast_id": 46, + "character": "Tony Stark / Iron Man", + "credit_id": "52fe4495c3a368484e02b251", + "gender": "male", + "id": 3223, + "name": "Robert Downey Jr.", + "order": 0 + }, + { + "cast_id": 2, + "character": "Steve Rogers / Captain America", + "credit_id": "52fe4495c3a368484e02b19b", + "gender": "male", + "id": 16828, + "name": "Chris Evans", + "order": 1 + }, + { + "cast_id": 307, + "character": "Bruce Banner / The Hulk", + "credit_id": "5e85e8083344c60015411cfa", + "gender": "male", + "id": 103, + "name": "Mark Ruffalo", + "order": 2 + } ] ``` + Let’s break down the SEARCH_JSON function call in the SELECT: ``` @@ -110,9 +112,8 @@ SEARCH_JSON( c.`cast` ) ``` -The first argument passed to SEARCH_JSON is the expression to execute against the second argument which is the cast attribute on the credits table. This expression will execute for every row. Looking into the expression it starts with “$[…]” this tells the expression to iterate all elements of the cast array. - +The first argument passed to SEARCH_JSON is the expression to execute against the second argument which is the cast attribute on the credits table. This expression will execute for every row. Looking into the expression it starts with “$[…]” this tells the expression to iterate all elements of the cast array. Then the expression tells the function to only return entries where the name attribute matches any of the actors defined in the array: @@ -120,34 +121,29 @@ Then the expression tells the function to only return entries where the name att name in ["Robert Downey Jr.", "Chris Evans", "Scarlett Johansson", "Mark Ruffalo", "Chris Hemsworth", "Jeremy Renner", "Clark Gregg", "Samuel L. Jackson", "Gwyneth Paltrow", "Don Cheadle"] ``` - So far, we’ve iterated the array and filtered out rows, but we also want the results formatted in a specific way, so we’ve chained an expression on our filter with: `{“actor”: name, “character”: character}`. This tells the function to create a specific object for each matching entry. - - ##### Sample Result ```json [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - } + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + } ] ``` Just having the SEARCH_JSON function in our SELECT is powerful, but given our criteria it would still return every other movie that doesn’t have our matching actors, in order to filter out the movies we do not want we also use SEARCH_JSON in the WHERE clause. - - This function call in the WHERE clause is similar, but we don’t need to perform the same transformation as occurred in the SELECT: ``` @@ -172,8 +168,6 @@ SEARCH_JSON( As seen above we execute the same name filter against the cast array, the primary difference is we are wrapping the filtered results in $count(…). As it looks this returns a count of the results back which we then use against our SQL comparator of >= 2. - - To see further SEARCH_JSON examples in action view our Postman Collection that provides a sample schema & data with query examples: [https://api.harperdb.io/](https://api.harperdb.io/) To learn more about how to build expressions check out the JSONata documentation: [https://docs.jsonata.org/overview](https://docs.jsonata.org/overview) diff --git a/site/versioned_docs/version-4.1/sql-guide/reserved-word.md b/site/versioned_docs/version-4.1/sql-guide/reserved-word.md index bcefa00a..7add41ff 100644 --- a/site/versioned_docs/version-4.1/sql-guide/reserved-word.md +++ b/site/versioned_docs/version-4.1/sql-guide/reserved-word.md @@ -4,7 +4,7 @@ title: HarperDB SQL Reserved Words # HarperDB SQL Reserved Words -This is a list of reserved words in the SQL Parser. Use of these words or symbols may result in unexpected behavior or inaccessible tables/attributes. If any of these words must be used, any SQL call referencing a schema, table, or attribute must have backticks (`…`) or brackets ([…]) around the variable. +This is a list of reserved words in the SQL Parser. Use of these words or symbols may result in unexpected behavior or inaccessible tables/attributes. If any of these words must be used, any SQL call referencing a schema, table, or attribute must have backticks (`…`) or brackets ([…]) around the variable. For Example, for a table called ASSERT in the dev schema, a SQL select on that table would look like: @@ -20,184 +20,184 @@ SELECT * from dev.[ASSERT] ### RESERVED WORD LIST -* ABSOLUTE -* ACTION -* ADD -* AGGR -* ALL -* ALTER -* AND -* ANTI -* ANY -* APPLY -* ARRAY -* AS -* ASSERT -* ASC -* ATTACH -* AUTOINCREMENT -* AUTO_INCREMENT -* AVG -* BEGIN -* BETWEEN -* BREAK -* BY -* CALL -* CASE -* CAST -* CHECK -* CLASS -* CLOSE -* COLLATE -* COLUMN -* COLUMNS -* COMMIT -* CONSTRAINT -* CONTENT -* CONTINUE -* CONVERT -* CORRESPONDING -* COUNT -* CREATE -* CROSS -* CUBE -* CURRENT_TIMESTAMP -* CURSOR -* DATABASE -* DECLARE -* DEFAULT -* DELETE -* DELETED -* DESC -* DETACH -* DISTINCT -* DOUBLEPRECISION -* DROP -* ECHO -* EDGE -* END -* ENUM -* ELSE -* EXCEPT -* EXISTS -* EXPLAIN -* FALSE -* FETCH -* FIRST -* FOREIGN -* FROM -* GO -* GRAPH -* GROUP -* GROUPING -* HAVING -* HDB_HASH -* HELP -* IF -* IDENTITY -* IS -* IN -* INDEX -* INNER -* INSERT -* INSERTED -* INTERSECT -* INTO -* JOIN -* KEY -* LAST -* LET -* LEFT -* LIKE -* LIMIT -* LOOP -* MATCHED -* MATRIX -* MAX -* MERGE -* MIN -* MINUS -* MODIFY -* NATURAL -* NEXT -* NEW -* NOCASE -* NO -* NOT -* NULL -* OFF -* ON -* ONLY -* OFFSET -* OPEN -* OPTION -* OR -* ORDER -* OUTER -* OVER -* PATH -* PARTITION -* PERCENT -* PLAN -* PRIMARY -* PRINT -* PRIOR -* QUERY -* READ -* RECORDSET -* REDUCE -* REFERENCES -* RELATIVE -* REPLACE -* REMOVE -* RENAME -* REQUIRE -* RESTORE -* RETURN -* RETURNS -* RIGHT -* ROLLBACK -* ROLLUP -* ROW -* SCHEMA -* SCHEMAS -* SEARCH -* SELECT -* SEMI -* SET -* SETS -* SHOW -* SOME -* SOURCE -* STRATEGY -* STORE -* SYSTEM -* SUM -* TABLE -* TABLES -* TARGET -* TEMP -* TEMPORARY -* TEXTSTRING -* THEN -* TIMEOUT -* TO -* TOP -* TRAN -* TRANSACTION -* TRIGGER -* TRUE -* TRUNCATE -* UNION -* UNIQUE -* UPDATE -* USE -* USING -* VALUE -* VERTEX -* VIEW -* WHEN -* WHERE -* WHILE -* WITH -* WORK +- ABSOLUTE +- ACTION +- ADD +- AGGR +- ALL +- ALTER +- AND +- ANTI +- ANY +- APPLY +- ARRAY +- AS +- ASSERT +- ASC +- ATTACH +- AUTOINCREMENT +- AUTO_INCREMENT +- AVG +- BEGIN +- BETWEEN +- BREAK +- BY +- CALL +- CASE +- CAST +- CHECK +- CLASS +- CLOSE +- COLLATE +- COLUMN +- COLUMNS +- COMMIT +- CONSTRAINT +- CONTENT +- CONTINUE +- CONVERT +- CORRESPONDING +- COUNT +- CREATE +- CROSS +- CUBE +- CURRENT_TIMESTAMP +- CURSOR +- DATABASE +- DECLARE +- DEFAULT +- DELETE +- DELETED +- DESC +- DETACH +- DISTINCT +- DOUBLEPRECISION +- DROP +- ECHO +- EDGE +- END +- ENUM +- ELSE +- EXCEPT +- EXISTS +- EXPLAIN +- FALSE +- FETCH +- FIRST +- FOREIGN +- FROM +- GO +- GRAPH +- GROUP +- GROUPING +- HAVING +- HDB_HASH +- HELP +- IF +- IDENTITY +- IS +- IN +- INDEX +- INNER +- INSERT +- INSERTED +- INTERSECT +- INTO +- JOIN +- KEY +- LAST +- LET +- LEFT +- LIKE +- LIMIT +- LOOP +- MATCHED +- MATRIX +- MAX +- MERGE +- MIN +- MINUS +- MODIFY +- NATURAL +- NEXT +- NEW +- NOCASE +- NO +- NOT +- NULL +- OFF +- ON +- ONLY +- OFFSET +- OPEN +- OPTION +- OR +- ORDER +- OUTER +- OVER +- PATH +- PARTITION +- PERCENT +- PLAN +- PRIMARY +- PRINT +- PRIOR +- QUERY +- READ +- RECORDSET +- REDUCE +- REFERENCES +- RELATIVE +- REPLACE +- REMOVE +- RENAME +- REQUIRE +- RESTORE +- RETURN +- RETURNS +- RIGHT +- ROLLBACK +- ROLLUP +- ROW +- SCHEMA +- SCHEMAS +- SEARCH +- SELECT +- SEMI +- SET +- SETS +- SHOW +- SOME +- SOURCE +- STRATEGY +- STORE +- SYSTEM +- SUM +- TABLE +- TABLES +- TARGET +- TEMP +- TEMPORARY +- TEXTSTRING +- THEN +- TIMEOUT +- TO +- TOP +- TRAN +- TRANSACTION +- TRIGGER +- TRUE +- TRUNCATE +- UNION +- UNIQUE +- UPDATE +- USE +- USING +- VALUE +- VERTEX +- VIEW +- WHEN +- WHERE +- WHILE +- WITH +- WORK diff --git a/site/versioned_docs/version-4.1/sql-guide/select.md b/site/versioned_docs/version-4.1/sql-guide/select.md index e2896029..353f005a 100644 --- a/site/versioned_docs/version-4.1/sql-guide/select.md +++ b/site/versioned_docs/version-4.1/sql-guide/select.md @@ -6,22 +6,24 @@ title: Select HarperDB has robust SELECT support, from simple queries all the way to complex joins with multi-conditions, aggregates, grouping & ordering. - - All results are returned as JSON object arrays. - - Query for all records and attributes in the dev.dog table: + ``` SELECT * FROM dev.dog ``` + Query specific columns from all rows in the dev.dog table: + ``` SELECT id, dog_name, age FROM dev.dog ``` + Query for all records and attributes in the dev.dog table ORDERED BY age in ASC order: + ``` SELECT * FROM dev.dog ORDER BY age ``` -*The ORDER BY keyword sorts in ascending order by default. To sort in descending order, use the DESC keyword. + +\*The ORDER BY keyword sorts in ascending order by default. To sort in descending order, use the DESC keyword. diff --git a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geoarea.md b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geoarea.md index d95a0237..0cb3824f 100644 --- a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geoarea.md +++ b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geoarea.md @@ -7,14 +7,17 @@ title: geoArea The geoArea() function returns the area of one or more features in square meters. ### Syntax + geoArea(_geoJSON_) ### Parameters + | Parameter | Description | -|-----------|---------------------------------| +| --------- | ------------------------------- | | geoJSON | Required. One or more features. | #### Example 1 + Calculate the area, in square meters, of a manually passed GeoJSON polygon. ``` @@ -33,9 +36,10 @@ SELECT geoArea('{ ``` #### Example 2 + Find all records that have an area less than 1 square mile (or 2589988 square meters). ``` SELECT * FROM dev.locations WHERE geoArea(geo_data) < 2589988 -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geocontains.md b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geocontains.md index 8a562e13..778d9f0f 100644 --- a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geocontains.md +++ b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geocontains.md @@ -3,18 +3,22 @@ title: geoContains --- # geoContains + Determines if geo2 is completely contained by geo1. Returns a Boolean. ## Syntax + geoContains(_geo1, geo2_) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------| -| geo1 | Required. Polygon or MultiPolygon GeoJSON feature. | -| geo2 | Required. Polygon or MultiPolygon GeoJSON feature tested to be contained by geo1. | + +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------- | +| geo1 | Required. Polygon or MultiPolygon GeoJSON feature. | +| geo2 | Required. Polygon or MultiPolygon GeoJSON feature tested to be contained by geo1. | ### Example 1 + Return all locations within the state of Colorado (passed as a GeoJSON string). ``` @@ -39,6 +43,7 @@ WHERE geoContains('{ ``` ### Example 2 + Return all locations which contain HarperDB Headquarters. ``` @@ -62,4 +67,4 @@ WHERE geoContains(geo_data, '{ ]] } }') -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geoconvert.md b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geoconvert.md index 44dba079..6e22fdda 100644 --- a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geoconvert.md +++ b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geoconvert.md @@ -7,16 +7,19 @@ title: geoConvert Converts a series of coordinates into a GeoJSON of the specified type. ## Syntax + geoConvert(_coordinates, geo_type_[, _properties_]) ## Parameters -| Parameter | Description | -|--------------|------------------------------------------------------------------------------------------------------------------------------------| -| coordinates | Required. One or more coordinates | -| geo_type | Required. GeoJSON geometry type. Options are ‘point’, ‘lineString’, ‘multiLineString’, ‘multiPoint’, ‘multiPolygon’, and ‘polygon’ | -| properties | Optional. Escaped JSON array with properties to be added to the GeoJSON output. | + +| Parameter | Description | +| ----------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| coordinates | Required. One or more coordinates | +| geo_type | Required. GeoJSON geometry type. Options are ‘point’, ‘lineString’, ‘multiLineString’, ‘multiPoint’, ‘multiPolygon’, and ‘polygon’ | +| properties | Optional. Escaped JSON array with properties to be added to the GeoJSON output. | ### Example + Convert a given coordinate into a GeoJSON point with specified properties. ``` @@ -27,4 +30,4 @@ SELECT geoConvert( "name": "HarperDB Headquarters" }' ) -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geocrosses.md b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geocrosses.md index dea03037..1ab1f2b3 100644 --- a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geocrosses.md +++ b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geocrosses.md @@ -3,18 +3,22 @@ title: geoCrosses --- # geoCrosses + Determines if the geometries cross over each other. Returns boolean. ## Syntax + geoCrosses(_geo1, geo2_) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------| -| geo1 | Required. GeoJSON geometry or feature. | -| geo2 | Required. GeoJSON geometry or feature. | + +| Parameter | Description | +| --------- | -------------------------------------- | +| geo1 | Required. GeoJSON geometry or feature. | +| geo2 | Required. GeoJSON geometry or feature. | ### Example + Find all locations that cross over a highway. ``` @@ -41,4 +45,4 @@ WHERE geoCrosses( } }' ) -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geodifference.md b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geodifference.md index 652dbc1a..c8a02afc 100644 --- a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geodifference.md +++ b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geodifference.md @@ -3,18 +3,22 @@ title: geoDifference --- # geoDifference + Returns a new polygon with the difference of the second polygon clipped from the first polygon. ## Syntax + geoDifference(_polygon1, polygon2_) ## Parameters -| Parameter | Description | -|------------|----------------------------------------------------------------------------| -| polygon1 | Required. Polygon or MultiPolygon GeoJSON feature. | -| polygon2 | Required. Polygon or MultiPolygon GeoJSON feature to remove from polygon1. | + +| Parameter | Description | +| --------- | -------------------------------------------------------------------------- | +| polygon1 | Required. Polygon or MultiPolygon GeoJSON feature. | +| polygon2 | Required. Polygon or MultiPolygon GeoJSON feature to remove from polygon1. | ### Example + Return a GeoJSON Polygon that removes City Park (_polygon2_) from Colorado (_polygon1_). ``` diff --git a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geodistance.md b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geodistance.md index ab7c9a53..a2515eb9 100644 --- a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geodistance.md +++ b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geodistance.md @@ -6,16 +6,19 @@ title: Geodistance Calculates the distance between two points in units (default is kilometers). ## Syntax + geoDistance(_point1, point2_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| point1 | Required. GeoJSON Point specifying the origin. | -| point2 | Required. GeoJSON Point specifying the destination. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | + +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| point1 | Required. GeoJSON Point specifying the origin. | +| point2 | Required. GeoJSON Point specifying the destination. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 + Calculate the distance, in miles, between HarperDB’s headquarters and the Washington Monument. ``` @@ -23,6 +26,7 @@ SELECT geoDistance('[-104.979127,39.761563]', '[-77.035248,38.889475]', 'miles') ``` ### Example 2 + Find all locations that are within 40 kilometers of a given point, return that distance in miles, and sort by distance in an ascending order. ``` @@ -30,4 +34,4 @@ SELECT *, geoDistance('[-104.979127,39.761563]', geo_data, 'miles') as distance FROM dev.locations WHERE geoDistance('[-104.979127,39.761563]', geo_data, 'kilometers') < 40 ORDER BY distance ASC -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geoequal.md b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geoequal.md index 01d93f62..87ce3d5a 100644 --- a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geoequal.md +++ b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geoequal.md @@ -3,18 +3,22 @@ title: geoEqual --- # geoEqual + Determines if two GeoJSON features are the same type and have identical X,Y coordinate values. For more information see [https://developers.arcgis.com/documentation/spatial-references/](https://developers.arcgis.com/documentation/spatial-references/). Returns a Boolean. ## Syntax + geoEqual(_geo1_, _geo2_) ## Parameters -| Parameter | Description | -|------------|----------------------------------------| -| geo1 | Required. GeoJSON geometry or feature. | -| geo2 | Required. GeoJSON geometry or feature. | + +| Parameter | Description | +| --------- | -------------------------------------- | +| geo1 | Required. GeoJSON geometry or feature. | +| geo2 | Required. GeoJSON geometry or feature. | ### Example + Find HarperDB Headquarters within all locations within the database. ``` @@ -38,4 +42,4 @@ WHERE geoEqual(geo_data, '{ ]] } }') -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geolength.md b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geolength.md index 6b00cadd..836274ab 100644 --- a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geolength.md +++ b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geolength.md @@ -3,18 +3,22 @@ title: geoLength --- # geoLength + Takes a GeoJSON and measures its length in the specified units (default is kilometers). ## Syntax + geoLength(_geoJSON_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| geoJSON | Required. GeoJSON to measure. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | + +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| geoJSON | Required. GeoJSON to measure. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 + Calculate the length, in kilometers, of a manually passed GeoJSON linestring. ``` @@ -32,6 +36,7 @@ SELECT geoLength('{ ``` ### Example 2 + Find all data plus the calculated length in miles of the GeoJSON, restrict the response to only lengths less than 5 miles, and return the data in order of lengths smallest to largest. ``` diff --git a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geonear.md b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geonear.md index 32028ed4..3dca7590 100644 --- a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geonear.md +++ b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/geonear.md @@ -3,20 +3,24 @@ title: geoNear --- # geoNear + Determines if point1 and point2 are within a specified distance from each other, default units are kilometers. Returns a Boolean. ## Syntax + geoNear(_point1, point2, distance_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| point1 | Required. GeoJSON Point specifying the origin. | -| point2 | Required. GeoJSON Point specifying the destination. | -| distance | Required. The maximum distance in units as an integer or decimal. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | + +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| point1 | Required. GeoJSON Point specifying the origin. | +| point2 | Required. GeoJSON Point specifying the destination. | +| distance | Required. The maximum distance in units as an integer or decimal. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 + Return all locations within 50 miles of a given point. ``` @@ -26,6 +30,7 @@ WHERE geoNear('[-104.979127,39.761563]', geo_data, 50, 'miles') ``` ### Example 2 + Return all locations within 2 degrees of the earth of a given point. (Each degree lat/long is about 69 miles [111 kilometers]). Return all data and the distance in miles, sorted by ascending distance. ``` @@ -33,4 +38,4 @@ SELECT *, geoDistance('[-104.979127,39.761563]', geo_data, 'miles') as distance FROM dev.locations WHERE geoNear('[-104.979127,39.761563]', geo_data, 2, 'degrees') ORDER BY distance ASC -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/index.md b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/index.md index ce656c0f..4f70f117 100644 --- a/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/index.md +++ b/site/versioned_docs/version-4.1/sql-guide/sql-geospatial-functions/index.md @@ -6,15 +6,10 @@ title: SQL Geospatial Functions HarperDB geospatial features require data to be stored in a single column using the [GeoJSON standard](https://geojson.org/), a standard commonly used in geospatial technologies. Geospatial functions are available to be used in SQL statements. - - If you are new to GeoJSON you should check out the full specification here: [https://geojson.org/](https://geojson.org/). There are a few important things to point out before getting started. - - -1) All GeoJSON coordinates are stored in `[longitude, latitude]` format. -2) Coordinates or GeoJSON geometries must be passed as string when written directly in a SQL statement. -3) Note if you are using Postman for you testing. Due to limitations in the Postman client, you will need to escape quotes in your strings and your SQL will need to be passed on a single line. - +1. All GeoJSON coordinates are stored in `[longitude, latitude]` format. +2. Coordinates or GeoJSON geometries must be passed as string when written directly in a SQL statement. +3. Note if you are using Postman for you testing. Due to limitations in the Postman client, you will need to escape quotes in your strings and your SQL will need to be passed on a single line. In the examples contained in the left-hand navigation, schema and table names may change, but all GeoJSON data will be stored in a column named geo_data. diff --git a/site/versioned_docs/version-4.1/sql-guide/update.md b/site/versioned_docs/version-4.1/sql-guide/update.md index a3c838e8..054a0ead 100644 --- a/site/versioned_docs/version-4.1/sql-guide/update.md +++ b/site/versioned_docs/version-4.1/sql-guide/update.md @@ -6,8 +6,6 @@ title: Update HarperDB supports updating existing table row(s) via UPDATE statements. Multiple conditions can be applied to filter the row(s) to update. At this time selecting from one table to update another is not supported. - - ``` UPDATE dev.dog SET owner_name = 'Kyle' diff --git a/site/versioned_docs/version-4.1/support.md b/site/versioned_docs/version-4.1/support.md index c30c3983..47b47a01 100644 --- a/site/versioned_docs/version-4.1/support.md +++ b/site/versioned_docs/version-4.1/support.md @@ -4,12 +4,12 @@ title: Support # Support -HarperDB support is available with all paid instances. Support tickets are managed via our [Zendesk portal](https://harperdbhelp.zendesk.com/hc/en-us/requests/new). Once a ticket is submitted the HarperDB team will triage your request and get back to you as soon as possible. Additionally, you can join our [Slack community](https://harperdbcommunity.slack.com/join/shared\_invite/zt-e8w6u1pu-2UFAXl\_f4ZHo7F7DVkHIDA#/) where HarperDB team members and others in the community are frequently active to help answer questions. +HarperDB support is available with all paid instances. Support tickets are managed via our [Zendesk portal](https://harperdbhelp.zendesk.com/hc/en-us/requests/new). Once a ticket is submitted the HarperDB team will triage your request and get back to you as soon as possible. Additionally, you can join our [Slack community](https://harperdbcommunity.slack.com/join/shared_invite/zt-e8w6u1pu-2UFAXl_f4ZHo7F7DVkHIDA#/) where HarperDB team members and others in the community are frequently active to help answer questions. -* [Submit a Support Ticket](https://harperdbhelp.zendesk.com/hc/en-us/requests/new) -* [Join Our Slack Community](https://harperdbcommunity.slack.com/join/shared\_invite/zt-e8w6u1pu-2UFAXl\_f4ZHo7F7DVkHIDA#/) +- [Submit a Support Ticket](https://harperdbhelp.zendesk.com/hc/en-us/requests/new) +- [Join Our Slack Community](https://harperdbcommunity.slack.com/join/shared_invite/zt-e8w6u1pu-2UFAXl_f4ZHo7F7DVkHIDA#/) -*** +--- ### Common Issues @@ -23,9 +23,9 @@ HarperDB should be installed using a specific user for HarperDB. This allows you **Error: Must execute as User** -You may have gotten an error like, `Error: Must execute as <>.` This means that you installed HarperDB as `<>`. Because HarperDB stores files directly to the file system, we only allow the HarperDB executable to be run by a single user. This prevents permissions issues on files. For example if you installed as user\_a, but later wanted to run as user\_b. User\_b may not have access to the database files HarperDB needs. This also keeps HarperDB more secure as it allows you to lock files down to a specific user and prevents other users from accessing your files. +You may have gotten an error like, `Error: Must execute as <>.` This means that you installed HarperDB as `<>`. Because HarperDB stores files directly to the file system, we only allow the HarperDB executable to be run by a single user. This prevents permissions issues on files. For example if you installed as user_a, but later wanted to run as user_b. User_b may not have access to the database files HarperDB needs. This also keeps HarperDB more secure as it allows you to lock files down to a specific user and prevents other users from accessing your files. -*** +--- ### Frequently Asked Questions (FAQs) @@ -65,7 +65,7 @@ When using HarperDB, primary keys are case-sensitive. This can cause confusion f HarperDB’s data directory can be moved from one location to another by simply updating the `rootPath` in the config file (where the data lives, which you specified during installation) to a new location. -Next, edit HarperDB’s hdb\_boot\_properties.file to point HarperDB to the new location by updating the settings\_path variable. Substitute the NEW\_HDB\_ROOT variable in the snippets below with the new path to your new data directory, making sure you escape any slashes. +Next, edit HarperDB’s hdb_boot_properties.file to point HarperDB to the new location by updating the settings_path variable. Substitute the NEW_HDB_ROOT variable in the snippets below with the new path to your new data directory, making sure you escape any slashes. On MacOS/OSX @@ -81,4 +81,4 @@ sed -i -E 's/^(settings_path[[:blank:]]*=[[:blank:]]*).*/\1NEW_HDB_ROOT\/harperd Finally, edit the config file in the root folder you just moved: -* Edit the `rootPath` parameter to reflect the new location of your data directory. +- Edit the `rootPath` parameter to reflect the new location of your data directory. diff --git a/site/versioned_docs/version-4.1/transaction-logging.md b/site/versioned_docs/version-4.1/transaction-logging.md index 06c6cb38..2f4ee9d6 100644 --- a/site/versioned_docs/version-4.1/transaction-logging.md +++ b/site/versioned_docs/version-4.1/transaction-logging.md @@ -12,7 +12,6 @@ The first option is `read_transaction_log`. The transaction log is built upon cl If you would like to use the transaction log, but have not set up clustering yet, please see ["How to Cluster"](./clustering/). - ## Transaction Log Operations ### read_transaction_log @@ -21,12 +20,12 @@ The `read_transaction_log` operation returns a prescribed set of records, based ```json { - "operation": "read_transaction_log", - "schema": "dev", - "table": "dog", - "from": 1598290235769, - "to": 1660249020865, - "limit": 2 + "operation": "read_transaction_log", + "schema": "dev", + "table": "dog", + "from": 1598290235769, + "to": 1660249020865, + "limit": 2 } ``` @@ -34,38 +33,37 @@ _See example response below._ ### read_transaction_log Response - ```json [ - { - "operation": "insert", - "user": "admin", - "timestamp": 1660165619736, - "records": [ - { - "id": 1, - "dog_name": "Penny", - "owner_name": "Kyle", - "breed_id": 154, - "age": 7, - "weight_lbs": 38, - "__updatedtime__": 1660165619688, - "__createdtime__": 1660165619688 - } - ] - }, - { - "operation": "update", - "user": "admin", - "timestamp": 1660165620040, - "records": [ - { - "id": 1, - "dog_name": "Penny B", - "__updatedtime__": 1660165620036 - } - ] - } + { + "operation": "insert", + "user": "admin", + "timestamp": 1660165619736, + "records": [ + { + "id": 1, + "dog_name": "Penny", + "owner_name": "Kyle", + "breed_id": 154, + "age": 7, + "weight_lbs": 38, + "__updatedtime__": 1660165619688, + "__createdtime__": 1660165619688 + } + ] + }, + { + "operation": "update", + "user": "admin", + "timestamp": 1660165620040, + "records": [ + { + "id": 1, + "dog_name": "Penny B", + "__updatedtime__": 1660165620036 + } + ] + } ] ``` @@ -77,13 +75,13 @@ The `delete_transaction_logs_before` operation will delete transaction log data ```json { - "operation": "delete_transaction_logs_before", - "schema": "dev", - "table": "dog", - "timestamp": 1598290282817 + "operation": "delete_transaction_logs_before", + "schema": "dev", + "table": "dog", + "timestamp": 1598290282817 } ``` _Note: Streams are used for catchup if a node goes down. If you delete messages from a stream there is a chance catchup won't work._ -Read on for `read_audit_log`, the second option, for logging transactions executed against a table. \ No newline at end of file +Read on for `read_audit_log`, the second option, for logging transactions executed against a table. diff --git a/site/versioned_docs/version-4.1/upgrade-hdb-instance.md b/site/versioned_docs/version-4.1/upgrade-hdb-instance.md index 87e33305..91808fa0 100644 --- a/site/versioned_docs/version-4.1/upgrade-hdb-instance.md +++ b/site/versioned_docs/version-4.1/upgrade-hdb-instance.md @@ -12,10 +12,11 @@ Upgrading HarperDB is a two-step process. First the latest version of HarperDB m 1. Install the latest version of HarperDB using `npm install -g harperdb`. - Note `-g` should only be used if you installed HarperDB globally (which is recommended). + Note `-g` should only be used if you installed HarperDB globally (which is recommended). + 1. Run `harperdb` to initiate the upgrade process. - HarperDB will then prompt you for all appropriate inputs and then run the upgrade directives. + HarperDB will then prompt you for all appropriate inputs and then run the upgrade directives. ## Node Version Manager (nvm) diff --git a/site/versioned_docs/version-4.2/administration/_category_.json b/site/versioned_docs/version-4.2/administration/_category_.json index 828e0998..59c33ea4 100644 --- a/site/versioned_docs/version-4.2/administration/_category_.json +++ b/site/versioned_docs/version-4.2/administration/_category_.json @@ -1,12 +1,10 @@ { - "label": "Administration", - "position": 2, - "link": { - "type": "generated-index", - "title": "Administration Documentation", - "description": "Guides for managing and administering HarperDB instances", - "keywords": [ - "administration" - ] - } -} \ No newline at end of file + "label": "Administration", + "position": 2, + "link": { + "type": "generated-index", + "title": "Administration Documentation", + "description": "Guides for managing and administering HarperDB instances", + "keywords": ["administration"] + } +} diff --git a/site/versioned_docs/version-4.2/administration/administration.md b/site/versioned_docs/version-4.2/administration/administration.md index 7478f12f..74dbec0f 100644 --- a/site/versioned_docs/version-4.2/administration/administration.md +++ b/site/versioned_docs/version-4.2/administration/administration.md @@ -10,9 +10,9 @@ HarperDB is designed for minimal administrative effort, and with managed service As a distributed database, data protection and recovery can benefit from different data protection strategies than a traditional single-server database. But multiple aspects of data protection and recovery should be considered: -* Availability: As a distributed database HarperDB is intrinsically built for high-availability and a cluster will continue to run even with complete server(s) failure. This is the first and primary defense for protecting against any downtime or data loss. HarperDB provides fast horizontal scaling functionality with node cloning, which facilitates ease of establishing high availability clusters. -* [Audit log](./logging/audit-logging): HarperDB defaults to tracking data changes so malicious data changes can be found, attributed, and reverted. This provides security-level defense against data loss, allowing for fine-grained isolation and reversion of individual data without the large-scale reversion/loss of data associated with point-in-time recovery approaches. -* Snapshots: When used as a source-of-truth database for crucial data, we recommend using snapshot tools to regularly snapshot databases as a final backup/defense against data loss (this should only be used as a last resort in recovery). HarperDB has a [`get_backup`](../developers/operations-api/databases-and-tables#get-backup) operation, which provides direct support for making and retrieving database snapshots. An HTTP request can be used to get a snapshot. Alternatively, volume snapshot tools can be used to snapshot data at the OS/VM level. HarperDB can also provide scripts for replaying transaction logs from snapshots to facilitate point-in-time recovery when necessary (often customization may be preferred in certain recovery situations to minimize data loss). +- Availability: As a distributed database HarperDB is intrinsically built for high-availability and a cluster will continue to run even with complete server(s) failure. This is the first and primary defense for protecting against any downtime or data loss. HarperDB provides fast horizontal scaling functionality with node cloning, which facilitates ease of establishing high availability clusters. +- [Audit log](./logging/audit-logging): HarperDB defaults to tracking data changes so malicious data changes can be found, attributed, and reverted. This provides security-level defense against data loss, allowing for fine-grained isolation and reversion of individual data without the large-scale reversion/loss of data associated with point-in-time recovery approaches. +- Snapshots: When used as a source-of-truth database for crucial data, we recommend using snapshot tools to regularly snapshot databases as a final backup/defense against data loss (this should only be used as a last resort in recovery). HarperDB has a [`get_backup`](../developers/operations-api/databases-and-tables#get-backup) operation, which provides direct support for making and retrieving database snapshots. An HTTP request can be used to get a snapshot. Alternatively, volume snapshot tools can be used to snapshot data at the OS/VM level. HarperDB can also provide scripts for replaying transaction logs from snapshots to facilitate point-in-time recovery when necessary (often customization may be preferred in certain recovery situations to minimize data loss). ### Horizontal Scaling with Node Cloning diff --git a/site/versioned_docs/version-4.2/administration/cloning.md b/site/versioned_docs/version-4.2/administration/cloning.md index 4cc38a0a..2619cd7c 100644 --- a/site/versioned_docs/version-4.2/administration/cloning.md +++ b/site/versioned_docs/version-4.2/administration/cloning.md @@ -12,45 +12,48 @@ To run clone node either of the following variables must be set: #### Environment variables -* `HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). -* `HDB_LEADER_USERNAME` - The leader node admin username. -* `HDB_LEADER_PASSWORD` - The leader node admin password. -* `HDB_LEADER_CLUSTERING_HOST` - _(optional)_ The leader clustering host. This value will be added to the clustering routes on the clone node. If this value is not set, replication will not be setup between the leader and clone. +- `HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). +- `HDB_LEADER_USERNAME` - The leader node admin username. +- `HDB_LEADER_PASSWORD` - The leader node admin password. +- `HDB_LEADER_CLUSTERING_HOST` - _(optional)_ The leader clustering host. This value will be added to the clustering routes on the clone node. If this value is not set, replication will not be setup between the leader and clone. For example: + ``` HDB_LEADER_URL=https://node-1.my-domain.com:9925 HDB_LEADER_CLUSTERING_HOST=node-1.my-domain.com HDB_LEADER_USERNAME=... HDB_LEADER_PASSWORD=... harperdb ``` #### Command line variables -* `--HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). -* `--HDB_LEADER_USERNAME` - The leader node admin username. -* `--HDB_LEADER_PASSWORD` - The leader node admin password. -* `--HDB_LEADER_CLUSTERING_HOST` - _(optional)_ The leader clustering host. This value will be added to the clustering routes on the clone node. If this value is not set, replication will not be setup between the leader and clone. +- `--HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). +- `--HDB_LEADER_USERNAME` - The leader node admin username. +- `--HDB_LEADER_PASSWORD` - The leader node admin password. +- `--HDB_LEADER_CLUSTERING_HOST` - _(optional)_ The leader clustering host. This value will be added to the clustering routes on the clone node. If this value is not set, replication will not be setup between the leader and clone. For example: + ``` harperdb --HDB_LEADER_URL https://node-1.my-domain.com:9925 --HDB_LEADER_CLUSTERING_HOST node-1.my-domain.com --HDB_LEADER_USERNAME ... --HDB_LEADER_PASSWORD ... ``` -If an instance already exists in the location you are cloning to, clone node will not run. It will instead proceed with starting HarperDB. +If an instance already exists in the location you are cloning to, clone node will not run. It will instead proceed with starting HarperDB. This is unless you are cloning overtop (see below) of an existing instance. -Clone node does not require any additional configuration apart from the variables referenced above. -However, it can be configured through `clone-node-config.yaml`, which should be located in the `ROOTPATH` directory of your clone. +Clone node does not require any additional configuration apart from the variables referenced above. +However, it can be configured through `clone-node-config.yaml`, which should be located in the `ROOTPATH` directory of your clone. If no configuration is supplied, default values will be used. By default: -* The HarperDB Terms and Conditions will be accepted -* The Root path will be ``/hdb -* The Operations API port will be set to 9925 -* The admin and clustering username and password will be the same as the leader node -* A unique node name will be generated -* All tables will be cloned and have replication added, the subscriptions will be `publish: true` and `subscribe: true` -* The users and roles system tables will be cloned and have replication added both ways -* All components will be cloned -* All routes will be cloned + +- The HarperDB Terms and Conditions will be accepted +- The Root path will be ``/hdb +- The Operations API port will be set to 9925 +- The admin and clustering username and password will be the same as the leader node +- A unique node name will be generated +- All tables will be cloned and have replication added, the subscriptions will be `publish: true` and `subscribe: true` +- The users and roles system tables will be cloned and have replication added both ways +- All components will be cloned +- All routes will be cloned **Leader node** - the instance of HarperDB you are cloning.\ **Clone node** - the new node which will be a clone of the leader node. @@ -75,7 +78,7 @@ componentConfig: - name: my-cool-component ``` -`skipNodeModules` will not include the node\_modules directory when clone node is packaging components in `hdb/components`. +`skipNodeModules` will not include the node_modules directory when clone node is packaging components in `hdb/components`. `exclude` can be used to set any components that you do not want cloned. @@ -125,12 +128,12 @@ To create a clone over an existing install of HarperDB use the environment `HDB_ When run clone node will execute the following steps: -1. Clone any user defined tables and the hdb\_role and hdb\_user system tables. +1. Clone any user defined tables and the hdb_role and hdb_user system tables. 1. Install Harperdb overtop of the cloned tables. 1. Clone the configuration, this includes: - * Copy the clustering routes and clustering user. - * Copy component references. - * Using any provided clone config to populate new cloud node harperdb-config.yaml + - Copy the clustering routes and clustering user. + - Copy component references. + - Using any provided clone config to populate new cloud node harperdb-config.yaml 1. Clone any components in the `hdb/component` directory. 1. Start the cloned HarperDB Instance. 1. Cluster all cloned tables. @@ -144,7 +147,7 @@ If a database has custom pathing (no individual table pathing) it will be cloned To provide custom pathing for a database in the clone config follow this configuration: ```yaml -databases: +databases: : path: /Users/harper/hdb ``` diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/create-account.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/create-account.md index 3b0f9a56..c78c4ef3 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/create-account.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/create-account.md @@ -3,24 +3,25 @@ title: Create a Studio Account --- # Create a Studio Account + Start at the [HarperDB Studio sign up page](https://studio.harperdb.io/sign-up). -1) Provide the following information: - * First Name - * Last Name - * Email Address - * Subdomain - - *Part of the URL that will be used to identify your HarperDB Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com).* - * Coupon Code (optional) -2) Review the Privacy Policy and Terms of Service. -3) Click the sign up for free button. -4) You will be taken to a new screen to add an account password. Enter your password. - *Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character.* -5) Click the add account password button. +1. Provide the following information: + - First Name + - Last Name + - Email Address + - Subdomain -You will receive a Studio welcome email confirming your registration. + _Part of the URL that will be used to identify your HarperDB Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com)._ + - Coupon Code (optional) +2. Review the Privacy Policy and Terms of Service. +3. Click the sign up for free button. +4. You will be taken to a new screen to add an account password. Enter your password. + _Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character._ +5. Click the add account password button. + +You will receive a Studio welcome email confirming your registration. -Note: Your email address will be used as your username and cannot be changed. \ No newline at end of file +Note: Your email address will be used as your username and cannot be changed. diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/enable-mixed-content.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/enable-mixed-content.md index 7a3c8524..5a198b91 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/enable-mixed-content.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/enable-mixed-content.md @@ -6,6 +6,4 @@ title: Enable Mixed Content Enabling mixed content is required in cases where you would like to connect the HarperDB Studio to HarperDB Instances via HTTP. This should not be used for production systems, but may be convenient for development and testing purposes. Doing so will allow your browser to reach HTTP traffic, which is considered insecure, through an HTTPS site like the Studio. - - A comprehensive guide is provided by Adobe [here](https://experienceleague.adobe.com/docs/target/using/experiences/vec/troubleshoot-composer/mixed-content.html). diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/index.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/index.md index 78d1ebb4..d3cdbaeb 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/index.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/index.md @@ -3,13 +3,17 @@ title: HarperDB Studio --- # HarperDB Studio + HarperDB Studio is the web-based GUI for HarperDB. Studio enables you to administer, navigate, and monitor all of your HarperDB instances in a simple, user friendly interface without any knowledge of the underlying HarperDB API. It’s free to sign up, get started today! [Sign up for free!](https://studio.harperdb.io/sign-up) --- + ## How does Studio Work? + While HarperDB Studio is web based and hosted by us, all database interactions are performed on the HarperDB instance the studio is connected to. The HarperDB Studio loads in your browser, at which point you login to your HarperDB instances. Credentials are stored in your browser cache and are not transmitted back to HarperDB. All database interactions are made via the HarperDB Operations API directly from your browser to your instance. ## What type of instances can I manage? -HarperDB Studio enables users to manage both HarperDB Cloud instances and privately hosted instances all from a single UI. All HarperDB instances feature identical behavior whether they are hosted by us or by you. \ No newline at end of file + +HarperDB Studio enables users to manage both HarperDB Cloud instances and privately hosted instances all from a single UI. All HarperDB instances feature identical behavior whether they are hosted by us or by you. diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/instance-configuration.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/instance-configuration.md index 618daceb..64a802af 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/instance-configuration.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/instance-configuration.md @@ -6,69 +6,61 @@ title: Instance Configuration HarperDB instance configuration can be viewed and managed directly through the HarperDB Studio. HarperDB Cloud instances can be resized in two different ways via this page, either by modifying machine RAM or by increasing drive storage. User-installed instances can have their licenses modified by modifying licensed RAM. - - All instance configuration is handled through the **config** page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click config in the instance control bar. +4. Click config in the instance control bar. -*Note, the **config** page will only be available to super users and certain items are restricted to Studio organization owners.* +_Note, the **config** page will only be available to super users and certain items are restricted to Studio organization owners._ ## Instance Overview The **instance overview** panel displays the following instance specifications: -* Instance URL +- Instance URL -* Instance Node Name (for clustering) +- Instance Node Name (for clustering) -* Instance API Auth Header (this user) - - *The Basic authentication header used for the logged in HarperDB database user* +- Instance API Auth Header (this user) -* Created Date (HarperDB Cloud only) + _The Basic authentication header used for the logged in HarperDB database user_ -* Region (HarperDB Cloud only) - - *The geographic region where the instance is hosted.* +- Created Date (HarperDB Cloud only) -* Total Price +- Region (HarperDB Cloud only) -* RAM + _The geographic region where the instance is hosted._ -* Storage (HarperDB Cloud only) +- Total Price -* Disk IOPS (HarperDB Cloud only) +- RAM -## Update Instance RAM +- Storage (HarperDB Cloud only) -HarperDB Cloud instance size and user-installed instance licenses can be modified with the following instructions. This option is only available to Studio organization owners. +- Disk IOPS (HarperDB Cloud only) +## Update Instance RAM +HarperDB Cloud instance size and user-installed instance licenses can be modified with the following instructions. This option is only available to Studio organization owners. Note: For HarperDB Cloud instances, upgrading RAM may add additional CPUs to your instance as well. Click here to see how many CPUs are provisioned for each instance size. -1) In the **update ram** panel at the bottom left: +1. In the **update ram** panel at the bottom left: + - Select the new instance size. + - If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. + - If you do have a credit card associated, you will be presented with the updated billing information. + - Click **Upgrade**. - * Select the new instance size. - - * If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. - - * If you do have a credit card associated, you will be presented with the updated billing information. - - * Click **Upgrade**. - -2) The instance will shut down and begin reprovisioning/relicensing itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. +2. The instance will shut down and begin reprovisioning/relicensing itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. -3) Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. +3. Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. -*Note, if HarperDB Cloud instance reprovisioning takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new).* +_Note, if HarperDB Cloud instance reprovisioning takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new)._ ## Update Instance Storage @@ -76,44 +68,39 @@ The HarperDB Cloud instance storage size can be increased with the following ins Note: Instance storage can only be upgraded once every 6 hours. -1) In the **update storage** panel at the bottom left: - - * Select the new instance storage size. +1. In the **update storage** panel at the bottom left: + - Select the new instance storage size. - * If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. + - If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. - * If you do have a credit card associated, you will be presented with the updated billing information. + - If you do have a credit card associated, you will be presented with the updated billing information. - * Click **Upgrade**. + - Click **Upgrade**. -2) The instance will shut down and begin reprovisioning itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. +2. The instance will shut down and begin reprovisioning itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. -3) Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. +3. Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. -*Note, if this process takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new).* +_Note, if this process takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new)._ ## Remove Instance The HarperDB instance can be deleted/removed from the Studio with the following instructions. Once this operation is started it cannot be undone. This option is only available to Studio organization owners. -1) In the **remove instance** panel at the bottom left: - * Enter the instance name in the text box. - - * The Studio will present you with a warning. - - * Click **Remove**. - -2) The instance will begin deleting immediately. - +1. In the **remove instance** panel at the bottom left: + - Enter the instance name in the text box. + - The Studio will present you with a warning. + - Click **Remove**. + +2. The instance will begin deleting immediately. + ## Restart Instance The HarperDB Cloud instance can be restarted with the following instructions. -1) In the **restart instance** panel at the bottom right: - * Enter the instance name in the text box. - - * The Studio will present you with a warning. - - * Click **Restart**. - -2) The instance will begin restarting immediately. \ No newline at end of file +1. In the **restart instance** panel at the bottom right: + - Enter the instance name in the text box. + - The Studio will present you with a warning. + - Click **Restart**. + +2. The instance will begin restarting immediately. diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/instance-example-code.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/instance-example-code.md index 3869f4af..d5805510 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/instance-example-code.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/instance-example-code.md @@ -6,57 +6,55 @@ title: Instance Example Code Example code prepopulated with the instance URL and authorization token for the logged in database user can be found on the **example code** page of the HarperDB Studio. Code samples are generated based on the HarperDB API Documentation Postman collection. Code samples accessed with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **example code** in the instance control bar. +4. Click **example code** in the instance control bar. -5) Select the appropriate **category** from the left navigation. +5. Select the appropriate **category** from the left navigation. -6) Select the appropriate **operation** from the left navigation. +6. Select the appropriate **operation** from the left navigation. -7) Select your desired language/variant from the **Choose Programming Language** dropdown. +7. Select your desired language/variant from the **Choose Programming Language** dropdown. -8) Copy code from the sample code panel using the copy icon. +8. Copy code from the sample code panel using the copy icon. ## Supported Languages Sample code uses two identifiers: **language** and **variant**. -* **language** is the programming language that the sample code is generated in. +- **language** is the programming language that the sample code is generated in. -* **variant** is the methodology or library used by the language to send HarperDB requests. +- **variant** is the methodology or library used by the language to send HarperDB requests. The list of available language/variants are as follows: -| Language | Variant | -|--------------|---------------| -| C# | RestSharp | -| cURL | cURL | -| Go | Native | -| HTTP | HTTP | -| Java | OkHttp | -| Java | Unirest | -| JavaScript | Fetch | -| JavaScript | jQuery | -| JavaScript | XHR | -| NodeJs | Axios | -| NodeJs | Native | -| NodeJs | Request | -| NodeJs | Unirest | -| Objective-C | NSURLSession | -| OCaml | Cohttp | -| PHP | cURL | -| PHP | HTTP_Request2 | -| PowerShell | RestMethod | -| Python | http.client | -| Python | Requests | -| Ruby | Net:HTTP | -| Shell | Httpie | -| Shell | wget | -| Swift | URLSession | - - +| Language | Variant | +| ----------- | ------------- | +| C# | RestSharp | +| cURL | cURL | +| Go | Native | +| HTTP | HTTP | +| Java | OkHttp | +| Java | Unirest | +| JavaScript | Fetch | +| JavaScript | jQuery | +| JavaScript | XHR | +| NodeJs | Axios | +| NodeJs | Native | +| NodeJs | Request | +| NodeJs | Unirest | +| Objective-C | NSURLSession | +| OCaml | Cohttp | +| PHP | cURL | +| PHP | HTTP_Request2 | +| PowerShell | RestMethod | +| Python | http.client | +| Python | Requests | +| Ruby | Net:HTTP | +| Shell | Httpie | +| Shell | wget | +| Swift | URLSession | diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/instances.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/instances.md index da82e000..2e2c70b7 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/instances.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/instances.md @@ -6,9 +6,9 @@ title: Instances The HarperDB Studio allows you to administer all of your HarperDB instances in one place. HarperDB currently offers the following instance types: -* **HarperDB Cloud Instance** Managed installations of HarperDB, what we call [HarperDB Cloud](../../deployments/harperdb-cloud/). -* **5G Wavelength Instance** Managed installations of HarperDB running on the Verizon network through AWS Wavelength, what we call [5G Wavelength Instances](../../deployments/harperdb-cloud/verizon-5g-wavelength-instances). _Note, these instances are only accessible via the Verizon network._ -* **User-Installed Instance** Any HarperDB installation that is managed by you. These include instances hosted within your cloud provider accounts (for example, from the AWS or Digital Ocean Marketplaces), privately hosted instances, or instances installed locally. +- **HarperDB Cloud Instance** Managed installations of HarperDB, what we call [HarperDB Cloud](../../deployments/harperdb-cloud/). +- **5G Wavelength Instance** Managed installations of HarperDB running on the Verizon network through AWS Wavelength, what we call [5G Wavelength Instances](../../deployments/harperdb-cloud/verizon-5g-wavelength-instances). _Note, these instances are only accessible via the Verizon network._ +- **User-Installed Instance** Any HarperDB installation that is managed by you. These include instances hosted within your cloud provider accounts (for example, from the AWS or Digital Ocean Marketplaces), privately hosted instances, or instances installed locally. All interactions between the Studio and your instances take place directly from your browser. HarperDB stores metadata about your instances, which enables the Studio to display these instances when you log in. Beyond that, all traffic is routed from your browser to the HarperDB instances using the standard [HarperDB API](../../developers/operations-api/). @@ -26,61 +26,73 @@ A summary view of all instances within an organization can be viewed by clicking 1. Fill out Instance Info. 1. Enter Instance Name - _This will be used to build your instance URL. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com). The Instance URL will be previewed below._ + _This will be used to build your instance URL. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com). The Instance URL will be previewed below._ + 1. Enter Instance Username - _This is the username of the initial HarperDB instance super user._ + _This is the username of the initial HarperDB instance super user._ + 1. Enter Instance Password - _This is the password of the initial HarperDB instance super user._ + _This is the password of the initial HarperDB instance super user._ + 1. Click **Instance Details** to move to the next page. 1. Select Instance Specs 1. Select Instance RAM - _HarperDB Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance._ [_More on instance specs_](../../deployments/harperdb-cloud/instance-size-hardware-specs)_._ + _HarperDB Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance._ [_More on instance specs_](../../deployments/harperdb-cloud/instance-size-hardware-specs)_._ + 1. Select Storage Size - _Each instance has a mounted storage volume where your HarperDB data will reside. Storage is provisioned based on space and IOPS._ [_More on IOPS Impact on Performance_](../../deployments/harperdb-cloud/iops-impact)_._ + _Each instance has a mounted storage volume where your HarperDB data will reside. Storage is provisioned based on space and IOPS._ [_More on IOPS Impact on Performance_](../../deployments/harperdb-cloud/iops-impact)_._ + 1. Select Instance Region - _The geographic area where your instance will be provisioned._ + _The geographic area where your instance will be provisioned._ + 1. Click **Confirm Instance Details** to move to the next page. 1. Review your Instance Details, if there is an error, use the back button to correct it. 1. Review the [Privacy Policy](https://harperdb.io/legal/privacy-policy/) and [Terms of Service](https://harperdb.io/legal/harperdb-cloud-terms-of-service/), if you agree, click the **I agree** radio button to confirm. 1. Click **Add Instance**. 1. Your HarperDB Cloud instance will be provisioned in the background. Provisioning typically takes 5-15 minutes. You will receive an email notification when your instance is ready. - ## Register User-Installed Instance -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization for the instance to be created under. -3) Click the **Create New HarperDB Cloud Instance + Register User-Installed Instance** card. -4) Select **Register User-Installed Instance**. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +2. Click the appropriate organization for the instance to be created under. +3. Click the **Create New HarperDB Cloud Instance + Register User-Installed Instance** card. +4. Select **Register User-Installed Instance**. 1. Fill out Instance Info. 1. Enter Instance Name - _This is used for descriptive purposes only._ + _This is used for descriptive purposes only._ + 1. Enter Instance Username - _The username of a HarperDB super user that is already configured in your HarperDB installation._ + _The username of a HarperDB super user that is already configured in your HarperDB installation._ + 1. Enter Instance Password - _The password of a HarperDB super user that is already configured in your HarperDB installation._ + _The password of a HarperDB super user that is already configured in your HarperDB installation._ + 1. Enter Host - _The host to access the HarperDB instance. For example, `harperdb.myhost.com` or `localhost`._ + _The host to access the HarperDB instance. For example, `harperdb.myhost.com` or `localhost`._ + 1. Enter Port - _The port to access the HarperDB instance. HarperDB defaults `9925` for HTTP and `31283` for HTTPS._ + _The port to access the HarperDB instance. HarperDB defaults `9925` for HTTP and `31283` for HTTPS._ + 1. Select SSL - _If your instance is running over SSL, select the SSL checkbox. If not, you will need to enable mixed content in your browser to allow the HTTPS Studio to access the HTTP instance. If there are issues connecting to the instance, the Studio will display a red error message._ + _If your instance is running over SSL, select the SSL checkbox. If not, you will need to enable mixed content in your browser to allow the HTTPS Studio to access the HTTP instance. If there are issues connecting to the instance, the Studio will display a red error message._ + 1. Click **Instance Details** to move to the next page. 1. Select Instance Specs 1. Select Instance RAM - _HarperDB instances are billed based on Instance RAM. Selecting additional RAM will enable the ability for faster and more complex queries._ + _HarperDB instances are billed based on Instance RAM. Selecting additional RAM will enable the ability for faster and more complex queries._ + 1. Click **Confirm Instance Details** to move to the next page. 1. Review your Instance Details, if there is an error, use the back button to correct it. 1. Review the [Privacy Policy](https://harperdb.io/legal/privacy-policy/) and [Terms of Service](https://harperdb.io/legal/harperdb-cloud-terms-of-service/), if you agree, click the **I agree** radio button to confirm. @@ -91,8 +103,8 @@ A summary view of all instances within an organization can be viewed by clicking Instance deletion has two different behaviors depending on the instance type. -* **HarperDB Cloud Instance** This instance will be permanently deleted, including all data. This process is irreversible and cannot be undone. -* **User-Installed Instance** The instance will be removed from the HarperDB Studio only. This does not uninstall HarperDB from your system and your data will remain intact. +- **HarperDB Cloud Instance** This instance will be permanently deleted, including all data. This process is irreversible and cannot be undone. +- **User-Installed Instance** The instance will be removed from the HarperDB Studio only. This does not uninstall HarperDB from your system and your data will remain intact. An instance can be deleted as follows: @@ -101,7 +113,8 @@ An instance can be deleted as follows: 1. Identify the proper instance card and click the trash can icon. 1. Enter the instance name into the text box. - _This is done for confirmation purposes to ensure you do not accidentally delete an instance._ + _This is done for confirmation purposes to ensure you do not accidentally delete an instance._ + 1. Click the **Do It** button. ## Upgrade an Instance @@ -124,8 +137,10 @@ To log in to an instance: 1. Identify the proper instance card, it will have an unlocked icon and a status reading PLEASE LOG IN, and click the center of the card. 1. Enter the database username. - _The username of a HarperDB user that is already configured in your HarperDB instance._ + _The username of a HarperDB user that is already configured in your HarperDB instance._ + 1. Enter the database password. - _The password of a HarperDB user that is already configured in your HarperDB instance._ + _The password of a HarperDB user that is already configured in your HarperDB instance._ + 1. Click **Log In**. diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/login-password-reset.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/login-password-reset.md index 46254627..163a6dee 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/login-password-reset.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/login-password-reset.md @@ -8,35 +8,35 @@ title: Login and Password Reset To log into your existing HarperDB Studio account: -1) Navigate to the [HarperDB Studio](https://studio.harperdb.io/). -2) Enter your email address. -3) Enter your password. -4) Click **sign in**. +1. Navigate to the [HarperDB Studio](https://studio.harperdb.io/). +2. Enter your email address. +3. Enter your password. +4. Click **sign in**. ## Reset a Forgotten Password To reset a forgotten password: -1) Navigate to the HarperDB Studio password reset page. -2) Enter your email address. -3) Click **send password reset email**. -4) If the account exists, you will receive an email with a temporary password. -5) Navigate back to the HarperDB Studio login page. -6) Enter your email address. -7) Enter your temporary password. -8) Click **sign in**. -9) You will be taken to a new screen to reset your account password. Enter your new password. -*Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character.* -10) Click the **add account password** button. +1. Navigate to the HarperDB Studio password reset page. +2. Enter your email address. +3. Click **send password reset email**. +4. If the account exists, you will receive an email with a temporary password. +5. Navigate back to the HarperDB Studio login page. +6. Enter your email address. +7. Enter your temporary password. +8. Click **sign in**. +9. You will be taken to a new screen to reset your account password. Enter your new password. + _Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character._ +10. Click the **add account password** button. ## Change Your Password If you are already logged into the Studio, you can change your password though the user interface. -1) Navigate to the HarperDB Studio profile page. -2) In the **password** section, enter: +1. Navigate to the HarperDB Studio profile page. +2. In the **password** section, enter: + - Current password. + - New password. + - New password again _(for verification)_. - * Current password. - * New password. - * New password again *(for verification)*. -4) Click the **Update Password** button. \ No newline at end of file +3. Click the **Update Password** button. diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-charts.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-charts.md index 9c3cb18f..b9bd2cb2 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-charts.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-charts.md @@ -18,25 +18,31 @@ Charts are generated based on SQL queries, therefore to build a new chart you fi 1. Click **query** in the instance control bar. 1. Enter the SQL query you would like to generate a chart from. - _For example, using the dog demo data from the API Docs, we can get the average dog age per owner with the following query: `SELECT AVG(age) as avg_age, owner_name FROM dev.dog GROUP BY owner_name`._ + _For example, using the dog demo data from the API Docs, we can get the average dog age per owner with the following query: `SELECT AVG(age) as avg_age, owner_name FROM dev.dog GROUP BY owner_name`._ + 1. Click **Execute**. 1. Click **create chart** at the top right of the results table. 1. Configure your chart. 1. Choose chart type. - _HarperDB Studio offers many standard charting options like line, bar, etc._ + _HarperDB Studio offers many standard charting options like line, bar, etc._ + 1. Choose a data column. - _This column will be used to plot the data point. Typically, this is the values being calculated in the `SELECT` statement. Depending on the chart type, you can select multiple data columns to display on a single chart._ + _This column will be used to plot the data point. Typically, this is the values being calculated in the `SELECT` statement. Depending on the chart type, you can select multiple data columns to display on a single chart._ + 1. Depending on the chart type, you will need to select a grouping. - _This could be labeled as x-axis, label, etc. This will be used to group the data, typically this is what you used in your **GROUP BY** clause._ + _This could be labeled as x-axis, label, etc. This will be used to group the data, typically this is what you used in your **GROUP BY** clause._ + 1. Enter a chart name. - _Used for identification purposes and will be displayed at the top of the chart._ + _Used for identification purposes and will be displayed at the top of the chart._ + 1. Choose visible to all org users toggle. - _Leaving this option off will limit chart visibility to just your HarperDB Studio user. Toggling it on will enable all users with this Organization to view this chart._ + _Leaving this option off will limit chart visibility to just your HarperDB Studio user. Toggling it on will enable all users with this Organization to view this chart._ + 1. Click **Add Chart**. 1. The chart will now be visible on the **charts** page. diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-clustering.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-clustering.md index 36418e18..7872fc09 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-clustering.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-clustering.md @@ -6,70 +6,69 @@ title: Manage Clustering HarperDB instance clustering and replication can be configured directly through the HarperDB Studio. It is recommended to read through the clustering documentation first to gain a strong understanding of HarperDB clustering behavior. - - All clustering configuration is handled through the **cluster** page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **cluster** in the instance control bar. +4. Click **cluster** in the instance control bar. Note, the **cluster** page will only be available to super users. --- + ## Initial Configuration HarperDB instances do not have clustering configured by default. The HarperDB Studio will walk you through the initial configuration. Upon entering the **cluster** screen for the first time you will need to complete the following configuration. Configurations are set in the **enable clustering** panel on the left while actions are described in the middle of the screen. -1) Create a cluster user, read more about this here: Clustering Users and Roles. - * Enter username. - - * Enter password. - - * Click **Create Cluster User**. - -2) Click **Set Cluster Node Name**. -3) Click **Enable Instance Clustering**. - +1. Create a cluster user, read more about this here: Clustering Users and Roles. + - Enter username. + - Enter password. + - Click **Create Cluster User**. + +2. Click **Set Cluster Node Name**. +3. Click **Enable Instance Clustering**. + At this point the Studio will restart your HarperDB Instance, required for the configuration changes to take effect. --- ## Manage Clustering + Once initial clustering configuration is completed you a presented with a clustering management screen with the following properties: -* **connected instances** +- **connected instances** + + Displays all instances within the Studio Organization that this instance manages a connection with. - Displays all instances within the Studio Organization that this instance manages a connection with. +- **unconnected instances** -* **unconnected instances** + Displays all instances within the Studio Organization that this instance does not manage a connection with. - Displays all instances within the Studio Organization that this instance does not manage a connection with. +- **unregistered instances** -* **unregistered instances** + Displays all instances outside of the Studio Organization that this instance manages a connection with. - Displays all instances outside of the Studio Organization that this instance manages a connection with. +- **manage clustering** -* **manage clustering** + Once instances are connected, this will display clustering management options for all connected instances and all schemas and tables. - Once instances are connected, this will display clustering management options for all connected instances and all schemas and tables. --- ## Connect an Instance HarperDB Instances can be clustered together with the following instructions. -1) Ensure clustering has been configured on both instances and a cluster user with identical credentials exists on both. +1. Ensure clustering has been configured on both instances and a cluster user with identical credentials exists on both. -2) Identify the instance you would like to connect from the **unconnected instances** panel. +2. Identify the instance you would like to connect from the **unconnected instances** panel. -3) Click the plus icon next the appropriate instance. +3. Click the plus icon next the appropriate instance. -4) If configurations are correct, all schemas will sync across the cluster, then appear in the **manage clustering** panel. If there is a configuration issue, a red exclamation icon will appear, click it to learn more about what could be causing the issue. +4. If configurations are correct, all schemas will sync across the cluster, then appear in the **manage clustering** panel. If there is a configuration issue, a red exclamation icon will appear, click it to learn more about what could be causing the issue. --- @@ -77,9 +76,9 @@ HarperDB Instances can be clustered together with the following instructions. HarperDB Instances can be disconnected with the following instructions. -1) Identify the instance you would like to disconnect from the **connected instances** panel. +1. Identify the instance you would like to disconnect from the **connected instances** panel. -2) Click the minus icon next the appropriate instance. +2. Click the minus icon next the appropriate instance. --- @@ -87,8 +86,8 @@ HarperDB Instances can be disconnected with the following instructions. Subscriptions must be configured in order to move data between connected instances. Read more about subscriptions here: Creating A Subscription. The **manage clustering** panel displays a table with each row representing an channel per instance. Cells are bolded to indicate a change in the column. Publish and subscribe replication can be configured per table with the following instructions: -1) Identify the instance, schema, and table for replication to be configured. +1. Identify the instance, schema, and table for replication to be configured. -2) For publish, click the toggle switch in the **publish** column. +2. For publish, click the toggle switch in the **publish** column. -3) For subscribe, click the toggle switch in the **subscribe** column. \ No newline at end of file +3. For subscribe, click the toggle switch in the **subscribe** column. diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-functions.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-functions.md index 99673cc9..38bbf82e 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-functions.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-functions.md @@ -6,158 +6,153 @@ title: Manage Functions HarperDB Custom Functions are enabled by default and can be configured further through the HarperDB Studio. It is recommended to read through the Custom Functions documentation first to gain a strong understanding of HarperDB Custom Functions behavior. - - All Custom Functions configuration is handled through the **functions** page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the HarperDB Studio Organizations page. +1. Navigate to the HarperDB Studio Organizations page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **functions** in the instance control bar. +4. Click **functions** in the instance control bar. -*Note, the **functions** page will only be available to super users.* +_Note, the **functions** page will only be available to super users._ ## Manage Projects On the **functions** page of the HarperDB Studio you are presented with a functions management screen with the following properties: -* **projects** +- **projects** + + Displays a list of Custom Functions projects residing on this instance. + +- **/project_name/routes** + + Only displayed if there is an existing project. Displays the routes files contained within the selected project. - Displays a list of Custom Functions projects residing on this instance. -* **/project_name/routes** +- **/project_name/helpers** - Only displayed if there is an existing project. Displays the routes files contained within the selected project. -* **/project_name/helpers** + Only displayed if there is an existing project. Displays the helper files contained within the selected project. - Only displayed if there is an existing project. Displays the helper files contained within the selected project. -* **/project_name/static** +- **/project_name/static** - Only displayed if there is an existing project. Displays the static file count and a link to the static files contained within the selected project. Note, static files cannot currently be deployed through the Studio and must be deployed via the [HarperDB API](https://api.harperdb.io/) or manually to the server (not applicable with HarperDB Cloud). -* **Root File Directory** + Only displayed if there is an existing project. Displays the static file count and a link to the static files contained within the selected project. Note, static files cannot currently be deployed through the Studio and must be deployed via the [HarperDB API](https://api.harperdb.io/) or manually to the server (not applicable with HarperDB Cloud). - Displays the root file directory where the Custom Functions projects reside on this instance. -* **Custom Functions Server URL** +- **Root File Directory** - Displays the base URL in which all Custom Functions are accessed for this instance. + Displays the root file directory where the Custom Functions projects reside on this instance. +- **Custom Functions Server URL** + + Displays the base URL in which all Custom Functions are accessed for this instance. ## Create a Project HarperDB Custom Functions Projects can be initialized with the following instructions. -1) If this is your first project, skip this step. Click the plus icon next to the **projects** heading. +1. If this is your first project, skip this step. Click the plus icon next to the **projects** heading. -2) Enter the project name in the text box located under the **projects** heading. +2. Enter the project name in the text box located under the **projects** heading. -3) Click the check mark icon next the appropriate instance. +3. Click the check mark icon next the appropriate instance. -4) The Studio will take a few moments to provision a new project based on the [Custom Functions template](https://github.com/HarperDB/harperdb-custom-functions-template). +4. The Studio will take a few moments to provision a new project based on the [Custom Functions template](https://github.com/HarperDB/harperdb-custom-functions-template). -5) The Custom Functions project is now created and ready to modify. +5. The Custom Functions project is now created and ready to modify. ## Modify a Project Custom Functions routes and helper functions can be modified directly through the Studio. From the **functions** page: -1) Select the appropriate **project**. +1. Select the appropriate **project**. -2) Select the appropriate **route** or **helper**. +2. Select the appropriate **route** or **helper**. -3) Modify the code with your desired changes. +3. Modify the code with your desired changes. -4) Click the save icon at the bottom right of the screen. +4. Click the save icon at the bottom right of the screen. - *Note, saving modifications will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions.* + _Note, saving modifications will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions._ ## Create Additional Routes/Helpers To create an additional **route** to your Custom Functions project. From the **functions** page: -1) Select the appropriate Custom Functions **project**. +1. Select the appropriate Custom Functions **project**. -2) Click the plus icon to the right of the **routes** header. +2. Click the plus icon to the right of the **routes** header. -3) Enter the name of the new route in the textbox that appears. +3. Enter the name of the new route in the textbox that appears. -4) Click the check icon to create the new route. +4. Click the check icon to create the new route. - *Note, adding a route will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions.* + _Note, adding a route will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions._ To create an additional **helper** to your Custom Functions project. From the **functions** page: -1) Select the appropriate Custom Functions **project**. +1. Select the appropriate Custom Functions **project**. -2) Click the plus icon to the right of the **helpers** header. +2. Click the plus icon to the right of the **helpers** header. -3) Enter the name of the new helper in the textbox that appears. +3. Enter the name of the new helper in the textbox that appears. -4) Click the check icon to create the new helper. +4. Click the check icon to create the new helper. - *Note, adding a helper will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions.* + _Note, adding a helper will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions._ ## Delete a Project/Route/Helper To delete a Custom Functions project from the **functions** page: -1) Click the minus icon to the right of the **projects** header. +1. Click the minus icon to the right of the **projects** header. -2) Click the red minus icon to the right of the Custom Functions project you would like to delete. +2. Click the red minus icon to the right of the Custom Functions project you would like to delete. -3) Confirm deletion by clicking the red check icon. +3. Confirm deletion by clicking the red check icon. - *Note, deleting a project will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions.* + _Note, deleting a project will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions._ To delete a Custom Functions _project route_ from the **functions** page: -1) Select the appropriate Custom Functions **project**. +1. Select the appropriate Custom Functions **project**. -2) Click the minus icon to the right of the **routes** header. +2. Click the minus icon to the right of the **routes** header. -3) Click the red minus icon to the right of the Custom Functions route you would like to delete. +3. Click the red minus icon to the right of the Custom Functions route you would like to delete. -4) Confirm deletion by clicking the red check icon. +4. Confirm deletion by clicking the red check icon. - *Note, deleting a route will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions.* + _Note, deleting a route will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions._ To delete a Custom Functions _project helper_ from the **functions** page: -1) Select the appropriate Custom Functions **project**. +1. Select the appropriate Custom Functions **project**. -2) Click the minus icon to the right of the **helper** header. +2. Click the minus icon to the right of the **helper** header. -3) Click the red minus icon to the right of the Custom Functions header you would like to delete. +3. Click the red minus icon to the right of the Custom Functions header you would like to delete. -4) Confirm deletion by clicking the red check icon. +4. Confirm deletion by clicking the red check icon. - *Note, deleting a header will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions.* + _Note, deleting a header will restart the Custom Functions server on your HarperDB instance and may result in up to 60 seconds of downtime for all Custom Functions._ ## Deploy Custom Functions Project to Other Instances The HarperDB Studio provides the ability to deploy Custom Functions projects to additional HarperDB instances within the same Studio Organization. To deploy Custom Functions projects to additional instances, starting from the **functions** page: -1) Select the **project** you would like to deploy. - -2) Click the **deploy** button at the top right. - -3) A list of instances (excluding the current instance) within the organization will be displayed in tabular with the following information: - - * **Instance Name**: The name used to describe the instance. - - * **Instance URL**: The URL used to access the instance. - - * **CF Capable**: Describes if the instance version supports Custom Functions (yes/no). - - * **CF Enabled**: Describes if Custom Functions are configured and enabled on the instance (yes/no). - - * **Has Project**: Describes if the selected Custom Functions project has been previously deployed to the instance (yes/no). - - * **Deploy**: Button used to deploy the project to the instance. - - * **Remote**: Button used to remove the project from the instance. *Note, this will only be visible if the project has been previously deployed to the instance.* - -4) In the appropriate instance row, click the **deploy** button. - - *Note, deploying a project will restart the Custom Functions server on the HarperDB instance receiving the deployment and may result in up to 60 seconds of downtime for all Custom Functions.* +1. Select the **project** you would like to deploy. + +2. Click the **deploy** button at the top right. + +3. A list of instances (excluding the current instance) within the organization will be displayed in tabular with the following information: + - **Instance Name**: The name used to describe the instance. + - **Instance URL**: The URL used to access the instance. + - **CF Capable**: Describes if the instance version supports Custom Functions (yes/no). + - **CF Enabled**: Describes if Custom Functions are configured and enabled on the instance (yes/no). + - **Has Project**: Describes if the selected Custom Functions project has been previously deployed to the instance (yes/no). + - **Deploy**: Button used to deploy the project to the instance. + - **Remote**: Button used to remove the project from the instance. _Note, this will only be visible if the project has been previously deployed to the instance._ + +4. In the appropriate instance row, click the **deploy** button. + + _Note, deploying a project will restart the Custom Functions server on the HarperDB instance receiving the deployment and may result in up to 60 seconds of downtime for all Custom Functions._ diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-instance-roles.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-instance-roles.md index e301e7d8..dafc15a8 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-instance-roles.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-instance-roles.md @@ -6,71 +6,70 @@ title: Manage Instance Roles HarperDB users can be managed directly through the HarperDB Studio. It is recommended to read through the users & roles documentation to gain a strong understanding of how they operate. - - Instance role configuration is handled through the roles page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the HarperDB Studio Organizations page. +1. Navigate to the HarperDB Studio Organizations page. + +2. Click the appropriate organization that the instance belongs to. -2) Click the appropriate organization that the instance belongs to. +3. Select your desired instance. -3) Select your desired instance. +4. Click **rules** in the instance control bar. -4) Click **rules** in the instance control bar. +_Note, the **roles** page will only be available to super users._ -*Note, the **roles** page will only be available to super users.* +The _roles management_ screen consists of the following panels: +- **super users** + Displays all super user roles for this instance. -The *roles management* screen consists of the following panels: +- **cluster users** -* **super users** + Displays all cluster user roles for this instance. - Displays all super user roles for this instance. -* **cluster users** +- **standard roles** - Displays all cluster user roles for this instance. -* **standard roles** + Displays all standard roles for this instance. - Displays all standard roles for this instance. -* **role permission editing** +- **role permission editing** - Once a role is selected for editing, permissions will be displayed here in JSON format. + Once a role is selected for editing, permissions will be displayed here in JSON format. -*Note, when new tables are added that are not configured, the Studio will generate configuration values with permissions defaulting to `false`.* +_Note, when new tables are added that are not configured, the Studio will generate configuration values with permissions defaulting to `false`._ ## Role Management #### Create a Role -1) Click the plus icon at the top right of the appropriate role section. +1. Click the plus icon at the top right of the appropriate role section. -2) Enter the role name. +2. Enter the role name. -3) Click the green check mark. +3. Click the green check mark. -4) Configure the role permissions in the role permission editing panel. +4. Configure the role permissions in the role permission editing panel. - *Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel.* + _Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel._ -5) Click **Update Role Permissions**. +5. Click **Update Role Permissions**. #### Modify a Role -1) Click the appropriate role from the appropriate role section. +1. Click the appropriate role from the appropriate role section. -2) Modify the role permissions in the role permission editing panel. +2. Modify the role permissions in the role permission editing panel. - *Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel.* + _Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel._ -3) Click **Update Role Permissions**. +3. Click **Update Role Permissions**. #### Delete a Role Deleting a role is permanent and irreversible. A role cannot be remove if users are associated with it. -1) Click the minus icon at the top right of the schemas section. +1. Click the minus icon at the top right of the schemas section. -2) Identify the appropriate role to delete and click the red minus sign in the same row. +2. Identify the appropriate role to delete and click the red minus sign in the same row. -3) Click the red check mark to confirm deletion. \ No newline at end of file +3. Click the red check mark to confirm deletion. diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-instance-users.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-instance-users.md index 78cf11b7..1fb3c2ee 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-instance-users.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-instance-users.md @@ -6,58 +6,48 @@ title: Manage Instance Users HarperDB instance clustering and replication can be configured directly through the HarperDB Studio. It is recommended to read through the clustering documentation first to gain a strong understanding of HarperDB clustering behavior. - - Instance user configuration is handled through the **users** page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **users** in the instance control bar. +4. Click **users** in the instance control bar. -*Note, the **users** page will only be available to super users.* +_Note, the **users** page will only be available to super users._ ## Add a User HarperDB instance users can be added with the following instructions. -1) In the **add user** panel on the left enter: - - * New user username. - - * New user password. - - * Select a role. - - *Learn more about role management here: [Manage Instance Roles](./manage-instance-roles).* - -2) Click **Add User**. - +1. In the **add user** panel on the left enter: + - New user username. + - New user password. + - Select a role. + + _Learn more about role management here: [Manage Instance Roles](./manage-instance-roles)._ + +2. Click **Add User**. + ## Edit a User HarperDB instance users can be modified with the following instructions. -1) In the **existing users** panel, click the row of the user you would like to edit. +1. In the **existing users** panel, click the row of the user you would like to edit. + +2. To change a user’s password: + 1. In the **Change user password** section, enter the new password. + 2. Click **Update Password**. -2) To change a user’s password: +3. To change a user’s role: + 1. In the **Change user role** section, select the new role. + 2. Click **Update Role**. - 1) In the **Change user password** section, enter the new password. - - 2) Click **Update Password**. - -3) To change a user’s role: +4. To delete a user: + 1. In the **Delete User** section, type the username into the textbox. - 1) In the **Change user role** section, select the new role. - - 2) Click **Update Role**. - -4) To delete a user: + _This is done for confirmation purposes._ - 1) In the **Delete User** section, type the username into the textbox. - - *This is done for confirmation purposes.* - - 2) Click **Delete User**. \ No newline at end of file + 2. Click **Delete User**. diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-schemas-browse-data.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-schemas-browse-data.md index 41493b96..8b4061e3 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-schemas-browse-data.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/manage-schemas-browse-data.md @@ -6,10 +6,10 @@ title: Manage Schemas / Browse Data Manage instance schemas/tables and browse data in tabular format with the following instructions: -1) Navigate to the HarperDB Studio Organizations page. -2) Click the appropriate organization that the instance belongs to. -3) Select your desired instance. -4) Click **browse** in the instance control bar. +1. Navigate to the HarperDB Studio Organizations page. +2. Click the appropriate organization that the instance belongs to. +3. Select your desired instance. +4. Click **browse** in the instance control bar. Once on the instance browse page you can view data, manage schemas and tables, add new data, and more. @@ -17,95 +17,90 @@ Once on the instance browse page you can view data, manage schemas and tables, a #### Create a Schema -1) Click the plus icon at the top right of the schemas section. -2) Enter the schema name. -3) Click the green check mark. - +1. Click the plus icon at the top right of the schemas section. +2. Enter the schema name. +3. Click the green check mark. #### Delete a Schema Deleting a schema is permanent and irreversible. Deleting a schema removes all tables and data within it. -1) Click the minus icon at the top right of the schemas section. -2) Identify the appropriate schema to delete and click the red minus sign in the same row. -3) Click the red check mark to confirm deletion. - +1. Click the minus icon at the top right of the schemas section. +2. Identify the appropriate schema to delete and click the red minus sign in the same row. +3. Click the red check mark to confirm deletion. #### Create a Table -1) Select the desired schema from the schemas section. -2) Click the plus icon at the top right of the tables section. -3) Enter the table name. -4) Enter the primary key. - - *The primary key is also often referred to as the hash attribute in the studio, and it defines the unique identifier for each row in your table.* -5) Click the green check mark. +1. Select the desired schema from the schemas section. +2. Click the plus icon at the top right of the tables section. +3. Enter the table name. +4. Enter the primary key. + _The primary key is also often referred to as the hash attribute in the studio, and it defines the unique identifier for each row in your table._ + +5. Click the green check mark. #### Delete a Table + Deleting a table is permanent and irreversible. Deleting a table removes all data within it. -1) Select the desired schema from the schemas section. -2) Click the minus icon at the top right of the tables section. -3) Identify the appropriate table to delete and click the red minus sign in the same row. -4) Click the red check mark to confirm deletion. +1. Select the desired schema from the schemas section. +2. Click the minus icon at the top right of the tables section. +3. Identify the appropriate table to delete and click the red minus sign in the same row. +4. Click the red check mark to confirm deletion. ## Manage Table Data The following section assumes you have selected the appropriate table from the schema/table browser. - - #### Filter Table Data -1) Click the magnifying glass icon at the top right of the table browser. -2) This expands the search filters. -3) The results will be filtered appropriately. - +1. Click the magnifying glass icon at the top right of the table browser. +2. This expands the search filters. +3. The results will be filtered appropriately. #### Load CSV Data -1) Click the data icon at the top right of the table browser. You will be directed to the CSV upload page where you can choose to import a CSV by URL or upload a CSV file. -2) To import a CSV by URL: - 1) Enter the URL in the **CSV file URL** textbox. - 2) Click **Import From URL**. - 3) The CSV will load, and you will be redirected back to browse table data. -3) To upload a CSV file: - 1) Click **Click or Drag to select a .csv file** (or drag your CSV file from your file browser). - 2) Navigate to your desired CSV file and select it. - 3) Click **Insert X Records**, where X is the number of records in your CSV. - 4) The CSV will load, and you will be redirected back to browse table data. - +1. Click the data icon at the top right of the table browser. You will be directed to the CSV upload page where you can choose to import a CSV by URL or upload a CSV file. +2. To import a CSV by URL: + 1. Enter the URL in the **CSV file URL** textbox. + 2. Click **Import From URL**. + 3. The CSV will load, and you will be redirected back to browse table data. +3. To upload a CSV file: + 1. Click **Click or Drag to select a .csv file** (or drag your CSV file from your file browser). + 2. Navigate to your desired CSV file and select it. + 3. Click **Insert X Records**, where X is the number of records in your CSV. + 4. The CSV will load, and you will be redirected back to browse table data. #### Add a Record -1) Click the plus icon at the top right of the table browser. -2) The Studio will pre-populate existing table attributes in JSON format. +1. Click the plus icon at the top right of the table browser. +2. The Studio will pre-populate existing table attributes in JSON format. - *The primary key is not included, but you can add it in and set it to your desired value. Auto-maintained fields are not included and cannot be manually set. You may enter a JSON array to insert multiple records in a single transaction.* -3) Enter values to be added to the record. + _The primary key is not included, but you can add it in and set it to your desired value. Auto-maintained fields are not included and cannot be manually set. You may enter a JSON array to insert multiple records in a single transaction._ - *You may add new attributes to the JSON; they will be reflexively added to the table.* -4) Click the **Add New** button. +3. Enter values to be added to the record. + _You may add new attributes to the JSON; they will be reflexively added to the table._ -#### Edit a Record +4. Click the **Add New** button. -1) Click the record/row you would like to edit. -2) Modify the desired values. +#### Edit a Record - *You may add new attributes to the JSON; they will be reflexively added to the table.* +1. Click the record/row you would like to edit. +2. Modify the desired values. -3) Click the **save icon**. + _You may add new attributes to the JSON; they will be reflexively added to the table._ +3. Click the **save icon**. #### Delete a Record Deleting a record is permanent and irreversible. If transaction logging is turned on, the delete transaction will be recorded as well as the data that was deleted. -1) Click the record/row you would like to delete. -2) Click the **delete icon**. -3) Confirm deletion by clicking the **check icon**. +1. Click the record/row you would like to delete. +2. Click the **delete icon**. +3. Confirm deletion by clicking the **check icon**. ## Browse Table Data @@ -115,18 +110,14 @@ The following section assumes you have selected the appropriate table from the s The first page of table data is automatically loaded on table selection. Paging controls are at the bottom of the table. Here you can: -* Page left and right using the arrows. -* Type in the desired page. -* Change the page size (the amount of records displayed in the table). - +- Page left and right using the arrows. +- Type in the desired page. +- Change the page size (the amount of records displayed in the table). #### Refresh Table Data Click the refresh icon at the top right of the table browser. - - #### Automatically Refresh Table Data Toggle the auto switch at the top right of the table browser. The table data will now automatically refresh every 15 seconds. Filters and pages will remain set for refreshed data. - diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/organizations.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/organizations.md index 54df0eb1..ec19c50e 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/organizations.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/organizations.md @@ -3,43 +3,46 @@ title: Organizations --- # Organizations -HarperDB Studio organizations provide the ability to group HarperDB Cloud Instances. Organization behavior is as follows: -* Billing occurs at the organization level to a single credit card. -* Organizations retain their own unique HarperDB Cloud subdomain. -* Cloud instances reside within an organization. -* Studio users can be invited to organizations to share instances. +HarperDB Studio organizations provide the ability to group HarperDB Cloud Instances. Organization behavior is as follows: +- Billing occurs at the organization level to a single credit card. +- Organizations retain their own unique HarperDB Cloud subdomain. +- Cloud instances reside within an organization. +- Studio users can be invited to organizations to share instances. An organization is automatically created for you when you sign up for HarperDB Studio. If you only have one organization, the Studio will automatically bring you to your organization’s page. --- ## List Organizations + A summary view of all organizations your user belongs to can be viewed on the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. You can navigate to this page at any time by clicking the **all organizations** link at the top of the HarperDB Studio. ## Create a New Organization + A new organization can be created as follows: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the **Create a New Organization** card. -3) Fill out new organization details - * Enter Organization Name - *This is used for descriptive purposes only.* - * Enter Organization Subdomain - *Part of the URL that will be used to identify your HarperDB Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com).* -4) Click Create Organization. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the **Create a New Organization** card. +3. Fill out new organization details + - Enter Organization Name + _This is used for descriptive purposes only._ + - Enter Organization Subdomain + _Part of the URL that will be used to identify your HarperDB Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com)._ +4. Click Create Organization. ## Delete an Organization An organization cannot be deleted until all instances have been removed. An organization can be deleted as follows: -1) Navigate to the HarperDB Studio Organizations page. -2) Identify the proper organization card and click the trash can icon. -3) Enter the organization name into the text box. +1. Navigate to the HarperDB Studio Organizations page. +2. Identify the proper organization card and click the trash can icon. +3. Enter the organization name into the text box. + + _This is done for confirmation purposes to ensure you do not accidentally delete an organization._ - *This is done for confirmation purposes to ensure you do not accidentally delete an organization.* -4) Click the **Do It** button. +4. Click the **Do It** button. ## Manage Users @@ -49,11 +52,11 @@ HarperDB Studio organization owners can manage users including inviting new user A new user can be invited to an organization as follows: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) In the **add user** box, enter the new user’s email address. -5) Click **Add User**. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. In the **add user** box, enter the new user’s email address. +5. Click **Add User**. Users may or may not already be HarperDB Studio users when adding them to an organization. If the HarperDB Studio account already exists, the user will receive an email notification alerting them to the organization invitation. If the user does not have a HarperDB Studio account, they will receive an email welcoming them to HarperDB Studio. @@ -63,11 +66,11 @@ Users may or may not already be HarperDB Studio users when adding them to an org Organization owners have full access to the organization including the ability to manage organization users, create, modify, and delete instances, and delete the organization. Users must have accepted their invitation prior to being promoted to an owner. A user’s organization owner status can be toggled owner as follows: -1) Navigate to the HarperDB Studio Organizations page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) Click the appropriate user from the **existing users** section. -5) Toggle the **Is Owner** switch to the desired status. +1. Navigate to the HarperDB Studio Organizations page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. Click the appropriate user from the **existing users** section. +5. Toggle the **Is Owner** switch to the desired status. --- @@ -75,35 +78,32 @@ Organization owners have full access to the organization including the ability t Users may be removed from an organization at any time. Removing a user from an organization will not delete their HarperDB Studio account, it will only remove their access to the specified organization. A user can be removed from an organization as follows: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) Click the appropriate user from the **existing users** section. -5) Type **DELETE** in the text box in the **Delete User** row. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. Click the appropriate user from the **existing users** section. +5. Type **DELETE** in the text box in the **Delete User** row. - *This is done for confirmation purposes to ensure you do not accidentally delete a user.* -6) Click **Delete User**. + _This is done for confirmation purposes to ensure you do not accidentally delete a user._ + +6. Click **Delete User**. ## Manage Billing Billing is configured per organization and will be billed to the stored credit card at appropriate intervals (monthly or annually depending on the registered instance). Billing settings can be configured as follows: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **billing** at the top of the screen. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **billing** at the top of the screen. Here organization owners can view invoices, manage coupons, and manage the associated credit card. - - -*HarperDB billing and payments are managed via Stripe.* - - +_HarperDB billing and payments are managed via Stripe._ ### Add a Coupon Coupons are applicable towards any paid tier or user-installed instance and you can change your subscription at any time. Coupons can be added to your Organization as follows: -1) In the coupons panel of the **billing** page, enter your coupon code. -2) Click **Add Coupon**. -3) The coupon will then be available and displayed in the coupons panel. \ No newline at end of file +1. In the coupons panel of the **billing** page, enter your coupon code. +2. Click **Add Coupon**. +3. The coupon will then be available and displayed in the coupons panel. diff --git a/site/versioned_docs/version-4.2/administration/harperdb-studio/query-instance-data.md b/site/versioned_docs/version-4.2/administration/harperdb-studio/query-instance-data.md index 5dd2d8c6..22801dbc 100644 --- a/site/versioned_docs/version-4.2/administration/harperdb-studio/query-instance-data.md +++ b/site/versioned_docs/version-4.2/administration/harperdb-studio/query-instance-data.md @@ -6,14 +6,14 @@ title: Query Instance Data SQL queries can be executed directly through the HarperDB Studio with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. -3) Select your desired instance. -4) Click **query** in the instance control bar. -5) Enter your SQL query in the SQL query window. -6) Click **Execute**. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +2. Click the appropriate organization that the instance belongs to. +3. Select your desired instance. +4. Click **query** in the instance control bar. +5. Enter your SQL query in the SQL query window. +6. Click **Execute**. -*Please note, the Studio will execute the query exactly as entered. For example, if you attempt to `SELECT *` from a table with millions of rows, you will most likely crash your browser.* +_Please note, the Studio will execute the query exactly as entered. For example, if you attempt to `SELECT _` from a table with millions of rows, you will most likely crash your browser.\* ## Browse Query Results Set @@ -21,9 +21,9 @@ SQL queries can be executed directly through the HarperDB Studio with the follow The first page of results set data is automatically loaded on query execution. Paging controls are at the bottom of the table. Here you can: -* Page left and right using the arrows. -* Type in the desired page. -* Change the page size (the amount of records displayed in the table). +- Page left and right using the arrows. +- Type in the desired page. +- Change the page size (the amount of records displayed in the table). #### Refresh Results Set @@ -37,12 +37,11 @@ Toggle the auto switch at the top right of the results set table. The results se Query history is stored in your local browser cache. Executed queries are listed with the most recent at the top in the **query history** section. - #### Rerun Previous Query -* Identify the query from the **query history** list. -* Click the appropriate query. It will be loaded into the **sql query** input box. -* Click **Execute**. +- Identify the query from the **query history** list. +- Click the appropriate query. It will be loaded into the **sql query** input box. +- Click **Execute**. #### Clear Query History @@ -50,4 +49,4 @@ Click the trash can icon at the top right of the **query history** section. ## Create Charts -The HarperDB Studio includes a charting feature where you can build charts based on your specified queries. Visit the Charts documentation for more information. \ No newline at end of file +The HarperDB Studio includes a charting feature where you can build charts based on your specified queries. Visit the Charts documentation for more information. diff --git a/site/versioned_docs/version-4.2/administration/jobs.md b/site/versioned_docs/version-4.2/administration/jobs.md index 1c629b45..e08d0126 100644 --- a/site/versioned_docs/version-4.2/administration/jobs.md +++ b/site/versioned_docs/version-4.2/administration/jobs.md @@ -10,7 +10,7 @@ HarperDB Jobs are asynchronous tasks performed by the Operations API. Jobs uses an asynchronous methodology to account for the potential of a long-running operation. For example, exporting millions of records to S3 could take some time, so that job is started and the id is provided to check on the status. -The job status can be **COMPLETE** or **IN\_PROGRESS**. +The job status can be **COMPLETE** or **IN_PROGRESS**. ## Example Job Operations @@ -24,11 +24,11 @@ Example job operations include: [import from s3](https://api.harperdb.io/#820b3947-acbe-41f9-858b-2413cabc3a18) -[delete\_records\_before](https://api.harperdb.io/#8de87e47-73a8-4298-b858-ca75dc5765c2) +[delete_records_before](https://api.harperdb.io/#8de87e47-73a8-4298-b858-ca75dc5765c2) -[export\_local](https://api.harperdb.io/#49a02517-ada9-4198-b48d-8707db905be0) +[export_local](https://api.harperdb.io/#49a02517-ada9-4198-b48d-8707db905be0) -[export\_to\_s3](https://api.harperdb.io/#f6393e9f-e272-4180-a42c-ff029d93ddd4) +[export_to_s3](https://api.harperdb.io/#f6393e9f-e272-4180-a42c-ff029d93ddd4) Example Response from a Job Operation @@ -42,7 +42,7 @@ Whenever one of these operations is initiated, an asynchronous job is created an ## Managing Jobs -To check on a job's status, use the [get\_job](https://api.harperdb.io/#d501bef7-dbb7-4714-b535-e466f6583dce) operation. +To check on a job's status, use the [get_job](https://api.harperdb.io/#d501bef7-dbb7-4714-b535-e466f6583dce) operation. Get Job Request @@ -77,7 +77,7 @@ Get Job Response ## Finding Jobs -To find jobs (if the ID is not known) use the [search\_jobs\_by\_start\_date](https://api.harperdb.io/#4474ca16-e4c2-4740-81b5-14ed98c5eeab) operation. +To find jobs (if the ID is not known) use the [search_jobs_by_start_date](https://api.harperdb.io/#4474ca16-e4c2-4740-81b5-14ed98c5eeab) operation. Search Jobs Request diff --git a/site/versioned_docs/version-4.2/administration/logging/audit-logging.md b/site/versioned_docs/version-4.2/administration/logging/audit-logging.md index 5871586b..f70b4cde 100644 --- a/site/versioned_docs/version-4.2/administration/logging/audit-logging.md +++ b/site/versioned_docs/version-4.2/administration/logging/audit-logging.md @@ -12,7 +12,7 @@ Audit log is enabled by default. To diable the audit log, set `logging.auditLog` ### Audit Log Operations -#### read\_audit\_log +#### read_audit_log The `read_audit_log` operation is flexible, enabling users to query with many parameters. All operations search on a single table. Filter options include timestamps, usernames, and table hash values. Additional examples found in the [HarperDB API documentation](../../developers/operations-api/logs). @@ -20,116 +20,107 @@ The `read_audit_log` operation is flexible, enabling users to query with many pa ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "timestamp", - "search_values": [ - 1660585740558 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "timestamp", + "search_values": [1660585740558] } ``` There are three outcomes using timestamp. -* `"search_values": []` - All records returned for specified table -* `"search_values": [1660585740558]` - All records after provided timestamp -* `"search_values": [1660585740558, 1760585759710]` - Records "from" and "to" provided timestamp +- `"search_values": []` - All records returned for specified table +- `"search_values": [1660585740558]` - All records after provided timestamp +- `"search_values": [1660585740558, 1760585759710]` - Records "from" and "to" provided timestamp -*** +--- **Search by Username** ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "username", - "search_values": [ - "admin" - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "username", + "search_values": ["admin"] } ``` The above example will return all records whose `username` is "admin." -*** +--- **Search by Primary Key** ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "hash_value", - "search_values": [ - 318 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "hash_value", + "search_values": [318] } ``` The above example will return all records whose primary key (`hash_value`) is 318. -*** +--- -#### read\_audit\_log Response +#### read_audit_log Response The example that follows provides records of operations performed on a table. One thing of note is that the `read_audit_log` operation gives you the `original_records`. ```json { - "operation": "update", - "user_name": "HDB_ADMIN", - "timestamp": 1607035559122.277, - "hash_values": [ - 1, - 2 - ], - "records": [ - { - "id": 1, - "breed": "Muttzilla", - "age": 6, - "__updatedtime__": 1607035559122 - }, - { - "id": 2, - "age": 7, - "__updatedtime__": 1607035559121 - } - ], - "original_records": [ - { - "__createdtime__": 1607035556801, - "__updatedtime__": 1607035556801, - "age": 5, - "breed": "Mutt", - "id": 2, - "name": "Penny" - }, - { - "__createdtime__": 1607035556801, - "__updatedtime__": 1607035556801, - "age": 5, - "breed": "Mutt", - "id": 1, - "name": "Harper" - } - ] + "operation": "update", + "user_name": "HDB_ADMIN", + "timestamp": 1607035559122.277, + "hash_values": [1, 2], + "records": [ + { + "id": 1, + "breed": "Muttzilla", + "age": 6, + "__updatedtime__": 1607035559122 + }, + { + "id": 2, + "age": 7, + "__updatedtime__": 1607035559121 + } + ], + "original_records": [ + { + "__createdtime__": 1607035556801, + "__updatedtime__": 1607035556801, + "age": 5, + "breed": "Mutt", + "id": 2, + "name": "Penny" + }, + { + "__createdtime__": 1607035556801, + "__updatedtime__": 1607035556801, + "age": 5, + "breed": "Mutt", + "id": 1, + "name": "Harper" + } + ] } ``` -#### delete\_audit\_logs\_before +#### delete_audit_logs_before Just like with transaction logs, you can clean up your audit logs with the `delete_audit_logs_before` operation. It will delete audit log data according to the given parameters. The example below will delete records older than the timestamp provided. ```json { - "operation": "delete_audit_logs_before", - "schema": "dev", - "table": "cat", - "timestamp": 1598290282817 + "operation": "delete_audit_logs_before", + "schema": "dev", + "table": "cat", + "timestamp": 1598290282817 } ``` diff --git a/site/versioned_docs/version-4.2/administration/logging/index.md b/site/versioned_docs/version-4.2/administration/logging/index.md index 2ed92774..9a0c4975 100644 --- a/site/versioned_docs/version-4.2/administration/logging/index.md +++ b/site/versioned_docs/version-4.2/administration/logging/index.md @@ -6,6 +6,6 @@ title: Logging HarperDB provides many different logging options for various features and functionality. -* [Standard Logging](./standard-logging): HarperDB maintains a log of events that take place throughout operation. -* [Audit Logging](./audit-logging): HarperDB uses a standard HarperDB table to track transactions. For each table a user creates, a corresponding table will be created to track transactions against that table. -* [Transaction Logging](./transaction-logging): HarperDB stores a verbose history of all transactions logged for specified database tables, including original data records. +- [Standard Logging](./standard-logging): HarperDB maintains a log of events that take place throughout operation. +- [Audit Logging](./audit-logging): HarperDB uses a standard HarperDB table to track transactions. For each table a user creates, a corresponding table will be created to track transactions against that table. +- [Transaction Logging](./transaction-logging): HarperDB stores a verbose history of all transactions logged for specified database tables, including original data records. diff --git a/site/versioned_docs/version-4.2/administration/logging/standard-logging.md b/site/versioned_docs/version-4.2/administration/logging/standard-logging.md index cf120e3b..08affb24 100644 --- a/site/versioned_docs/version-4.2/administration/logging/standard-logging.md +++ b/site/versioned_docs/version-4.2/administration/logging/standard-logging.md @@ -22,15 +22,15 @@ For example, a typical log entry looks like: The components of a log entry are: -* timestamp - This is the date/time stamp when the event occurred -* level - This is an associated log level that gives a rough guide to the importance and urgency of the message. The available log levels in order of least urgent (and more verbose) are: `trace`, `debug`, `info`, `warn`, `error`, `fatal`, and `notify`. -* thread/ID - This reports the name of the thread and the thread ID that the event was reported on. Note that NATS logs are recorded by their process name and there is no thread id for them since they are a separate process. Key threads are: - * main - This is the thread that is responsible for managing all other threads and routes incoming requests to the other threads - * http - These are the worker threads that handle the primary workload of incoming HTTP requests to the operations API and custom functions. - * Clustering\* - These are threads and processes that handle replication. - * job - These are job threads that have been started to handle operations that are executed in a separate job thread. -* tags - Logging from a custom function will include a "custom-function" tag in the log entry. Most logs will not have any additional tags. -* message - This is the main message that was reported. +- timestamp - This is the date/time stamp when the event occurred +- level - This is an associated log level that gives a rough guide to the importance and urgency of the message. The available log levels in order of least urgent (and more verbose) are: `trace`, `debug`, `info`, `warn`, `error`, `fatal`, and `notify`. +- thread/ID - This reports the name of the thread and the thread ID that the event was reported on. Note that NATS logs are recorded by their process name and there is no thread id for them since they are a separate process. Key threads are: + - main - This is the thread that is responsible for managing all other threads and routes incoming requests to the other threads + - http - These are the worker threads that handle the primary workload of incoming HTTP requests to the operations API and custom functions. + - Clustering\* - These are threads and processes that handle replication. + - job - These are job threads that have been started to handle operations that are executed in a separate job thread. +- tags - Logging from a custom function will include a "custom-function" tag in the log entry. Most logs will not have any additional tags. +- message - This is the main message that was reported. We try to keep logging to a minimum by default, to do this the default log level is `error`. If you require more information from the logs, increasing the log level down will provide that. @@ -54,12 +54,12 @@ To access specific logs you may query the HarperDB API. Logs can be queried usin ```json { - "operation": "read_log", - "start": 0, - "limit": 1000, - "level": "error", - "from": "2021-01-25T22:05:27.464+0000", - "until": "2021-01-25T23:05:27.464+0000", - "order": "desc" + "operation": "read_log", + "start": 0, + "limit": 1000, + "level": "error", + "from": "2021-01-25T22:05:27.464+0000", + "until": "2021-01-25T23:05:27.464+0000", + "order": "desc" } ``` diff --git a/site/versioned_docs/version-4.2/administration/logging/transaction-logging.md b/site/versioned_docs/version-4.2/administration/logging/transaction-logging.md index a65c4714..6f2031ad 100644 --- a/site/versioned_docs/version-4.2/administration/logging/transaction-logging.md +++ b/site/versioned_docs/version-4.2/administration/logging/transaction-logging.md @@ -14,71 +14,71 @@ If you would like to use the transaction log, but have not set up clustering yet ## Transaction Log Operations -### read\_transaction\_log +### read_transaction_log The `read_transaction_log` operation returns a prescribed set of records, based on given parameters. The example below will give a maximum of 2 records within the timestamps provided. ```json { - "operation": "read_transaction_log", - "schema": "dev", - "table": "dog", - "from": 1598290235769, - "to": 1660249020865, - "limit": 2 + "operation": "read_transaction_log", + "schema": "dev", + "table": "dog", + "from": 1598290235769, + "to": 1660249020865, + "limit": 2 } ``` _See example response below._ -### read\_transaction\_log Response +### read_transaction_log Response ```json [ - { - "operation": "insert", - "user": "admin", - "timestamp": 1660165619736, - "records": [ - { - "id": 1, - "dog_name": "Penny", - "owner_name": "Kyle", - "breed_id": 154, - "age": 7, - "weight_lbs": 38, - "__updatedtime__": 1660165619688, - "__createdtime__": 1660165619688 - } - ] - }, - { - "operation": "update", - "user": "admin", - "timestamp": 1660165620040, - "records": [ - { - "id": 1, - "dog_name": "Penny B", - "__updatedtime__": 1660165620036 - } - ] - } + { + "operation": "insert", + "user": "admin", + "timestamp": 1660165619736, + "records": [ + { + "id": 1, + "dog_name": "Penny", + "owner_name": "Kyle", + "breed_id": 154, + "age": 7, + "weight_lbs": 38, + "__updatedtime__": 1660165619688, + "__createdtime__": 1660165619688 + } + ] + }, + { + "operation": "update", + "user": "admin", + "timestamp": 1660165620040, + "records": [ + { + "id": 1, + "dog_name": "Penny B", + "__updatedtime__": 1660165620036 + } + ] + } ] ``` _See example request above._ -### delete\_transaction\_logs\_before +### delete_transaction_logs_before The `delete_transaction_logs_before` operation will delete transaction log data according to the given parameters. The example below will delete records older than the timestamp provided. ```json { - "operation": "delete_transaction_logs_before", - "schema": "dev", - "table": "dog", - "timestamp": 1598290282817 + "operation": "delete_transaction_logs_before", + "schema": "dev", + "table": "dog", + "timestamp": 1598290282817 } ``` diff --git a/site/versioned_docs/version-4.2/deployments/_category_.json b/site/versioned_docs/version-4.2/deployments/_category_.json index 8fdd6e17..95644c6b 100644 --- a/site/versioned_docs/version-4.2/deployments/_category_.json +++ b/site/versioned_docs/version-4.2/deployments/_category_.json @@ -1,12 +1,10 @@ { - "label": "Deployments", - "position": 3, - "link": { - "type": "generated-index", - "title": "Deployments Documentation", - "description": "Installation and deployment guides for HarperDB", - "keywords": [ - "deployments" - ] - } -} \ No newline at end of file + "label": "Deployments", + "position": 3, + "link": { + "type": "generated-index", + "title": "Deployments Documentation", + "description": "Installation and deployment guides for HarperDB", + "keywords": ["deployments"] + } +} diff --git a/site/versioned_docs/version-4.2/deployments/configuration.md b/site/versioned_docs/version-4.2/deployments/configuration.md index 23427879..eb21ae58 100644 --- a/site/versioned_docs/version-4.2/deployments/configuration.md +++ b/site/versioned_docs/version-4.2/deployments/configuration.md @@ -8,7 +8,7 @@ HarperDB is configured through a [YAML](https://yaml.org/) file called `harperdb All available configuration will be populated by default in the config file on install, regardless of whether it is used. -*** +--- ## Using the Configuration File and Naming Conventions @@ -32,7 +32,7 @@ To use a custom configuration file to set values on install, use the CLI/ENV var To install HarperDB overtop of an existing configuration file, set `HDB_CONFIG` to the root path of your install `/harperdb-config.yaml` -*** +--- ## Configuration Options @@ -55,7 +55,7 @@ For HTTP clients that support (Brotli) compression encoding, responses that are ```yaml http: - compressionThreshold: 1200 + compressionThreshold: 1200 ``` `cors` - _Type_: boolean; _Default_: true @@ -88,18 +88,18 @@ The length of time in milliseconds after which a request will timeout. ```yaml http: - cors: true - corsAccessList: - - null - headersTimeout: 60000 - https: false - keepAliveTimeout: 30000 - port: 9926 - securePort: null - timeout: 120000 + cors: true + corsAccessList: + - null + headersTimeout: 60000 + https: false + keepAliveTimeout: 30000 + port: 9926 + securePort: null + timeout: 120000 ``` -*** +--- ### `threads` @@ -111,7 +111,7 @@ The `threads` option specifies the number of threads that will be used to servic threads: 11 ``` -*** +--- ### `clustering` @@ -119,11 +119,11 @@ The `clustering` section configures the clustering engine, this is used to repli Clustering offers a lot of different configurations, however in a majority of cases the only options you will need to pay attention to are: -* `clustering.enabled` Enable the clustering processes. -* `clustering.hubServer.cluster.network.port` The port other nodes will connect to. This port must be accessible from other cluster nodes. -* `clustering.hubServer.cluster.network.routes`The connections to other instances. -* `clustering.nodeName` The name of your node, must be unique within the cluster. -* `clustering.user` The name of the user credentials used for Inter-node authentication. +- `clustering.enabled` Enable the clustering processes. +- `clustering.hubServer.cluster.network.port` The port other nodes will connect to. This port must be accessible from other cluster nodes. +- `clustering.hubServer.cluster.network.routes`The connections to other instances. +- `clustering.nodeName` The name of your node, must be unique within the cluster. +- `clustering.user` The name of the user credentials used for Inter-node authentication. `enabled` - _Type_: boolean; _Default_: false @@ -133,7 +133,7 @@ _Note: If you enabled clustering but do not create and add a cluster user you wi ```yaml clustering: - enabled: true + enabled: true ``` `clustering.hubServer.cluster` @@ -240,7 +240,6 @@ The port of the remote instance you are creating the connection with. This is li \ - `clustering.leafServer.streams` `maxAge` - _Type_: integer; _Default_: null @@ -259,7 +258,7 @@ How many messages may be in a stream. Oldest messages are removed if the stream The directory where all the streams are kept. -*** +--- `logLevel` - _Type_: string; _Default_: error @@ -321,7 +320,7 @@ When true, all transactions that are received from other nodes are republished t When true, hub server will verify client certificate using the CA certificate. -*** +--- `user` - _Type_: string; _Default_: null @@ -333,10 +332,10 @@ The user can be created either through the API using an `add_user` request with ```yaml clustering: - user: cluster_person + user: cluster_person ``` -*** +--- ### `localStudio` @@ -351,7 +350,7 @@ localStudio: enabled: false ``` -*** +--- ### `logging` @@ -372,9 +371,9 @@ To access the audit logs, use the API operation `read_audit_log`. It will provid ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog" + "operation": "read_audit_log", + "schema": "dev", + "table": "dog" } ``` @@ -456,7 +455,7 @@ logging: stdStreams: false ``` -*** +--- ### `authentication` @@ -563,7 +562,7 @@ Path to the certificate authority file. Path to the private key file. -*** +--- #### `componentsRoot` @@ -575,7 +574,7 @@ The path to the folder containing the local component files. componentsRoot: ~/hdb/components ``` -*** +--- #### `rootPath` @@ -587,7 +586,7 @@ The HarperDB database and applications/API/interface are decoupled from each oth rootPath: /Users/jonsnow/hdb ``` -*** +--- #### `storage` @@ -647,7 +646,7 @@ storage: _**Note:**_ This configuration applies to all database files, which includes system tables that are used internally by HarperDB. For this reason if you wish to use a non default `path` value you must move any existing schemas into your `path` location. Existing schemas is likely to include the system schema which can be found at `/schema/system`. -*** +--- #### `tls` @@ -655,9 +654,9 @@ Transport Layer Security ```yaml tls: - certificate: ~/hdb/keys/certificate.pem - certificateAuthority: ~/hdb/keys/ca.pem - privateKey: ~/hdb/keys/privateKey.pem + certificate: ~/hdb/keys/certificate.pem + certificateAuthority: ~/hdb/keys/ca.pem + privateKey: ~/hdb/keys/privateKey.pem ``` `certificate` - _Type_: string; _Default_: \/keys/certificate.pem @@ -672,7 +671,7 @@ Path to the certificate authority file. Path to the private key file. -*** +--- #### `databases` @@ -682,7 +681,6 @@ This configuration should be set before the database and table have been created \ The configuration will not create the directories in the path, that must be done by the user.\ - To define where a database and all its tables should reside use the name of your database and the `path` parameter. ```yaml @@ -711,7 +709,6 @@ databases: \ - **Setting the database section through the command line, environment variables or API** When using command line variables,environment variables or the API to configure the databases section a slightly different convention from the regular one should be used. To add one or more configurations use a JSON object array. @@ -732,15 +729,17 @@ Using the API: ```json { - "operation": "set_configuration", - "databases": [{ - "nameOfDatabase": { - "tables": { - "nameOfTable": { - "path": "/path/to/table" - } - } - } - }] + "operation": "set_configuration", + "databases": [ + { + "nameOfDatabase": { + "tables": { + "nameOfTable": { + "path": "/path/to/table" + } + } + } + } + ] } ``` diff --git a/site/versioned_docs/version-4.2/deployments/harperdb-cli.md b/site/versioned_docs/version-4.2/deployments/harperdb-cli.md index 333d9979..3a1b0428 100644 --- a/site/versioned_docs/version-4.2/deployments/harperdb-cli.md +++ b/site/versioned_docs/version-4.2/deployments/harperdb-cli.md @@ -35,7 +35,7 @@ harperdb install harperdb install --TC_AGREEMENT yes --HDB_ADMIN_USERNAME HDB_ADMIN --HDB_ADMIN_PASSWORD password --ROOTPATH /tmp/hdb/ --OPERATIONSAPI_NETWORK_PORT 9925 ``` -*** +--- ## Starting HarperDB @@ -45,7 +45,7 @@ To start HarperDB after it is installed, run the following command: harperdb start ``` -*** +--- ## Stopping HarperDB @@ -55,7 +55,7 @@ To stop HarperDB once it is running, run the following command: harperdb stop ``` -*** +--- ## Restarting HarperDB @@ -64,7 +64,8 @@ To restart HarperDB once it is running, run the following command: ```bash harperdb restart ``` -*** + +--- ## Getting the HarperDB Version diff --git a/site/versioned_docs/version-4.2/deployments/harperdb-cloud/alarms.md b/site/versioned_docs/version-4.2/deployments/harperdb-cloud/alarms.md index 03526fa8..8bf264d9 100644 --- a/site/versioned_docs/version-4.2/deployments/harperdb-cloud/alarms.md +++ b/site/versioned_docs/version-4.2/deployments/harperdb-cloud/alarms.md @@ -8,13 +8,13 @@ HarperDB Cloud instance alarms are triggered when certain conditions are met. On ### Heading Definitions -* **Alarm**: Title of the alarm. -* **Threshold**: Definition of the alarm threshold. -* **Intervals**: The number of occurrences before an alarm is triggered and the period that the metric is evaluated over. -* **Proposed Remedy**: Recommended solution to avoid the alert in the future. +- **Alarm**: Title of the alarm. +- **Threshold**: Definition of the alarm threshold. +- **Intervals**: The number of occurrences before an alarm is triggered and the period that the metric is evaluated over. +- **Proposed Remedy**: Recommended solution to avoid the alert in the future. -| Alarm | Threshold | Intervals | Proposed Remedy | -| ------- | ---------- | --------- | -------------------------------------------------------------------------------------------------------------------------------- | +| Alarm | Threshold | Intervals | Proposed Remedy | +| ------- | ---------- | --------- | ----------------------------------------------------------------------------------------------------------------------------- | | Storage | > 90% Disk | 1 x 5min | [Increased storage volume](../../administration/harperdb-studio/instance-configuration#update-instance-storage) | | CPU | > 90% Avg | 2 x 5min | [Increase instance size for additional CPUs](../../administration/harperdb-studio/instance-configuration#update-instance-ram) | | Memory | > 90% RAM | 2 x 5min | [Increase instance size](../../administration/harperdb-studio/instance-configuration#update-instance-ram) | diff --git a/site/versioned_docs/version-4.2/deployments/harperdb-cloud/iops-impact.md b/site/versioned_docs/version-4.2/deployments/harperdb-cloud/iops-impact.md index 8d1b952a..e2591631 100644 --- a/site/versioned_docs/version-4.2/deployments/harperdb-cloud/iops-impact.md +++ b/site/versioned_docs/version-4.2/deployments/harperdb-cloud/iops-impact.md @@ -28,15 +28,18 @@ For assistance in estimating IOPS requirements feel free to contact HarperDB Sup ## Example Use Case IOPS Requirements -* **Sensor Data Collection** +- **Sensor Data Collection** - In the case of IoT sensors where data collection will be sustained, high IOPS are required. While there are not typically large queries going on in this case, there is a high volume of data being ingested. This implies that IOPS will be sustained at a high level. For example, if you are collecting 100 records per second you would expect to need roughly 3,000 IOPS just to handle the data inserts. -* **Data Analytics/BI Server** + In the case of IoT sensors where data collection will be sustained, high IOPS are required. While there are not typically large queries going on in this case, there is a high volume of data being ingested. This implies that IOPS will be sustained at a high level. For example, if you are collecting 100 records per second you would expect to need roughly 3,000 IOPS just to handle the data inserts. - Providing a server for analytics purposes typically requires a larger machine. Typically these cases involve large scale SQL joins and aggregations, which puts a large strain on reads. HarperDB utilizes an in-memory cache, which provides a significant performance boost on machines with large amounts of memory. However, if disparate datasets are constantly being queried and/or new data is frequently being loaded, you will find that the system still needs to have high IOPS to meet performance demand. -* **Web Services** +- **Data Analytics/BI Server** - Typical web service implementations with discrete reads and writes often do not need high IOPS to perform as expected. This is often the case in more transactional systems without the requirement for high performance load. A good rule to follow is that any HarperDB operation that requires a data scan will be IOPS intensive, but if these are not frequent then the EBS boost will suffice. Queries utilizing equals operations in either SQL or NoSQL do not require a scan due to HarperDB’s native indexing. -* **High Performance Database** + Providing a server for analytics purposes typically requires a larger machine. Typically these cases involve large scale SQL joins and aggregations, which puts a large strain on reads. HarperDB utilizes an in-memory cache, which provides a significant performance boost on machines with large amounts of memory. However, if disparate datasets are constantly being queried and/or new data is frequently being loaded, you will find that the system still needs to have high IOPS to meet performance demand. - Ultimately, if performance is your top priority, HarperDB should be run on bare metal hardware. Cloud providers offer these options at a higher cost, but they come with obvious performance improvements. +- **Web Services** + + Typical web service implementations with discrete reads and writes often do not need high IOPS to perform as expected. This is often the case in more transactional systems without the requirement for high performance load. A good rule to follow is that any HarperDB operation that requires a data scan will be IOPS intensive, but if these are not frequent then the EBS boost will suffice. Queries utilizing equals operations in either SQL or NoSQL do not require a scan due to HarperDB’s native indexing. + +- **High Performance Database** + + Ultimately, if performance is your top priority, HarperDB should be run on bare metal hardware. Cloud providers offer these options at a higher cost, but they come with obvious performance improvements. diff --git a/site/versioned_docs/version-4.2/deployments/harperdb-cloud/verizon-5g-wavelength-instances.md b/site/versioned_docs/version-4.2/deployments/harperdb-cloud/verizon-5g-wavelength-instances.md index f2100f77..9c84cefa 100644 --- a/site/versioned_docs/version-4.2/deployments/harperdb-cloud/verizon-5g-wavelength-instances.md +++ b/site/versioned_docs/version-4.2/deployments/harperdb-cloud/verizon-5g-wavelength-instances.md @@ -28,4 +28,4 @@ AWS EBS gp2 volumes have a baseline performance level, which determines the numb Smaller gp2 volumes are perfect for trying out the functionality of HarperDB, and might also work well for applications that don’t perform many database transactions. For applications that perform a moderate or high number of transactions, we recommend that you use a larger HarperDB volume. Learn more about the [impact of IOPS on performance here](./iops-impact). -You can read more about [AWS EBS gp2 volume IOPS here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html#ebsvolumetypes\_gp2). +You can read more about [AWS EBS gp2 volume IOPS here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html#ebsvolumetypes_gp2). diff --git a/site/versioned_docs/version-4.2/deployments/install-harperdb/index.md b/site/versioned_docs/version-4.2/deployments/install-harperdb/index.md index a131c3c7..2f90fd5b 100644 --- a/site/versioned_docs/version-4.2/deployments/install-harperdb/index.md +++ b/site/versioned_docs/version-4.2/deployments/install-harperdb/index.md @@ -57,7 +57,7 @@ For more information visit the [HarperDB Command Line Interface](../harperdb-cli HarperDB comes with binaries for standard AMD64/x64 or ARM64 CPU architectures on Linux, Windows (x64 only), and Mac (including Apple Silicon). However, if you are installing on a less common platform (Alpine, for example), you will need to ensure that you have build tools installed for the installation process to compile the binaries (this is handled automatically), including: -* [Go](https://go.dev/dl/): version 1.19.1 -* GCC -* Make -* Python v3.7, v3.8, v3.9, or v3.10 +- [Go](https://go.dev/dl/): version 1.19.1 +- GCC +- Make +- Python v3.7, v3.8, v3.9, or v3.10 diff --git a/site/versioned_docs/version-4.2/deployments/install-harperdb/linux.md b/site/versioned_docs/version-4.2/deployments/install-harperdb/linux.md index 1d0013b5..6b87d34e 100644 --- a/site/versioned_docs/version-4.2/deployments/install-harperdb/linux.md +++ b/site/versioned_docs/version-4.2/deployments/install-harperdb/linux.md @@ -8,7 +8,7 @@ If you wish to install locally or already have a configured server, see the basi The following is a recommended way to configure Linux and install HarperDB. These instructions should work reasonably well for any public cloud or on-premises Linux instance. -*** +--- These instructions assume that the following has already been completed: @@ -22,7 +22,7 @@ While you will need to access HarperDB through port 9925 for the administration For this example, we will use an AWS Ubuntu Server 22.04 LTS m5.large EC2 Instance with an additional General Purpose SSD EBS volume and the default “ubuntu” user account. -*** +--- ### (Optional) LVM Configuration @@ -85,7 +85,7 @@ Run `lsblk` and note the device name of the additional volume lsblk ``` -Create an ext4 filesystem on the volume (The below commands assume the device name is nvme1n1. If you used LVM to create logical volume, replace /dev/nvme1n1 with /dev/hdb\_vg/hdb\_lv) +Create an ext4 filesystem on the volume (The below commands assume the device name is nvme1n1. If you used LVM to create logical volume, replace /dev/nvme1n1 with /dev/hdb_vg/hdb_lv) ```bash sudo mkfs.ext4 -L hdb_data /dev/nvme1n1 diff --git a/site/versioned_docs/version-4.2/deployments/upgrade-hdb-instance.md b/site/versioned_docs/version-4.2/deployments/upgrade-hdb-instance.md index b5f54570..3fd61cfd 100644 --- a/site/versioned_docs/version-4.2/deployments/upgrade-hdb-instance.md +++ b/site/versioned_docs/version-4.2/deployments/upgrade-hdb-instance.md @@ -12,10 +12,11 @@ Upgrading HarperDB is a two-step process. First the latest version of HarperDB m 1. Install the latest version of HarperDB using `npm install -g harperdb`. - Note `-g` should only be used if you installed HarperDB globally (which is recommended). + Note `-g` should only be used if you installed HarperDB globally (which is recommended). + 1. Run `harperdb` to initiate the upgrade process. - HarperDB will then prompt you for all appropriate inputs and then run the upgrade directives. + HarperDB will then prompt you for all appropriate inputs and then run the upgrade directives. ## Node Version Manager (nvm) diff --git a/site/versioned_docs/version-4.2/developers/_category_.json b/site/versioned_docs/version-4.2/developers/_category_.json index 9fe399bf..fdc723e5 100644 --- a/site/versioned_docs/version-4.2/developers/_category_.json +++ b/site/versioned_docs/version-4.2/developers/_category_.json @@ -1,12 +1,10 @@ { - "label": "Developers", - "position": 1, - "link": { - "type": "generated-index", - "title": "Developers Documentation", - "description": "Comprehensive guides and references for building applications with HarperDB", - "keywords": [ - "developers" - ] - } -} \ No newline at end of file + "label": "Developers", + "position": 1, + "link": { + "type": "generated-index", + "title": "Developers Documentation", + "description": "Comprehensive guides and references for building applications with HarperDB", + "keywords": ["developers"] + } +} diff --git a/site/versioned_docs/version-4.2/developers/applications/caching.md b/site/versioned_docs/version-4.2/developers/applications/caching.md index f6181c30..fe0465fd 100644 --- a/site/versioned_docs/version-4.2/developers/applications/caching.md +++ b/site/versioned_docs/version-4.2/developers/applications/caching.md @@ -29,8 +29,8 @@ Next, you need to define the source for your cache. External data sources could ```javascript class ThirdPartyAPI extends Resource { async get() { - return (await fetch(`https://some-api.com/${this.getId()}`)).json(); - } + return (await fetch(`https://some-api.com/${this.getId()}`)).json(); + } } ``` @@ -65,11 +65,11 @@ In the example above, we simply retrieved data to fulfill a cache request. We ma ```javascript class ThirdPartyAPI extends Resource { - async get() { - let response = await fetch(`https://some-api.com/${this.getId()}`); - this.getContext().lastModified = response.headers.get('Last-Modified'); - return response.json(); - } + async get() { + let response = await fetch(`https://some-api.com/${this.getId()}`); + this.getContext().lastModified = response.headers.get('Last-Modified'); + return response.json(); + } } ``` @@ -105,10 +105,11 @@ One way to provide more active caching is to specifically invalidate individual ```javascript const { MyTable } = tables; export class MyTableEndpoint extends MyTable { - async post(data) { - if (data.invalidate) // use this flag as a marker - this.invalidate(); - } + async post(data) { + if (data.invalidate) + // use this flag as a marker + this.invalidate(); + } } ``` @@ -139,20 +140,20 @@ class ThirdPartyAPI extends Resource { Notification events should always include an `id` to indicate the primary key of the updated record. The event should have a `value` for `put` and `message` event types. The `timestamp` is optional and can be used to indicate the exact timestamp of the change. The following event `type`s are supported: -* `put` - This indicates that the record has been updated and provides the new value of the record -* `invalidate` - Alternately, you can notify with an event type of `invalidate` to indicate that the data has changed, but without the overhead of actually sending the data (the `value` property is not needed), so the data only needs to be sent if and when the data is requested through the cache. An `invalidate` will evict the entry and update the timestamp to indicate that there is new data that should be requested (if needed). -* `delete` - This indicates that the record has been deleted. -* `message` - This indicates a message is being passed through the record. The record value has not changed, but this is used for [publish/subscribe messaging](../real-time). -* `transaction` - This indicates that there are multiple writes that should be treated as a single atomic transaction. These writes should be included as an array of data notification events in the `writes` property. +- `put` - This indicates that the record has been updated and provides the new value of the record +- `invalidate` - Alternately, you can notify with an event type of `invalidate` to indicate that the data has changed, but without the overhead of actually sending the data (the `value` property is not needed), so the data only needs to be sent if and when the data is requested through the cache. An `invalidate` will evict the entry and update the timestamp to indicate that there is new data that should be requested (if needed). +- `delete` - This indicates that the record has been deleted. +- `message` - This indicates a message is being passed through the record. The record value has not changed, but this is used for [publish/subscribe messaging](../real-time). +- `transaction` - This indicates that there are multiple writes that should be treated as a single atomic transaction. These writes should be included as an array of data notification events in the `writes` property. And the following properties can be defined on event objects: -* `type`: The event type as described above. -* `id`: The primary key of the record that updated -* `value`: The new value of the record that updated (for put and message) -* `writes`: An array of event properties that are part of a transaction (used in conjunction with the transaction event type). -* `table`: The name of the table with the record that was updated. This can be used with events within a transaction to specify events across multiple tables. -* `timestamp`: The timestamp of when the data change occurred +- `type`: The event type as described above. +- `id`: The primary key of the record that updated +- `value`: The new value of the record that updated (for put and message) +- `writes`: An array of event properties that are part of a transaction (used in conjunction with the transaction event type). +- `table`: The name of the table with the record that was updated. This can be used with events within a transaction to specify events across multiple tables. +- `timestamp`: The timestamp of when the data change occurred With an active external data source with a `subscribe` method, the data source will proactively notify the cache, ensuring a fresh and efficient active cache. Note that with an active data source, we still use the `sourcedFrom` method to register the source for a caching table, and the table will automatically detect and call the subscribe method on the data source. @@ -171,13 +172,13 @@ An alternative to using asynchronous generators is to use a subscription stream ```javascript class ThirdPartyAPI extends Resource { - subscribe() { - const subscription = super.subscribe(); - setupListeningToRemoteService().on('update', (event) => { - subscription.send(event); - }); - return subscription; - } + subscribe() { + const subscription = super.subscribe(); + setupListeningToRemoteService().on('update', (event) => { + subscription.send(event); + }); + return subscription; + } } ``` @@ -213,12 +214,12 @@ When you are using a caching table, it is important to remember that any resourc ```javascript class MyCache extends tables.MyCache { - async post(data) { - // if the data is not cached locally, retrieves from source: - await this.ensuredLoaded(); - // now we can be sure that the data is loaded, and can access properties - this.quantity = this.quantity - data.purchases; - } + async post(data) { + // if the data is not cached locally, retrieves from source: + await this.ensuredLoaded(); + // now we can be sure that the data is loaded, and can access properties + this.quantity = this.quantity - data.purchases; + } } ``` diff --git a/site/versioned_docs/version-4.2/developers/applications/debugging.md b/site/versioned_docs/version-4.2/developers/applications/debugging.md index ca03115f..d37d9074 100644 --- a/site/versioned_docs/version-4.2/developers/applications/debugging.md +++ b/site/versioned_docs/version-4.2/developers/applications/debugging.md @@ -18,13 +18,13 @@ For local debugging and development, it is recommended that you use standard con HarperDB Logger Functions -* `trace(message)`: Write a 'trace' level log, if the configured level allows for it. -* `debug(message)`: Write a 'debug' level log, if the configured level allows for it. -* `info(message)`: Write a 'info' level log, if the configured level allows for it. -* `warn(message)`: Write a 'warn' level log, if the configured level allows for it. -* `error(message)`: Write a 'error' level log, if the configured level allows for it. -* `fatal(message)`: Write a 'fatal' level log, if the configured level allows for it. -* `notify(message)`: Write a 'notify' level log. +- `trace(message)`: Write a 'trace' level log, if the configured level allows for it. +- `debug(message)`: Write a 'debug' level log, if the configured level allows for it. +- `info(message)`: Write a 'info' level log, if the configured level allows for it. +- `warn(message)`: Write a 'warn' level log, if the configured level allows for it. +- `error(message)`: Write a 'error' level log, if the configured level allows for it. +- `fatal(message)`: Write a 'fatal' level log, if the configured level allows for it. +- `notify(message)`: Write a 'notify' level log. For example, you can log a warning: diff --git a/site/versioned_docs/version-4.2/developers/applications/define-routes.md b/site/versioned_docs/version-4.2/developers/applications/define-routes.md index a22e4148..bb100ba1 100644 --- a/site/versioned_docs/version-4.2/developers/applications/define-routes.md +++ b/site/versioned_docs/version-4.2/developers/applications/define-routes.md @@ -16,23 +16,23 @@ fastifyRoutes: # This loads files that define fastify routes using fastify's aut By default, route URLs are configured to be: -* \[**Instance URL**]:\[**Custom Functions Port**]/\[**Project Name**]/\[**Route URL**] +- \[**Instance URL**]:\[**Custom Functions Port**]/\[**Project Name**]/\[**Route URL**] However, you can specify the path to be `/` if you wish to have your routes handling the root path of incoming URLs. -* The route below, using the default config, within the **dogs** project, with a route of **breeds** would be available at **http:/localhost:9926/dogs/breeds**. +- The route below, using the default config, within the **dogs** project, with a route of **breeds** would be available at **http:/localhost:9926/dogs/breeds**. In effect, this route is just a pass-through to HarperDB. The same result could have been achieved by hitting the core HarperDB API, since it uses **hdbCore.preValidation** and **hdbCore.request**, which are defined in the “helper methods” section, below. ```javascript export default async (server, { hdbCore, logger }) => { - server.route({ - url: '/', - method: 'POST', - preValidation: hdbCore.preValidation, - handler: hdbCore.request, - }) -} + server.route({ + url: '/', + method: 'POST', + preValidation: hdbCore.preValidation, + handler: hdbCore.request, + }); +}; ``` ## Custom Handlers @@ -69,20 +69,20 @@ Below is an example of a route that uses a custom validation hook: import customValidation from '../helpers/customValidation'; export default async (server, { hdbCore, logger }) => { - server.route({ - url: '/:id', - method: 'GET', - preValidation: (request) => customValidation(request, logger), - handler: (request) => { - request.body= { - operation: 'sql', - sql: `SELECT * FROM dev.dog WHERE id = ${request.params.id}` - }; - - return hdbCore.requestWithoutAuthentication(request); - } - }); -} + server.route({ + url: '/:id', + method: 'GET', + preValidation: (request) => customValidation(request, logger), + handler: (request) => { + request.body = { + operation: 'sql', + sql: `SELECT * FROM dev.dog WHERE id = ${request.params.id}`, + }; + + return hdbCore.requestWithoutAuthentication(request); + }, + }); +}; ``` Notice we imported customValidation from the **helpers** directory. To include a helper, and to see the actual code within customValidation, see [Helper Methods](#helper-methods). @@ -95,24 +95,25 @@ When declaring routes, you are given access to 2 helper methods: hdbCore and log hdbCore contains three functions that allow you to authenticate an inbound request, and execute operations against HarperDB directly, by passing the standard Operations API. -* **preValidation** +- **preValidation** + + This is an array of functions used for fastify authentication. The second function takes the authorization header from the inbound request and executes the same authentication as the standard HarperDB Operations API (for example, `hdbCore.preValidation[1](./req, resp, callback)`). It will determine if the user exists, and if they are allowed to perform this operation. **If you use the request method, you have to use preValidation to get the authenticated user**. - This is an array of functions used for fastify authentication. The second function takes the authorization header from the inbound request and executes the same authentication as the standard HarperDB Operations API (for example, `hdbCore.preValidation[1](./req, resp, callback)`). It will determine if the user exists, and if they are allowed to perform this operation. **If you use the request method, you have to use preValidation to get the authenticated user**. -* **request** +- **request** - This will execute a request with HarperDB using the operations API. The `request.body` should contain a standard HarperDB operation and must also include the `hdb_user` property that was in `request.body` provided in the callback. -* **requestWithoutAuthentication** + This will execute a request with HarperDB using the operations API. The `request.body` should contain a standard HarperDB operation and must also include the `hdb_user` property that was in `request.body` provided in the callback. - Executes a request against HarperDB without any security checks around whether the inbound user is allowed to make this request. For security purposes, you should always take the following precautions when using this method: +- **requestWithoutAuthentication** - * Properly handle user-submitted values, including url params. User-submitted values should only be used for `search_value` and for defining values in records. Special care should be taken to properly escape any values if user-submitted values are used for SQL. + Executes a request against HarperDB without any security checks around whether the inbound user is allowed to make this request. For security purposes, you should always take the following precautions when using this method: + - Properly handle user-submitted values, including url params. User-submitted values should only be used for `search_value` and for defining values in records. Special care should be taken to properly escape any values if user-submitted values are used for SQL. **logger** This helper allows you to write directly to the log file, hdb.log. It’s useful for debugging during development, although you may also use the console logger. There are 5 functions contained within logger, each of which pertains to a different **logging.level** configuration in your harperdb-config.yaml file. -* logger.trace(‘Starting the handler for /dogs’) -* logger.debug(‘This should only fire once’) -* logger.warn(‘This should never ever fire’) -* logger.error(‘This did not go well’) -* logger.fatal(‘This did not go very well at all’) +- logger.trace(‘Starting the handler for /dogs’) +- logger.debug(‘This should only fire once’) +- logger.warn(‘This should never ever fire’) +- logger.error(‘This did not go well’) +- logger.fatal(‘This did not go very well at all’) diff --git a/site/versioned_docs/version-4.2/developers/applications/defining-schemas.md b/site/versioned_docs/version-4.2/developers/applications/defining-schemas.md index 61ef5fd2..5c32e20e 100644 --- a/site/versioned_docs/version-4.2/developers/applications/defining-schemas.md +++ b/site/versioned_docs/version-4.2/developers/applications/defining-schemas.md @@ -40,10 +40,10 @@ type TableName @table By default the table name is inherited from the type name (in this case the table name would be "TableName"). The `@table` directive supports several optional arguments (all of these are optional and can be freely combined): -* `@table(table: "table_name")` - This allows you to explicitly specify the table name. -* `@table(database: "database_name")` - This allows you to specify which database the table belongs to. This defaults to the "data" database. -* `@table(expiration: 3600)` - Sets an expiration time on entries in the table before they are automatically cleared (primarily useful for caching tables). This is specified in seconds. -* `@table(audit: true)` - This enables the audit log for the table so that a history of record changes are recorded. This defaults to [configuration file's setting for `auditLog`](../../deployments/configuration#logging). +- `@table(table: "table_name")` - This allows you to explicitly specify the table name. +- `@table(database: "database_name")` - This allows you to specify which database the table belongs to. This defaults to the "data" database. +- `@table(expiration: 3600)` - Sets an expiration time on entries in the table before they are automatically cleared (primarily useful for caching tables). This is specified in seconds. +- `@table(audit: true)` - This enables the audit log for the table so that a history of record changes are recorded. This defaults to [configuration file's setting for `auditLog`](../../deployments/configuration#logging). #### `@export` @@ -89,14 +89,14 @@ If you do not define a schema for a table and create a table through the operati HarperDB supports the following field types in addition to user defined (object) types: -* String: String/text. -* Int: A 32-bit signed integer (from -2147483648 to 2147483647). -* Long: A 54-bit signed integer (from -9007199254740992 to 9007199254740992). -* Float: Any number (any number that can be represented as a [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision\_floating-point\_format). Note that all numbers are stored in the most compact representation available). -* Boolean: true or false. -* ID: A string (but indicates it is not intended to be legible). -* Any: Any primitive, object, or array is allowed. -* Date: A Date object. +- String: String/text. +- Int: A 32-bit signed integer (from -2147483648 to 2147483647). +- Long: A 54-bit signed integer (from -9007199254740992 to 9007199254740992). +- Float: Any number (any number that can be represented as a [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision_floating-point_format). Note that all numbers are stored in the most compact representation available). +- Boolean: true or false. +- ID: A string (but indicates it is not intended to be legible). +- Any: Any primitive, object, or array is allowed. +- Date: A Date object. #### Renaming Tables diff --git a/site/versioned_docs/version-4.2/developers/applications/example-projects.md b/site/versioned_docs/version-4.2/developers/applications/example-projects.md index 5bd07e77..1b90c862 100644 --- a/site/versioned_docs/version-4.2/developers/applications/example-projects.md +++ b/site/versioned_docs/version-4.2/developers/applications/example-projects.md @@ -6,32 +6,32 @@ title: Example Projects **Library of example HarperDB applications and components:** -* [Authorization in HarperDB using Okta Customer Identity Cloud](https://www.harperdb.io/post/authorization-in-harperdb-using-okta-customer-identity-cloud), by Yitaek Hwang +- [Authorization in HarperDB using Okta Customer Identity Cloud](https://www.harperdb.io/post/authorization-in-harperdb-using-okta-customer-identity-cloud), by Yitaek Hwang -* [How to Speed Up your Applications by Caching at the Edge with HarperDB](https://dev.to/doabledanny/how-to-speed-up-your-applications-by-caching-at-the-edge-with-harperdb-3o2l), by Danny Adams +- [How to Speed Up your Applications by Caching at the Edge with HarperDB](https://dev.to/doabledanny/how-to-speed-up-your-applications-by-caching-at-the-edge-with-harperdb-3o2l), by Danny Adams -* [OAuth Authentication in HarperDB using Auth0 & Node.js](https://www.harperdb.io/post/oauth-authentication-in-harperdb-using-auth0-and-node-js), by Lucas Santos +- [OAuth Authentication in HarperDB using Auth0 & Node.js](https://www.harperdb.io/post/oauth-authentication-in-harperdb-using-auth0-and-node-js), by Lucas Santos -* [How To Create a CRUD API with Next.js & HarperDB Custom Functions](https://www.harperdb.io/post/create-a-crud-api-w-next-js-harperdb), by Colby Fayock +- [How To Create a CRUD API with Next.js & HarperDB Custom Functions](https://www.harperdb.io/post/create-a-crud-api-w-next-js-harperdb), by Colby Fayock -* [Build a Dynamic REST API with Custom Functions](https://harperdb.io/blog/build-a-dynamic-rest-api-with-custom-functions/), by Terra Roush +- [Build a Dynamic REST API with Custom Functions](https://harperdb.io/blog/build-a-dynamic-rest-api-with-custom-functions/), by Terra Roush -* [How to use HarperDB Custom Functions to Build your Entire Backend](https://dev.to/andrewbaisden/how-to-use-harperdb-custom-functions-to-build-your-entire-backend-a2m), by Andrew Baisden +- [How to use HarperDB Custom Functions to Build your Entire Backend](https://dev.to/andrewbaisden/how-to-use-harperdb-custom-functions-to-build-your-entire-backend-a2m), by Andrew Baisden -* [Using TensorFlowJS & HarperDB Custom Functions for Machine Learning](https://harperdb.io/blog/using-tensorflowjs-harperdb-for-machine-learning/), by Kevin Ashcraft +- [Using TensorFlowJS & HarperDB Custom Functions for Machine Learning](https://harperdb.io/blog/using-tensorflowjs-harperdb-for-machine-learning/), by Kevin Ashcraft -* [Build & Deploy a Fitness App with Python & HarperDB](https://www.youtube.com/watch?v=KMkmA4i2FQc), by Patrick Löber +- [Build & Deploy a Fitness App with Python & HarperDB](https://www.youtube.com/watch?v=KMkmA4i2FQc), by Patrick Löber -* [Create a Discord Slash Bot using HarperDB Custom Functions](https://geekysrm.hashnode.dev/discord-slash-bot-with-harperdb-custom-functions), by Soumya Ranjan Mohanty +- [Create a Discord Slash Bot using HarperDB Custom Functions](https://geekysrm.hashnode.dev/discord-slash-bot-with-harperdb-custom-functions), by Soumya Ranjan Mohanty -* [How I used HarperDB Custom Functions to Build a Web App for my Newsletter](https://blog.hrithwik.me/how-i-used-harperdb-custom-functions-to-build-a-web-app-for-my-newsletter), by Hrithwik Bharadwaj +- [How I used HarperDB Custom Functions to Build a Web App for my Newsletter](https://blog.hrithwik.me/how-i-used-harperdb-custom-functions-to-build-a-web-app-for-my-newsletter), by Hrithwik Bharadwaj -* [How I used HarperDB Custom Functions and Recharts to create Dashboard](https://blog.greenroots.info/how-to-create-dashboard-with-harperdb-custom-functions-and-recharts), by Tapas Adhikary +- [How I used HarperDB Custom Functions and Recharts to create Dashboard](https://blog.greenroots.info/how-to-create-dashboard-with-harperdb-custom-functions-and-recharts), by Tapas Adhikary -* [How To Use HarperDB Custom Functions With Your React App](https://dev.to/tyaga001/how-to-use-harperdb-custom-functions-with-your-react-app-2c43), by Ankur Tyagi +- [How To Use HarperDB Custom Functions With Your React App](https://dev.to/tyaga001/how-to-use-harperdb-custom-functions-with-your-react-app-2c43), by Ankur Tyagi -* [Build a Web App Using HarperDB’s Custom Functions](https://www.youtube.com/watch?v=rz6prItVJZU), livestream by Jaxon Repp +- [Build a Web App Using HarperDB’s Custom Functions](https://www.youtube.com/watch?v=rz6prItVJZU), livestream by Jaxon Repp -* [How to Web Scrape Using Python, Snscrape & Custom Functions](https://hackernoon.com/how-to-web-scrape-using-python-snscrape-and-harperdb), by Davis David +- [How to Web Scrape Using Python, Snscrape & Custom Functions](https://hackernoon.com/how-to-web-scrape-using-python-snscrape-and-harperdb), by Davis David -* [What’s the Big Deal w/ Custom Functions](https://rss.com/podcasts/harperdb-select-star/278933/), Select* Podcast +- [What’s the Big Deal w/ Custom Functions](https://rss.com/podcasts/harperdb-select-star/278933/), Select\* Podcast diff --git a/site/versioned_docs/version-4.2/developers/applications/index.md b/site/versioned_docs/version-4.2/developers/applications/index.md index 11c30d12..2854e629 100644 --- a/site/versioned_docs/version-4.2/developers/applications/index.md +++ b/site/versioned_docs/version-4.2/developers/applications/index.md @@ -14,7 +14,7 @@ When working through this guide, we recommend you use the [HarperDB Application ## Understanding the Component Application Architecture -HarperDB provides several types of components. Any package that is added to HarperDB is called a "component", and components are generally categorized as either "applications", which deliver a set of endpoints for users, or "extensions", which are building blocks for features like authentication, additional protocols, and connectors that can be used by other components. Components can be added to the `hdb/components` directory and will be loaded by HarperDB when it starts. Components that are remotely deployed to HarperDB (through the studio or the operation API) are installed into the hdb/node\_modules directory. Using `harperdb run .` or `harperdb dev .` allows us to specifically load a certain application in addition to any that have been manually added to `hdb/components` or installed in `node_modules`. +HarperDB provides several types of components. Any package that is added to HarperDB is called a "component", and components are generally categorized as either "applications", which deliver a set of endpoints for users, or "extensions", which are building blocks for features like authentication, additional protocols, and connectors that can be used by other components. Components can be added to the `hdb/components` directory and will be loaded by HarperDB when it starts. Components that are remotely deployed to HarperDB (through the studio or the operation API) are installed into the hdb/node_modules directory. Using `harperdb run .` or `harperdb dev .` allows us to specifically load a certain application in addition to any that have been manually added to `hdb/components` or installed in `node_modules`. ```mermaid flowchart LR @@ -68,8 +68,9 @@ To create your own application from scratch, you'll may want to initialize it as Here's an example for a github repo: ```shell -> git remote set-url origin git@github.com:// +> git remote set-url origin git@github.com:// ``` + Locally developing your application and then committing your app to a source control is a great way to manage your code and configuration, and then you can [directly deploy from your repository](#deploying-your-application). @@ -185,7 +186,7 @@ If-None-Match: "etag-id" # browsers can automatically provide this ## Querying -Querying your application database is straightforward and easy, as tables exported with the `@export` directive are automatically exposed via [REST endpoints](../rest). Simple queries can be crafted through [URL query parameters](https://en.wikipedia.org/wiki/Query\_string). +Querying your application database is straightforward and easy, as tables exported with the `@export` directive are automatically exposed via [REST endpoints](../rest). Simple queries can be crafted through [URL query parameters](https://en.wikipedia.org/wiki/Query_string). In order to maintain reasonable query speed on a database as it grows in size, it is critical to select and establish the proper indexes. So, before we add the `@export` declaration to our `Dog` table and begin querying it, let's take a moment to target some table properties for indexing. We'll use `name` and `breed` as indexed table properties on our `Dog` table. All we need to do to accomplish this is tag these properties with the `@indexed` directive: @@ -227,9 +228,9 @@ Congratulations, you now have created a secure database application backend with This guide assumes that you're building a HarperDB application locally. If you have a cloud instance available, you can deploy it by doing the following: -* Commit and push your application component directory code (i.e., the `my-app` directory) to a Github repo. In this tutorial we started with a clone of the application-template. To commit and push to your own repository, change the origin to your repo: `git remote set-url origin git@github.com:your-account/your-repo.git` -* Go to the applications section of your target cloud instance in the [HarperDB Studio](https://studio.harperdb.io) -* In the left-hand menu of the applications IDE, click 'deploy' and specify a package location reference that follows the [npm package specification](https://docs.npmjs.com/cli/v8/using-npm/package-spec) (i.e., a string like `HarperDB/Application-Template` or a URL like `https://github.com/HarperDB/application-template`, for example, that npm knows how to install). +- Commit and push your application component directory code (i.e., the `my-app` directory) to a Github repo. In this tutorial we started with a clone of the application-template. To commit and push to your own repository, change the origin to your repo: `git remote set-url origin git@github.com:your-account/your-repo.git` +- Go to the applications section of your target cloud instance in the [HarperDB Studio](https://studio.harperdb.io) +- In the left-hand menu of the applications IDE, click 'deploy' and specify a package location reference that follows the [npm package specification](https://docs.npmjs.com/cli/v8/using-npm/package-spec) (i.e., a string like `HarperDB/Application-Template` or a URL like `https://github.com/HarperDB/application-template`, for example, that npm knows how to install). You can also deploy your application from your repository by directly using the [`deploy_component` operation](../operations-api/components#deploy-component). @@ -291,8 +292,7 @@ Here we have focused on customizing how we retrieve data, but we may also want t ```javascript export class CustomDog extends Dog { async post(data) { - if (data.action === 'add-trick') - this.tricks.push(data.trick); + if (data.action === 'add-trick') this.tricks.push(data.trick); } } ``` @@ -329,9 +329,10 @@ We can also directly implement the Resource class and use it to create new data ```javascript const { Breed } = tables; // our Breed table -class BreedSource extends Resource { // define a data source +class BreedSource extends Resource { + // define a data source async get() { - return (await fetch(`https://best-dog-site.com/${this.getId()}`)).json(); + return (await fetch(`https://best-dog-site.com/${this.getId()}`)).json(); } } // define that our breed table is a cache of data from the data source above, with a specified expiration @@ -350,10 +351,10 @@ This config file allows you define a location for static files, as well (that ar Each configuration entry can have the following properties, in addition to properties that may be specific to the individual component: -* `files`: This specifies the set of files that should be handled the component. This is a glob pattern, so a set of files can be specified like "directory/**". -* `path`: This is the URL path that is handled by this component. -* `root`: This specifies the root directory for mapping file paths to the URLs. For example, if you want all the files in `web/**` to be available in the root URL path via the static handler, you could specify a root of `web`, to indicate that the web directory maps to the root URL path. -* `package`: This is used to specify that this component is a third party package, and can be loaded from the specified package reference (which can be an NPM package, Github reference, URL, etc.). +- `files`: This specifies the set of files that should be handled the component. This is a glob pattern, so a set of files can be specified like "directory/\*\*". +- `path`: This is the URL path that is handled by this component. +- `root`: This specifies the root directory for mapping file paths to the URLs. For example, if you want all the files in `web/**` to be available in the root URL path via the static handler, you could specify a root of `web`, to indicate that the web directory maps to the root URL path. +- `package`: This is used to specify that this component is a third party package, and can be loaded from the specified package reference (which can be an NPM package, Github reference, URL, etc.). ## Define Fastify Routes diff --git a/site/versioned_docs/version-4.2/developers/clustering/certificate-management.md b/site/versioned_docs/version-4.2/developers/clustering/certificate-management.md index 58243cb7..e77a9a1c 100644 --- a/site/versioned_docs/version-4.2/developers/clustering/certificate-management.md +++ b/site/versioned_docs/version-4.2/developers/clustering/certificate-management.md @@ -34,7 +34,7 @@ Since these new certificates can be issued with correct CNs, you should set `ins ### Certificate Requirements -* Certificates must have an `Extended Key Usage` that defines both `TLS Web Server Authentication` and `TLS Web Client Authentication` as these certificates will be used to accept connections from other HarperDB nodes and to make requests to other HarperDB nodes. Example: +- Certificates must have an `Extended Key Usage` that defines both `TLS Web Server Authentication` and `TLS Web Client Authentication` as these certificates will be used to accept connections from other HarperDB nodes and to make requests to other HarperDB nodes. Example: ``` X509v3 Key Usage: critical @@ -43,8 +43,8 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication ``` -* If you are using an intermediate CA to issue the certificates, the entire certificate chain (to the root CA) must be included in the `certificateAuthority` file. -* If your certificates expire you will need a way to issue new certificates to the nodes and then restart HarperDB. If you are using a public CA such as LetsEncrypt, a tool like `certbot` can be used to renew certificates. +- If you are using an intermediate CA to issue the certificates, the entire certificate chain (to the root CA) must be included in the `certificateAuthority` file. +- If your certificates expire you will need a way to issue new certificates to the nodes and then restart HarperDB. If you are using a public CA such as LetsEncrypt, a tool like `certbot` can be used to renew certificates. ### Certificate Troubleshooting diff --git a/site/versioned_docs/version-4.2/developers/clustering/creating-a-cluster-user.md b/site/versioned_docs/version-4.2/developers/clustering/creating-a-cluster-user.md index 3edecd29..7865ae1c 100644 --- a/site/versioned_docs/version-4.2/developers/clustering/creating-a-cluster-user.md +++ b/site/versioned_docs/version-4.2/developers/clustering/creating-a-cluster-user.md @@ -16,11 +16,11 @@ There are multiple ways a `cluster_user` can be created, they are: ```json { - "operation": "add_user", - "role": "cluster_user", - "username": "cluster_account", - "password": "letsCluster123!", - "active": true + "operation": "add_user", + "role": "cluster_user", + "username": "cluster_account", + "password": "letsCluster123!", + "active": true } ``` @@ -30,8 +30,8 @@ This can be done through the API by calling `set_configuration` or by editing th ```json { - "operation": "set_configuration", - "clustering_user": "cluster_account" + "operation": "set_configuration", + "clustering_user": "cluster_account" } ``` diff --git a/site/versioned_docs/version-4.2/developers/clustering/enabling-clustering.md b/site/versioned_docs/version-4.2/developers/clustering/enabling-clustering.md index 6b563b19..596665d9 100644 --- a/site/versioned_docs/version-4.2/developers/clustering/enabling-clustering.md +++ b/site/versioned_docs/version-4.2/developers/clustering/enabling-clustering.md @@ -23,8 +23,8 @@ _Note: When making any changes to the `harperdb-config.yaml` file HarperDB must ```json { - "operation": "set_configuration", - "clustering_enabled": true + "operation": "set_configuration", + "clustering_enabled": true } ``` diff --git a/site/versioned_docs/version-4.2/developers/clustering/establishing-routes.md b/site/versioned_docs/version-4.2/developers/clustering/establishing-routes.md index 915c2844..abe415a5 100644 --- a/site/versioned_docs/version-4.2/developers/clustering/establishing-routes.md +++ b/site/versioned_docs/version-4.2/developers/clustering/establishing-routes.md @@ -43,9 +43,9 @@ There are multiple ways to set routes, they are: ```json { - "operation": "cluster_set_routes", - "server": "hub", - "routes":[ {"host": "3.735.184.8", "port": 9932} ] + "operation": "cluster_set_routes", + "server": "hub", + "routes": [{ "host": "3.735.184.8", "port": 9932 }] } ``` @@ -67,7 +67,7 @@ The API also has `cluster_get_routes` for getting all routes in the config and ` ```json { - "operation": "cluster_delete_routes", - "routes":[ {"host": "3.735.184.8", "port": 9932} ] + "operation": "cluster_delete_routes", + "routes": [{ "host": "3.735.184.8", "port": 9932 }] } ``` diff --git a/site/versioned_docs/version-4.2/developers/clustering/index.md b/site/versioned_docs/version-4.2/developers/clustering/index.md index f5949afd..dfcdac11 100644 --- a/site/versioned_docs/version-4.2/developers/clustering/index.md +++ b/site/versioned_docs/version-4.2/developers/clustering/index.md @@ -8,24 +8,24 @@ HarperDB clustering is the process of connecting multiple HarperDB databases tog HarperDB’s clustering engine replicates data between instances of HarperDB using a highly performant, bi-directional pub/sub model on a per-table basis. Data replicates asynchronously with eventual consistency across the cluster following the defined pub/sub configuration. Individual transactions are sent in the order in which they were transacted, once received by the destination instance, they are processed in an ACID-compliant manner. Conflict resolution follows a last writer wins model based on recorded transaction time on the transaction and the timestamp on the record on the node. -*** +--- ### Common Use Case A common use case is an edge application collecting and analyzing sensor data that creates an alert if a sensor value exceeds a given threshold: -* The edge application should not be making outbound http requests for security purposes. -* There may not be a reliable network connection. -* Not all sensor data will be sent to the cloud--either because of the unreliable network connection, or maybe it’s just a pain to store it. -* The edge node should be inaccessible from outside the firewall. -* The edge node will send alerts to the cloud with a snippet of sensor data containing the offending sensor readings. +- The edge application should not be making outbound http requests for security purposes. +- There may not be a reliable network connection. +- Not all sensor data will be sent to the cloud--either because of the unreliable network connection, or maybe it’s just a pain to store it. +- The edge node should be inaccessible from outside the firewall. +- The edge node will send alerts to the cloud with a snippet of sensor data containing the offending sensor readings. HarperDB simplifies the architecture of such an application with its bi-directional, table-level replication: -* The edge instance subscribes to a “thresholds” table on the cloud instance, so the application only makes localhost calls to get the thresholds. -* The application continually pushes sensor data into a “sensor\_data” table via the localhost API, comparing it to the threshold values as it does so. -* When a threshold violation occurs, the application adds a record to the “alerts” table. -* The application appends to that record array “sensor\_data” entries for the 60 seconds (or minutes, or days) leading up to the threshold violation. -* The edge instance publishes the “alerts” table up to the cloud instance. +- The edge instance subscribes to a “thresholds” table on the cloud instance, so the application only makes localhost calls to get the thresholds. +- The application continually pushes sensor data into a “sensor_data” table via the localhost API, comparing it to the threshold values as it does so. +- When a threshold violation occurs, the application adds a record to the “alerts” table. +- The application appends to that record array “sensor_data” entries for the 60 seconds (or minutes, or days) leading up to the threshold violation. +- The edge instance publishes the “alerts” table up to the cloud instance. By letting HarperDB focus on the fault-tolerant logistics of transporting your data, you get to write less code. By moving data only when and where it’s needed, you lower storage and bandwidth costs. And by restricting your app to only making local calls to HarperDB, you reduce the overall exposure of your application to outside forces. diff --git a/site/versioned_docs/version-4.2/developers/clustering/managing-subscriptions.md b/site/versioned_docs/version-4.2/developers/clustering/managing-subscriptions.md index a1f8c56e..bee50508 100644 --- a/site/versioned_docs/version-4.2/developers/clustering/managing-subscriptions.md +++ b/site/versioned_docs/version-4.2/developers/clustering/managing-subscriptions.md @@ -12,22 +12,22 @@ To add a single node and create one or more subscriptions use `add_node`. ```json { - "operation": "add_node", - "node_name": "Node2", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": false, - "subscribe": true - }, - { - "schema": "dev", - "table": "chicken", - "publish": true, - "subscribe": true - } - ] + "operation": "add_node", + "node_name": "Node2", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": false, + "subscribe": true + }, + { + "schema": "dev", + "table": "chicken", + "publish": true, + "subscribe": true + } + ] } ``` @@ -37,16 +37,16 @@ To update one or more subscriptions with a single node use `update_node`. ```json { - "operation": "update_node", - "node_name": "Node2", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ] + "operation": "update_node", + "node_name": "Node2", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ] } ``` @@ -56,37 +56,37 @@ To add or update subscriptions with one or more nodes in one API call use `confi ```json { - "operation": "configure_cluster", - "connections": [ - { - "node_name": "Node2", - "subscriptions": [ - { - "schema": "dev", - "table": "chicken", - "publish": false, - "subscribe": true - }, - { - "schema": "prod", - "table": "dog", - "publish": true, - "subscribe": true - } - ] - }, - { - "node_name": "Node3", - "subscriptions": [ - { - "schema": "dev", - "table": "chicken", - "publish": true, - "subscribe": false - } - ] - } - ] + "operation": "configure_cluster", + "connections": [ + { + "node_name": "Node2", + "subscriptions": [ + { + "schema": "dev", + "table": "chicken", + "publish": false, + "subscribe": true + }, + { + "schema": "prod", + "table": "dog", + "publish": true, + "subscribe": true + } + ] + }, + { + "node_name": "Node3", + "subscriptions": [ + { + "schema": "dev", + "table": "chicken", + "publish": true, + "subscribe": false + } + ] + } + ] } ``` @@ -100,17 +100,17 @@ There is an optional property called `start_time` that can be passed in the subs ```json { - "operation": "add_node", - "node_name": "Node2", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": false, - "subscribe": true, - "start_time": "2022-09-02T20:06:35.993Z" - } - ] + "operation": "add_node", + "node_name": "Node2", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": false, + "subscribe": true, + "start_time": "2022-09-02T20:06:35.993Z" + } + ] } ``` @@ -126,8 +126,8 @@ To remove a node and all its subscriptions use `remove_node`. ```json { - "operation":"remove_node", - "node_name":"Node2" + "operation": "remove_node", + "node_name": "Node2" } ``` @@ -137,32 +137,32 @@ To get the status of all connected nodes and see their subscriptions use `cluste ```json { - "node_name": "Node1", - "is_enabled": true, - "connections": [ - { - "node_name": "Node2", - "status": "open", - "ports": { - "clustering": 9932, - "operations_api": 9925 - }, - "latency_ms": 65, - "uptime": "11m 19s", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ], - "system_info": { - "hdb_version": "4.0.0", - "node_version": "16.17.1", - "platform": "linux" - } - } - ] + "node_name": "Node1", + "is_enabled": true, + "connections": [ + { + "node_name": "Node2", + "status": "open", + "ports": { + "clustering": 9932, + "operations_api": 9925 + }, + "latency_ms": 65, + "uptime": "11m 19s", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ], + "system_info": { + "hdb_version": "4.0.0", + "node_version": "16.17.1", + "platform": "linux" + } + } + ] } ``` diff --git a/site/versioned_docs/version-4.2/developers/clustering/naming-a-node.md b/site/versioned_docs/version-4.2/developers/clustering/naming-a-node.md index d1ebdfb1..308aef7a 100644 --- a/site/versioned_docs/version-4.2/developers/clustering/naming-a-node.md +++ b/site/versioned_docs/version-4.2/developers/clustering/naming-a-node.md @@ -27,8 +27,8 @@ _Note: When making any changes to the `harperdb-config.yaml` file HarperDB must ```json { - "operation": "set_configuration", - "clustering_nodeName":"Node1" + "operation": "set_configuration", + "clustering_nodeName": "Node1" } ``` diff --git a/site/versioned_docs/version-4.2/developers/clustering/things-worth-knowing.md b/site/versioned_docs/version-4.2/developers/clustering/things-worth-knowing.md index a140e4d3..d737e01f 100644 --- a/site/versioned_docs/version-4.2/developers/clustering/things-worth-knowing.md +++ b/site/versioned_docs/version-4.2/developers/clustering/things-worth-knowing.md @@ -6,21 +6,21 @@ title: Things Worth Knowing Additional information that will help you define your clustering topology. -*** +--- ### Transactions Transactions that are replicated across the cluster are: -* Insert -* Update -* Upsert -* Delete -* Bulk loads - * CSV data load - * CSV file load - * CSV URL load - * Import from S3 +- Insert +- Update +- Upsert +- Delete +- Bulk loads + - CSV data load + - CSV file load + - CSV URL load + - Import from S3 When adding or updating a node any schemas and tables in the subscription that don’t exist on the remote node will be automatically created. @@ -28,13 +28,13 @@ When adding or updating a node any schemas and tables in the subscription that d Users and roles are not replicated across the cluster. -*** +--- ### Queueing HarperDB has built-in resiliency for when network connectivity is lost within a subscription. When connections are reestablished, a catchup routine is executed to ensure data that was missed, specific to the subscription, is sent/received as defined. -*** +--- ### Topologies diff --git a/site/versioned_docs/version-4.2/developers/components/drivers.md b/site/versioned_docs/version-4.2/developers/components/drivers.md index 87066c72..3296031f 100644 --- a/site/versioned_docs/version-4.2/developers/components/drivers.md +++ b/site/versioned_docs/version-4.2/developers/components/drivers.md @@ -7,6 +7,4 @@ description: >- # Drivers - -
DriverDocsDownload
Power BIPowerBI DocsWindows
TableauTableau DocsWindows
Mac
Driver JAR
ExcelExcel DocsWindows
JDBCJDBC DocsWindows
Mac
Driver JAR
ODBCODBC DocsWindows
Mac
Linux (RPM)
Linux (DEB)
ADOADO DocsWindows
CmdletsCmdlets DocsWindows
SSISSSIS DocsWindows
diff --git a/site/versioned_docs/version-4.2/developers/components/google-data-studio.md b/site/versioned_docs/version-4.2/developers/components/google-data-studio.md index 324bb5ce..d252f3f0 100644 --- a/site/versioned_docs/version-4.2/developers/components/google-data-studio.md +++ b/site/versioned_docs/version-4.2/developers/components/google-data-studio.md @@ -17,21 +17,21 @@ The HarperDB database must be accessible through the Internet in order for Googl Get started by selecting the HarperDB connector from the [Google Data Studio Partner Connector Gallery](https://datastudio.google.com/u/0/datasources/create). 1. Log in to [https://datastudio.google.com/](https://datastudio.google.com/). -1. Add a new Data Source using the HarperDB connector. The current release version can be added as a data source by following this link: [HarperDB Google Data Studio Connector](https://datastudio.google.com/datasources/create?connectorId=AKfycbxBKgF8FI5R42WVxO-QCOq7dmUys0HJrUJMkBQRoGnCasY60\_VJeO3BhHJPvdd20-S76g). +1. Add a new Data Source using the HarperDB connector. The current release version can be added as a data source by following this link: [HarperDB Google Data Studio Connector](https://datastudio.google.com/datasources/create?connectorId=AKfycbxBKgF8FI5R42WVxO-QCOq7dmUys0HJrUJMkBQRoGnCasY60_VJeO3BhHJPvdd20-S76g). 1. Authorize the connector to access other servers on your behalf (this allows the connector to contact your database). 1. Enter the Web URL to access your database (preferably with HTTPS), as well as the Basic Auth key you use to access the database. Just include the key, not the word “Basic” at the start of it. 1. Check the box for “Secure Connections Only” if you want to always use HTTPS connections for this data source; entering a Web URL that starts with https:// will do the same thing, if you prefer. 1. Check the box for “Allow Bad Certs” if your HarperDB instance does not have a valid SSL certificate. [HarperDB Cloud](../../deployments/harperdb-cloud/) always has valid certificates, and so will never require this to be checked. Instances you set up yourself may require this, if you are using self-signed certs. If you are using [HarperDB Cloud](../../deployments/harperdb-cloud/) or another instance you know should always have valid SSL certificates, do not check this box. 1. Choose your Query Type. This determines what information the configuration will ask for after pressing the Next button. - * Table will ask you for a Schema and a Table to return all fields of using `SELECT *`. - * SQL will ask you for the SQL query you’re using to retrieve fields from the database. You may `JOIN` multiple tables together, and use HarperDB specific SQL functions, along with the usual power SQL grants. + - Table will ask you for a Schema and a Table to return all fields of using `SELECT *`. + - SQL will ask you for the SQL query you’re using to retrieve fields from the database. You may `JOIN` multiple tables together, and use HarperDB specific SQL functions, along with the usual power SQL grants. 1. When all information is entered correctly, press the Connect button in the top right of the new Data Source view to generate the Schema. You may also want to name the data source at this point. If the connector encounters any errors, a dialog box will tell you what went wrong so you can correct the issue. 1. If there are no errors, you now have a data source you can use in your reports! You may change the types of the generated fields in the Schema view if you need to (for instance, changing a Number field to a specific currency), as well as creating new fields from the report view that do calculations on other fields. ## Considerations -* Both Postman and the [HarperDB Studio](../../administration/harperdb-studio/) app have ways to convert a user:password pair to a Basic Auth token. Use either to create the token for the connector’s user. - * You may sign out of your current user by going to the instances tab in HarperDB Studio, then clicking on the lock icon at the top-right of a given instance’s box. Click the lock again to sign in as any user. The Basic Auth token will be visible in the Authorization header portion of any code created in the Sample Code tab. -* It’s highly recommended that you create a read-only user role in HarperDB Studio, and create a user with that role for your data sources to use. This prevents that authorization token from being used to alter your database, should someone else ever get ahold of it. -* The RecordCount field is intended for use as a metric, for counting how many instances of a given set of values appear in a report’s data set. -* _Do not attempt to create fields with spaces in their names_ for any data sources! Google Data Studio will crash when attempting to retrieve a field with such a name, producing a System Error instead of a useful chart on your reports. Using CamelCase or snake\_case gets around this. +- Both Postman and the [HarperDB Studio](../../administration/harperdb-studio/) app have ways to convert a user:password pair to a Basic Auth token. Use either to create the token for the connector’s user. + - You may sign out of your current user by going to the instances tab in HarperDB Studio, then clicking on the lock icon at the top-right of a given instance’s box. Click the lock again to sign in as any user. The Basic Auth token will be visible in the Authorization header portion of any code created in the Sample Code tab. +- It’s highly recommended that you create a read-only user role in HarperDB Studio, and create a user with that role for your data sources to use. This prevents that authorization token from being used to alter your database, should someone else ever get ahold of it. +- The RecordCount field is intended for use as a metric, for counting how many instances of a given set of values appear in a report’s data set. +- _Do not attempt to create fields with spaces in their names_ for any data sources! Google Data Studio will crash when attempting to retrieve a field with such a name, producing a System Error instead of a useful chart on your reports. Using CamelCase or snake_case gets around this. diff --git a/site/versioned_docs/version-4.2/developers/components/index.md b/site/versioned_docs/version-4.2/developers/components/index.md index e0e82581..8fed49d8 100644 --- a/site/versioned_docs/version-4.2/developers/components/index.md +++ b/site/versioned_docs/version-4.2/developers/components/index.md @@ -6,12 +6,12 @@ title: Components HarperDB is a highly extensible database application platform with support for a rich variety of composable modular components and components that can be used and combined to build applications and add functionality to existing applications. HarperDB tools, components, and add-ons can be found in a few places: -* [SDK libraries](./sdks) are available for connecting to HarperDB from different languages. -* [Drivers](./drivers) are available for connecting to HarperDB from different products and tools. -* [HarperDB-Add-Ons repositories](https://github.com/orgs/HarperDB-Add-Ons/repositories) lists various templates and add-ons for HarperDB. -* [HarperDB repositories](https://github.com/orgs/HarperDB-Add-Ons/repositories) include additional tools for HarperDB. -* You can also [search github.com for ever-growing list of projects that use, or work with, HarperDB](https://github.com/search?q=harperdb\&type=repositories) -* [Google Data Studio](./google-data-studio) is a visualization tool for building charts and tables from HarperDB data. +- [SDK libraries](./sdks) are available for connecting to HarperDB from different languages. +- [Drivers](./drivers) are available for connecting to HarperDB from different products and tools. +- [HarperDB-Add-Ons repositories](https://github.com/orgs/HarperDB-Add-Ons/repositories) lists various templates and add-ons for HarperDB. +- [HarperDB repositories](https://github.com/orgs/HarperDB-Add-Ons/repositories) include additional tools for HarperDB. +- You can also [search github.com for ever-growing list of projects that use, or work with, HarperDB](https://github.com/search?q=harperdb&type=repositories) +- [Google Data Studio](./google-data-studio) is a visualization tool for building charts and tables from HarperDB data. ## Components diff --git a/site/versioned_docs/version-4.2/developers/components/installing.md b/site/versioned_docs/version-4.2/developers/components/installing.md index 2c6741a2..6bbb6261 100644 --- a/site/versioned_docs/version-4.2/developers/components/installing.md +++ b/site/versioned_docs/version-4.2/developers/components/installing.md @@ -8,8 +8,8 @@ Components can be easily added by adding a new top level element to your `harper The configuration comprises two values: -* component name - can be anything, as long as it follows valid YAML syntax. -* package - a reference to your component. +- component name - can be anything, as long as it follows valid YAML syntax. +- package - a reference to your component. ```yaml myComponentName: @@ -20,7 +20,7 @@ Under the hood HarperDB is calling npm install on all components, this means tha ```yaml myGithubComponent: - package: HarperDB-Add-Ons/package#v2.2.0 # install from GitHub + package: HarperDB-Add-Ons/package#v2.2.0 # install from GitHub myNPMComponent: package: harperdb # install from NPM myTarBall: @@ -39,13 +39,13 @@ The package.json file that is created will look something like this. ```json { - "dependencies": { - "myGithubComponent": "github:HarperDB-Add-Ons/package#v2.2.0", - "myNPMComponent": "npm:harperdb", - "myTarBall": "file:/Users/harper/cool-component.tar", - "myLocal": "file:/Users/harper/local", - "myWebsite": "https://harperdb-component" - } + "dependencies": { + "myGithubComponent": "github:HarperDB-Add-Ons/package#v2.2.0", + "myNPMComponent": "npm:harperdb", + "myTarBall": "file:/Users/harper/cool-component.tar", + "myLocal": "file:/Users/harper/local", + "myWebsite": "https://harperdb-component" + } } ``` @@ -62,9 +62,9 @@ To add a component using the operations API use the `deploy_component` operation ```json { - "operation": "deploy_component", - "project": "my-cool-component", - "package": "HarperDB-Add-Ons/package/mycc" + "operation": "deploy_component", + "project": "my-cool-component", + "package": "HarperDB-Add-Ons/package/mycc" } ``` @@ -72,8 +72,8 @@ Another option is to pass `deploy_component` a base64-encoded string representat ```json { - "operation": "deploy_component", - "project": "my-cool-component", - "payload": "NzY1IAAwMDAwMjQgADAwMDAwMDAwMDAwIDE0NDIwMDQ3...." + "operation": "deploy_component", + "project": "my-cool-component", + "payload": "NzY1IAAwMDAwMjQgADAwMDAwMDAwMDAwIDE0NDIwMDQ3...." } ``` diff --git a/site/versioned_docs/version-4.2/developers/components/operations.md b/site/versioned_docs/version-4.2/developers/components/operations.md index 95ca23c8..32108df5 100644 --- a/site/versioned_docs/version-4.2/developers/components/operations.md +++ b/site/versioned_docs/version-4.2/developers/components/operations.md @@ -8,30 +8,38 @@ One way to manage applications and components is through [HarperDB Studio](../.. HarperDB Studio manages your applications using nine HarperDB operations. You may view these operations within our [API Docs](../operations-api/). A brief overview of each of the operations is below: -* **components\_status** +- **components_status** - Returns the state of the applications server. This includes whether it is enabled, upon which port it is listening, and where its root project directory is located on the host machine. -* **get\_components** + Returns the state of the applications server. This includes whether it is enabled, upon which port it is listening, and where its root project directory is located on the host machine. - Returns an array of projects within the applications root project directory. -* **get\_component\_file** +- **get_components** - Returns the content of the specified file as text. HarperDB Studio uses this call to render the file content in its built-in code editor. -* **set\_component\_file** + Returns an array of projects within the applications root project directory. - Updates the content of the specified file. HarperDB Studio uses this call to save any changes made through its built-in code editor. -* **drop\_component\_file** +- **get_component_file** - Deletes the specified file. -* **add\_component\_project** + Returns the content of the specified file as text. HarperDB Studio uses this call to render the file content in its built-in code editor. - Creates a new project folder in the applications root project directory. It also inserts into the new directory the contents of our applications Project template, which is available publicly, here: [https://github.com/HarperDB/harperdb-custom-functions-template](https://github.com/HarperDB/harperdb-custom-functions-template). -* **drop\_component\_project** +- **set_component_file** - Deletes the specified project folder and all of its contents. -* **package\_component\_project** + Updates the content of the specified file. HarperDB Studio uses this call to save any changes made through its built-in code editor. - Creates a .tar file of the specified project folder, then reads it into a base64-encoded string and returns that string to the user. -* **deploy\_component\_project** +- **drop_component_file** - Takes the output of package\_component\_project, decrypts the base64-encoded string, reconstitutes the .tar file of your project folder, and extracts it to the applications root project directory. + Deletes the specified file. + +- **add_component_project** + + Creates a new project folder in the applications root project directory. It also inserts into the new directory the contents of our applications Project template, which is available publicly, here: [https://github.com/HarperDB/harperdb-custom-functions-template](https://github.com/HarperDB/harperdb-custom-functions-template). + +- **drop_component_project** + + Deletes the specified project folder and all of its contents. + +- **package_component_project** + + Creates a .tar file of the specified project folder, then reads it into a base64-encoded string and returns that string to the user. + +- **deploy_component_project** + + Takes the output of package_component_project, decrypts the base64-encoded string, reconstitutes the .tar file of your project folder, and extracts it to the applications root project directory. diff --git a/site/versioned_docs/version-4.2/developers/components/writing-extensions.md b/site/versioned_docs/version-4.2/developers/components/writing-extensions.md index 34e51797..cfdc0a93 100644 --- a/site/versioned_docs/version-4.2/developers/components/writing-extensions.md +++ b/site/versioned_docs/version-4.2/developers/components/writing-extensions.md @@ -8,9 +8,9 @@ HarperDB is a highly extensible database application platform with support for a There are three general categories of components for HarperDB: -* **protocol extensions** that provide and define ways for clients to access data -* **resource extensions** that handle and interpret different types of files -* **consumer data sources** that provide a way to access and retrieve data from other sources. +- **protocol extensions** that provide and define ways for clients to access data +- **resource extensions** that handle and interpret different types of files +- **consumer data sources** that provide a way to access and retrieve data from other sources. Server protocol extensions can be used to implement new protocols like MQTT, AMQP, Kafka, or maybe a retro-style Gopher interface. It can also be used to augment existing protocols like HTTP with "middleware" that can add authentication, analytics, or additional content negotiation, or add layer protocols on top of WebSockets. @@ -48,10 +48,10 @@ Here, the `request` object will have the following structure (this is based on N ```typescript interface Request { - method: string - headers: Headers // use request.headers.get(headerName) to get header values - body: Stream - data: any // deserialized data from the request body + method: string; + headers: Headers; // use request.headers.get(headerName) to get header values + body: Stream; + data: any; // deserialized data from the request body } ``` @@ -59,10 +59,10 @@ The returned `response` object should have the following structure (again, follo ```typescript interface Response { - status?: number - headers?: {} // an object with header name/values - data?: any // object/value that will be serialized into the body - body?: Stream + status?: number; + headers?: {}; // an object with header name/values + data?: any; // object/value that will be serialized into the body + body?: Stream; } ``` @@ -76,7 +76,7 @@ export function start(options: { port: number, server: {}, resources: Map}) { // get some token for the user and determine the user // if we want to use harperdb's user database let user = server.getUser(username, password); - request.user = user; // authenticate user object goes on the request + request.user = user; // authenticate user object goes on the request } // continue on to the next layer return nextLayer(request); diff --git a/site/versioned_docs/version-4.2/developers/operations-api/advanced-json-sql-examples.md b/site/versioned_docs/version-4.2/developers/operations-api/advanced-json-sql-examples.md index c26161b7..7acab90a 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/advanced-json-sql-examples.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/advanced-json-sql-examples.md @@ -1,1780 +1,1775 @@ --- -title: Advanced JSON SQL Examples +title: Advanced JSON SQL Examples --- -# Advanced JSON SQL Examples +# Advanced JSON SQL Examples ## Create movies database + Create a new database called "movies" using the 'create_database' operation. _Note: Creating a database is optional, if one is not created HarperDB will default to using a database named `data`_ ### Body + ```json { - "operation": "create_database", - "database": "movies" + "operation": "create_database", + "database": "movies" } ``` ### Response: 200 + ```json { - "message": "database 'movies' successfully created" + "message": "database 'movies' successfully created" } ``` --- ## Create movie Table + Creates a new table called "movie" inside the database "movies" using the ‘create_table’ operation. ### Body ```json { - "operation": "create_table", - "database": "movies", - "table": "movie", - "primary_key": "id" + "operation": "create_table", + "database": "movies", + "table": "movie", + "primary_key": "id" } ``` ### Response: 200 + ```json { - "message": "table 'movies.movie' successfully created." + "message": "table 'movies.movie' successfully created." } ``` - --- ## Create credits Table + Creates a new table called "credits" inside the database "movies" using the ‘create_table’ operation. ### Body ```json { - "operation": "create_table", - "database": "movies", - "table": "credits", - "primary_key": "movie_id" + "operation": "create_table", + "database": "movies", + "table": "credits", + "primary_key": "movie_id" } ``` ### Response: 200 + ```json { - "message": "table 'movies.credits' successfully created." + "message": "table 'movies.credits' successfully created." } ``` - --- ## Bulk Insert movie Via CSV + Inserts data from a hosted CSV file into the "movie" table using the 'csv_url_load' operation. ### Body ```json { - "operation": "csv_url_load", - "database": "movies", - "table": "movie", - "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/movie.csv" + "operation": "csv_url_load", + "database": "movies", + "table": "movie", + "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/movie.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 1889eee4-23c1-4945-9bb7-c805fc20726c" + "message": "Starting job with id 1889eee4-23c1-4945-9bb7-c805fc20726c" } ``` - --- ## Bulk Insert credits Via CSV + Inserts data from a hosted CSV file into the "credits" table using the 'csv_url_load' operation. ### Body ```json { - "operation": "csv_url_load", - "database": "movies", - "table": "credits", - "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/credits.csv" + "operation": "csv_url_load", + "database": "movies", + "table": "credits", + "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/credits.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 3a14cd74-67f3-41e9-8ccd-45ffd0addc2c", - "job_id": "3a14cd74-67f3-41e9-8ccd-45ffd0addc2c" + "message": "Starting job with id 3a14cd74-67f3-41e9-8ccd-45ffd0addc2c", + "job_id": "3a14cd74-67f3-41e9-8ccd-45ffd0addc2c" } ``` - --- ## View raw data + In the following example we will be running expressions on the keywords & production_companies attributes, so for context we are displaying what the raw data looks like. ### Body ```json { - "operation": "sql", - "sql": "SELECT title, rank, keywords, production_companies FROM movies.movie ORDER BY rank LIMIT 10" + "operation": "sql", + "sql": "SELECT title, rank, keywords, production_companies FROM movies.movie ORDER BY rank LIMIT 10" } ``` ### Response: 200 + ```json [ - { - "title": "Ad Astra", - "rank": 1, - "keywords": [ - { - "id": 305, - "name": "moon" - }, - { - "id": 697, - "name": "loss of loved one" - }, - { - "id": 839, - "name": "planet mars" - }, - { - "id": 14626, - "name": "astronaut" - }, - { - "id": 157265, - "name": "moon colony" - }, - { - "id": 162429, - "name": "solar system" - }, - { - "id": 240119, - "name": "father son relationship" - }, - { - "id": 244256, - "name": "near future" - }, - { - "id": 257878, - "name": "planet neptune" - }, - { - "id": 260089, - "name": "space walk" - } - ], - "production_companies": [ - { - "id": 490, - "name": "New Regency Productions", - "origin_country": "" - }, - { - "id": 79963, - "name": "Keep Your Head", - "origin_country": "" - }, - { - "id": 73492, - "name": "MadRiver Pictures", - "origin_country": "" - }, - { - "id": 81, - "name": "Plan B Entertainment", - "origin_country": "US" - }, - { - "id": 30666, - "name": "RT Features", - "origin_country": "BR" - }, - { - "id": 30148, - "name": "Bona Film Group", - "origin_country": "CN" - }, - { - "id": 22213, - "name": "TSG Entertainment", - "origin_country": "US" - } - ] - }, - { - "title": "Extraction", - "rank": 2, - "keywords": [ - { - "id": 3070, - "name": "mercenary" - }, - { - "id": 4110, - "name": "mumbai (bombay), india" - }, - { - "id": 9717, - "name": "based on comic" - }, - { - "id": 9730, - "name": "crime boss" - }, - { - "id": 11107, - "name": "rescue mission" - }, - { - "id": 18712, - "name": "based on graphic novel" - }, - { - "id": 265216, - "name": "dhaka (dacca), bangladesh" - } - ], - "production_companies": [ - { - "id": 106544, - "name": "AGBO", - "origin_country": "US" - }, - { - "id": 109172, - "name": "Thematic Entertainment", - "origin_country": "US" - }, - { - "id": 92029, - "name": "TGIM Films", - "origin_country": "US" - } - ] - }, - { - "title": "To the Beat! Back 2 School", - "rank": 3, - "keywords": [ - { - "id": 10873, - "name": "school" - } - ], - "production_companies": [] - }, - { - "title": "Bloodshot", - "rank": 4, - "keywords": [ - { - "id": 2651, - "name": "nanotechnology" - }, - { - "id": 9715, - "name": "superhero" - }, - { - "id": 9717, - "name": "based on comic" - }, - { - "id": 164218, - "name": "psychotronic" - }, - { - "id": 255024, - "name": "shared universe" - }, - { - "id": 258575, - "name": "valiant comics" - } - ], - "production_companies": [ - { - "id": 34, - "name": "Sony Pictures", - "origin_country": "US" - }, - { - "id": 10246, - "name": "Cross Creek Pictures", - "origin_country": "US" - }, - { - "id": 6573, - "name": "Mimran Schur Pictures", - "origin_country": "US" - }, - { - "id": 333, - "name": "Original Film", - "origin_country": "US" - }, - { - "id": 103673, - "name": "The Hideaway Entertainment", - "origin_country": "US" - }, - { - "id": 124335, - "name": "Valiant Entertainment", - "origin_country": "US" - }, - { - "id": 5, - "name": "Columbia Pictures", - "origin_country": "US" - }, - { - "id": 1225, - "name": "One Race", - "origin_country": "US" - }, - { - "id": 30148, - "name": "Bona Film Group", - "origin_country": "CN" - } - ] - }, - { - "title": "The Call of the Wild", - "rank": 5, - "keywords": [ - { - "id": 818, - "name": "based on novel or book" - }, - { - "id": 4542, - "name": "gold rush" - }, - { - "id": 15162, - "name": "dog" - }, - { - "id": 155821, - "name": "sled dogs" - }, - { - "id": 189390, - "name": "yukon" - }, - { - "id": 207928, - "name": "19th century" - }, - { - "id": 259987, - "name": "cgi animation" - }, - { - "id": 263806, - "name": "1890s" - } - ], - "production_companies": [ - { - "id": 787, - "name": "3 Arts Entertainment", - "origin_country": "US" - }, - { - "id": 127928, - "name": "20th Century Studios", - "origin_country": "US" - }, - { - "id": 22213, - "name": "TSG Entertainment", - "origin_country": "US" - } - ] - }, - { - "title": "Sonic the Hedgehog", - "rank": 6, - "keywords": [ - { - "id": 282, - "name": "video game" - }, - { - "id": 6054, - "name": "friendship" - }, - { - "id": 10842, - "name": "good vs evil" - }, - { - "id": 41645, - "name": "based on video game" - }, - { - "id": 167043, - "name": "road movie" - }, - { - "id": 172142, - "name": "farting" - }, - { - "id": 188933, - "name": "bar fight" - }, - { - "id": 226967, - "name": "amistad" - }, - { - "id": 245230, - "name": "live action remake" - }, - { - "id": 258111, - "name": "fantasy" - }, - { - "id": 260223, - "name": "videojuego" - } - ], - "production_companies": [ - { - "id": 333, - "name": "Original Film", - "origin_country": "US" - }, - { - "id": 10644, - "name": "Blur Studios", - "origin_country": "US" - }, - { - "id": 77884, - "name": "Marza Animation Planet", - "origin_country": "JP" - }, - { - "id": 4, - "name": "Paramount", - "origin_country": "US" - }, - { - "id": 113750, - "name": "SEGA", - "origin_country": "JP" - }, - { - "id": 100711, - "name": "DJ2 Entertainment", - "origin_country": "" - }, - { - "id": 24955, - "name": "Paramount Animation", - "origin_country": "US" - } - ] - }, - { - "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", - "rank": 7, - "keywords": [ - { - "id": 849, - "name": "dc comics" - }, - { - "id": 9717, - "name": "based on comic" - }, - { - "id": 187056, - "name": "woman director" - }, - { - "id": 229266, - "name": "dc extended universe" - } - ], - "production_companies": [ - { - "id": 9993, - "name": "DC Entertainment", - "origin_country": "US" - }, - { - "id": 82968, - "name": "LuckyChap Entertainment", - "origin_country": "GB" - }, - { - "id": 103462, - "name": "Kroll & Co Entertainment", - "origin_country": "US" - }, - { - "id": 174, - "name": "Warner Bros. Pictures", - "origin_country": "US" - }, - { - "id": 429, - "name": "DC Comics", - "origin_country": "US" - }, - { - "id": 128064, - "name": "DC Films", - "origin_country": "US" - }, - { - "id": 101831, - "name": "Clubhouse Pictures", - "origin_country": "US" - } - ] - }, - { - "title": "Justice League Dark: Apokolips War", - "rank": 8, - "keywords": [ - { - "id": 849, - "name": "dc comics" - } - ], - "production_companies": [ - { - "id": 2785, - "name": "Warner Bros. Animation", - "origin_country": "US" - }, - { - "id": 9993, - "name": "DC Entertainment", - "origin_country": "US" - }, - { - "id": 429, - "name": "DC Comics", - "origin_country": "US" - } - ] - }, - { - "title": "Parasite", - "rank": 9, - "keywords": [ - { - "id": 1353, - "name": "underground" - }, - { - "id": 5318, - "name": "seoul" - }, - { - "id": 5732, - "name": "birthday party" - }, - { - "id": 5752, - "name": "private lessons" - }, - { - "id": 9866, - "name": "basement" - }, - { - "id": 10453, - "name": "con artist" - }, - { - "id": 11935, - "name": "working class" - }, - { - "id": 12565, - "name": "psychological thriller" - }, - { - "id": 13126, - "name": "limousine driver" - }, - { - "id": 14514, - "name": "class differences" - }, - { - "id": 14864, - "name": "rich poor" - }, - { - "id": 17997, - "name": "housekeeper" - }, - { - "id": 18015, - "name": "tutor" - }, - { - "id": 18035, - "name": "family" - }, - { - "id": 33421, - "name": "crime family" - }, - { - "id": 173272, - "name": "flood" - }, - { - "id": 188861, - "name": "smell" - }, - { - "id": 198673, - "name": "unemployed" - }, - { - "id": 237462, - "name": "wealthy family" - } - ], - "production_companies": [ - { - "id": 7036, - "name": "CJ Entertainment", - "origin_country": "KR" - }, - { - "id": 4399, - "name": "Barunson E&A", - "origin_country": "KR" - } - ] - }, - { - "title": "Star Wars: The Rise of Skywalker", - "rank": 10, - "keywords": [ - { - "id": 161176, - "name": "space opera" - } - ], - "production_companies": [ - { - "id": 1, - "name": "Lucasfilm", - "origin_country": "US" - }, - { - "id": 11461, - "name": "Bad Robot", - "origin_country": "US" - }, - { - "id": 2, - "name": "Walt Disney Pictures", - "origin_country": "US" - }, - { - "id": 120404, - "name": "British Film Commission", - "origin_country": "" - } - ] - } + { + "title": "Ad Astra", + "rank": 1, + "keywords": [ + { + "id": 305, + "name": "moon" + }, + { + "id": 697, + "name": "loss of loved one" + }, + { + "id": 839, + "name": "planet mars" + }, + { + "id": 14626, + "name": "astronaut" + }, + { + "id": 157265, + "name": "moon colony" + }, + { + "id": 162429, + "name": "solar system" + }, + { + "id": 240119, + "name": "father son relationship" + }, + { + "id": 244256, + "name": "near future" + }, + { + "id": 257878, + "name": "planet neptune" + }, + { + "id": 260089, + "name": "space walk" + } + ], + "production_companies": [ + { + "id": 490, + "name": "New Regency Productions", + "origin_country": "" + }, + { + "id": 79963, + "name": "Keep Your Head", + "origin_country": "" + }, + { + "id": 73492, + "name": "MadRiver Pictures", + "origin_country": "" + }, + { + "id": 81, + "name": "Plan B Entertainment", + "origin_country": "US" + }, + { + "id": 30666, + "name": "RT Features", + "origin_country": "BR" + }, + { + "id": 30148, + "name": "Bona Film Group", + "origin_country": "CN" + }, + { + "id": 22213, + "name": "TSG Entertainment", + "origin_country": "US" + } + ] + }, + { + "title": "Extraction", + "rank": 2, + "keywords": [ + { + "id": 3070, + "name": "mercenary" + }, + { + "id": 4110, + "name": "mumbai (bombay), india" + }, + { + "id": 9717, + "name": "based on comic" + }, + { + "id": 9730, + "name": "crime boss" + }, + { + "id": 11107, + "name": "rescue mission" + }, + { + "id": 18712, + "name": "based on graphic novel" + }, + { + "id": 265216, + "name": "dhaka (dacca), bangladesh" + } + ], + "production_companies": [ + { + "id": 106544, + "name": "AGBO", + "origin_country": "US" + }, + { + "id": 109172, + "name": "Thematic Entertainment", + "origin_country": "US" + }, + { + "id": 92029, + "name": "TGIM Films", + "origin_country": "US" + } + ] + }, + { + "title": "To the Beat! Back 2 School", + "rank": 3, + "keywords": [ + { + "id": 10873, + "name": "school" + } + ], + "production_companies": [] + }, + { + "title": "Bloodshot", + "rank": 4, + "keywords": [ + { + "id": 2651, + "name": "nanotechnology" + }, + { + "id": 9715, + "name": "superhero" + }, + { + "id": 9717, + "name": "based on comic" + }, + { + "id": 164218, + "name": "psychotronic" + }, + { + "id": 255024, + "name": "shared universe" + }, + { + "id": 258575, + "name": "valiant comics" + } + ], + "production_companies": [ + { + "id": 34, + "name": "Sony Pictures", + "origin_country": "US" + }, + { + "id": 10246, + "name": "Cross Creek Pictures", + "origin_country": "US" + }, + { + "id": 6573, + "name": "Mimran Schur Pictures", + "origin_country": "US" + }, + { + "id": 333, + "name": "Original Film", + "origin_country": "US" + }, + { + "id": 103673, + "name": "The Hideaway Entertainment", + "origin_country": "US" + }, + { + "id": 124335, + "name": "Valiant Entertainment", + "origin_country": "US" + }, + { + "id": 5, + "name": "Columbia Pictures", + "origin_country": "US" + }, + { + "id": 1225, + "name": "One Race", + "origin_country": "US" + }, + { + "id": 30148, + "name": "Bona Film Group", + "origin_country": "CN" + } + ] + }, + { + "title": "The Call of the Wild", + "rank": 5, + "keywords": [ + { + "id": 818, + "name": "based on novel or book" + }, + { + "id": 4542, + "name": "gold rush" + }, + { + "id": 15162, + "name": "dog" + }, + { + "id": 155821, + "name": "sled dogs" + }, + { + "id": 189390, + "name": "yukon" + }, + { + "id": 207928, + "name": "19th century" + }, + { + "id": 259987, + "name": "cgi animation" + }, + { + "id": 263806, + "name": "1890s" + } + ], + "production_companies": [ + { + "id": 787, + "name": "3 Arts Entertainment", + "origin_country": "US" + }, + { + "id": 127928, + "name": "20th Century Studios", + "origin_country": "US" + }, + { + "id": 22213, + "name": "TSG Entertainment", + "origin_country": "US" + } + ] + }, + { + "title": "Sonic the Hedgehog", + "rank": 6, + "keywords": [ + { + "id": 282, + "name": "video game" + }, + { + "id": 6054, + "name": "friendship" + }, + { + "id": 10842, + "name": "good vs evil" + }, + { + "id": 41645, + "name": "based on video game" + }, + { + "id": 167043, + "name": "road movie" + }, + { + "id": 172142, + "name": "farting" + }, + { + "id": 188933, + "name": "bar fight" + }, + { + "id": 226967, + "name": "amistad" + }, + { + "id": 245230, + "name": "live action remake" + }, + { + "id": 258111, + "name": "fantasy" + }, + { + "id": 260223, + "name": "videojuego" + } + ], + "production_companies": [ + { + "id": 333, + "name": "Original Film", + "origin_country": "US" + }, + { + "id": 10644, + "name": "Blur Studios", + "origin_country": "US" + }, + { + "id": 77884, + "name": "Marza Animation Planet", + "origin_country": "JP" + }, + { + "id": 4, + "name": "Paramount", + "origin_country": "US" + }, + { + "id": 113750, + "name": "SEGA", + "origin_country": "JP" + }, + { + "id": 100711, + "name": "DJ2 Entertainment", + "origin_country": "" + }, + { + "id": 24955, + "name": "Paramount Animation", + "origin_country": "US" + } + ] + }, + { + "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", + "rank": 7, + "keywords": [ + { + "id": 849, + "name": "dc comics" + }, + { + "id": 9717, + "name": "based on comic" + }, + { + "id": 187056, + "name": "woman director" + }, + { + "id": 229266, + "name": "dc extended universe" + } + ], + "production_companies": [ + { + "id": 9993, + "name": "DC Entertainment", + "origin_country": "US" + }, + { + "id": 82968, + "name": "LuckyChap Entertainment", + "origin_country": "GB" + }, + { + "id": 103462, + "name": "Kroll & Co Entertainment", + "origin_country": "US" + }, + { + "id": 174, + "name": "Warner Bros. Pictures", + "origin_country": "US" + }, + { + "id": 429, + "name": "DC Comics", + "origin_country": "US" + }, + { + "id": 128064, + "name": "DC Films", + "origin_country": "US" + }, + { + "id": 101831, + "name": "Clubhouse Pictures", + "origin_country": "US" + } + ] + }, + { + "title": "Justice League Dark: Apokolips War", + "rank": 8, + "keywords": [ + { + "id": 849, + "name": "dc comics" + } + ], + "production_companies": [ + { + "id": 2785, + "name": "Warner Bros. Animation", + "origin_country": "US" + }, + { + "id": 9993, + "name": "DC Entertainment", + "origin_country": "US" + }, + { + "id": 429, + "name": "DC Comics", + "origin_country": "US" + } + ] + }, + { + "title": "Parasite", + "rank": 9, + "keywords": [ + { + "id": 1353, + "name": "underground" + }, + { + "id": 5318, + "name": "seoul" + }, + { + "id": 5732, + "name": "birthday party" + }, + { + "id": 5752, + "name": "private lessons" + }, + { + "id": 9866, + "name": "basement" + }, + { + "id": 10453, + "name": "con artist" + }, + { + "id": 11935, + "name": "working class" + }, + { + "id": 12565, + "name": "psychological thriller" + }, + { + "id": 13126, + "name": "limousine driver" + }, + { + "id": 14514, + "name": "class differences" + }, + { + "id": 14864, + "name": "rich poor" + }, + { + "id": 17997, + "name": "housekeeper" + }, + { + "id": 18015, + "name": "tutor" + }, + { + "id": 18035, + "name": "family" + }, + { + "id": 33421, + "name": "crime family" + }, + { + "id": 173272, + "name": "flood" + }, + { + "id": 188861, + "name": "smell" + }, + { + "id": 198673, + "name": "unemployed" + }, + { + "id": 237462, + "name": "wealthy family" + } + ], + "production_companies": [ + { + "id": 7036, + "name": "CJ Entertainment", + "origin_country": "KR" + }, + { + "id": 4399, + "name": "Barunson E&A", + "origin_country": "KR" + } + ] + }, + { + "title": "Star Wars: The Rise of Skywalker", + "rank": 10, + "keywords": [ + { + "id": 161176, + "name": "space opera" + } + ], + "production_companies": [ + { + "id": 1, + "name": "Lucasfilm", + "origin_country": "US" + }, + { + "id": 11461, + "name": "Bad Robot", + "origin_country": "US" + }, + { + "id": 2, + "name": "Walt Disney Pictures", + "origin_country": "US" + }, + { + "id": 120404, + "name": "British Film Commission", + "origin_country": "" + } + ] + } ] ``` - --- ## Simple search_json call -This query uses search_json to convert the keywords object array to a simple string array. The expression '[name]' tells the function to extract all values for the name attribute and wrap them in an array. + +This query uses search_json to convert the keywords object array to a simple string array. The expression '[name]' tells the function to extract all values for the name attribute and wrap them in an array. ### Body ```json { - "operation": "sql", - "sql": "SELECT title, rank, search_json('[name]', keywords) as keywords FROM movies.movie ORDER BY rank LIMIT 10" + "operation": "sql", + "sql": "SELECT title, rank, search_json('[name]', keywords) as keywords FROM movies.movie ORDER BY rank LIMIT 10" } ``` ### Response: 200 + ```json [ - { - "title": "Ad Astra", - "rank": 1, - "keywords": [ - "moon", - "loss of loved one", - "planet mars", - "astronaut", - "moon colony", - "solar system", - "father son relationship", - "near future", - "planet neptune", - "space walk" - ] - }, - { - "title": "Extraction", - "rank": 2, - "keywords": [ - "mercenary", - "mumbai (bombay), india", - "based on comic", - "crime boss", - "rescue mission", - "based on graphic novel", - "dhaka (dacca), bangladesh" - ] - }, - { - "title": "To the Beat! Back 2 School", - "rank": 3, - "keywords": [ - "school" - ] - }, - { - "title": "Bloodshot", - "rank": 4, - "keywords": [ - "nanotechnology", - "superhero", - "based on comic", - "psychotronic", - "shared universe", - "valiant comics" - ] - }, - { - "title": "The Call of the Wild", - "rank": 5, - "keywords": [ - "based on novel or book", - "gold rush", - "dog", - "sled dogs", - "yukon", - "19th century", - "cgi animation", - "1890s" - ] - }, - { - "title": "Sonic the Hedgehog", - "rank": 6, - "keywords": [ - "video game", - "friendship", - "good vs evil", - "based on video game", - "road movie", - "farting", - "bar fight", - "amistad", - "live action remake", - "fantasy", - "videojuego" - ] - }, - { - "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", - "rank": 7, - "keywords": [ - "dc comics", - "based on comic", - "woman director", - "dc extended universe" - ] - }, - { - "title": "Justice League Dark: Apokolips War", - "rank": 8, - "keywords": [ - "dc comics" - ] - }, - { - "title": "Parasite", - "rank": 9, - "keywords": [ - "underground", - "seoul", - "birthday party", - "private lessons", - "basement", - "con artist", - "working class", - "psychological thriller", - "limousine driver", - "class differences", - "rich poor", - "housekeeper", - "tutor", - "family", - "crime family", - "flood", - "smell", - "unemployed", - "wealthy family" - ] - }, - { - "title": "Star Wars: The Rise of Skywalker", - "rank": 10, - "keywords": [ - "space opera" - ] - } + { + "title": "Ad Astra", + "rank": 1, + "keywords": [ + "moon", + "loss of loved one", + "planet mars", + "astronaut", + "moon colony", + "solar system", + "father son relationship", + "near future", + "planet neptune", + "space walk" + ] + }, + { + "title": "Extraction", + "rank": 2, + "keywords": [ + "mercenary", + "mumbai (bombay), india", + "based on comic", + "crime boss", + "rescue mission", + "based on graphic novel", + "dhaka (dacca), bangladesh" + ] + }, + { + "title": "To the Beat! Back 2 School", + "rank": 3, + "keywords": ["school"] + }, + { + "title": "Bloodshot", + "rank": 4, + "keywords": ["nanotechnology", "superhero", "based on comic", "psychotronic", "shared universe", "valiant comics"] + }, + { + "title": "The Call of the Wild", + "rank": 5, + "keywords": [ + "based on novel or book", + "gold rush", + "dog", + "sled dogs", + "yukon", + "19th century", + "cgi animation", + "1890s" + ] + }, + { + "title": "Sonic the Hedgehog", + "rank": 6, + "keywords": [ + "video game", + "friendship", + "good vs evil", + "based on video game", + "road movie", + "farting", + "bar fight", + "amistad", + "live action remake", + "fantasy", + "videojuego" + ] + }, + { + "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", + "rank": 7, + "keywords": ["dc comics", "based on comic", "woman director", "dc extended universe"] + }, + { + "title": "Justice League Dark: Apokolips War", + "rank": 8, + "keywords": ["dc comics"] + }, + { + "title": "Parasite", + "rank": 9, + "keywords": [ + "underground", + "seoul", + "birthday party", + "private lessons", + "basement", + "con artist", + "working class", + "psychological thriller", + "limousine driver", + "class differences", + "rich poor", + "housekeeper", + "tutor", + "family", + "crime family", + "flood", + "smell", + "unemployed", + "wealthy family" + ] + }, + { + "title": "Star Wars: The Rise of Skywalker", + "rank": 10, + "keywords": ["space opera"] + } ] ``` - --- ## Use search_json in a where clause -This example shows how we can use SEARCH_JSON to filter out records in a WHERE clause. The production_companies attribute holds an object array of companies that produced each movie, we want to only see movies which were produced by Marvel Studios. Our expression is a filter '$[name="Marvel Studios"]' this tells the function to iterate the production_companies array and only return entries where the name is "Marvel Studios". + +This example shows how we can use SEARCH_JSON to filter out records in a WHERE clause. The production_companies attribute holds an object array of companies that produced each movie, we want to only see movies which were produced by Marvel Studios. Our expression is a filter '$[name="Marvel Studios"]' this tells the function to iterate the production_companies array and only return entries where the name is "Marvel Studios". ### Body ```json { - "operation": "sql", - "sql": "SELECT title, release_date FROM movies.movie where search_json('$[name=\"Marvel Studios\"]', production_companies) IS NOT NULL ORDER BY release_date" + "operation": "sql", + "sql": "SELECT title, release_date FROM movies.movie where search_json('$[name=\"Marvel Studios\"]', production_companies) IS NOT NULL ORDER BY release_date" } ``` ### Response: 200 + ```json [ - { - "title": "Iron Man", - "release_date": "2008-04-30" - }, - { - "title": "The Incredible Hulk", - "release_date": "2008-06-12" - }, - { - "title": "Iron Man 2", - "release_date": "2010-04-28" - }, - { - "title": "Thor", - "release_date": "2011-04-21" - }, - { - "title": "Captain America: The First Avenger", - "release_date": "2011-07-22" - }, - { - "title": "Marvel One-Shot: The Consultant", - "release_date": "2011-09-12" - }, - { - "title": "Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer", - "release_date": "2011-10-25" - }, - { - "title": "The Avengers", - "release_date": "2012-04-25" - }, - { - "title": "Marvel One-Shot: Item 47", - "release_date": "2012-09-13" - }, - { - "title": "Iron Man 3", - "release_date": "2013-04-18" - }, - { - "title": "Marvel One-Shot: Agent Carter", - "release_date": "2013-09-08" - }, - { - "title": "Thor: The Dark World", - "release_date": "2013-10-29" - }, - { - "title": "Marvel One-Shot: All Hail the King", - "release_date": "2014-02-04" - }, - { - "title": "Marvel Studios: Assembling a Universe", - "release_date": "2014-03-18" - }, - { - "title": "Captain America: The Winter Soldier", - "release_date": "2014-03-20" - }, - { - "title": "Guardians of the Galaxy", - "release_date": "2014-07-30" - }, - { - "title": "Avengers: Age of Ultron", - "release_date": "2015-04-22" - }, - { - "title": "Ant-Man", - "release_date": "2015-07-14" - }, - { - "title": "Captain America: Civil War", - "release_date": "2016-04-27" - }, - { - "title": "Team Thor", - "release_date": "2016-08-28" - }, - { - "title": "Doctor Strange", - "release_date": "2016-10-25" - }, - { - "title": "Guardians of the Galaxy Vol. 2", - "release_date": "2017-04-19" - }, - { - "title": "Spider-Man: Homecoming", - "release_date": "2017-07-05" - }, - { - "title": "Thor: Ragnarok", - "release_date": "2017-10-25" - }, - { - "title": "Black Panther", - "release_date": "2018-02-13" - }, - { - "title": "Avengers: Infinity War", - "release_date": "2018-04-25" - }, - { - "title": "Ant-Man and the Wasp", - "release_date": "2018-07-04" - }, - { - "title": "Captain Marvel", - "release_date": "2019-03-06" - }, - { - "title": "Avengers: Endgame", - "release_date": "2019-04-24" - }, - { - "title": "Spider-Man: Far from Home", - "release_date": "2019-06-28" - }, - { - "title": "Black Widow", - "release_date": "2020-10-28" - }, - { - "title": "Untitled Spider-Man 3", - "release_date": "2021-11-04" - }, - { - "title": "Thor: Love and Thunder", - "release_date": "2022-02-10" - }, - { - "title": "Doctor Strange in the Multiverse of Madness", - "release_date": "2022-03-23" - }, - { - "title": "Untitled Marvel Project (3)", - "release_date": "2022-07-29" - }, - { - "title": "Guardians of the Galaxy Vol. 3", - "release_date": "2023-02-16" - } + { + "title": "Iron Man", + "release_date": "2008-04-30" + }, + { + "title": "The Incredible Hulk", + "release_date": "2008-06-12" + }, + { + "title": "Iron Man 2", + "release_date": "2010-04-28" + }, + { + "title": "Thor", + "release_date": "2011-04-21" + }, + { + "title": "Captain America: The First Avenger", + "release_date": "2011-07-22" + }, + { + "title": "Marvel One-Shot: The Consultant", + "release_date": "2011-09-12" + }, + { + "title": "Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer", + "release_date": "2011-10-25" + }, + { + "title": "The Avengers", + "release_date": "2012-04-25" + }, + { + "title": "Marvel One-Shot: Item 47", + "release_date": "2012-09-13" + }, + { + "title": "Iron Man 3", + "release_date": "2013-04-18" + }, + { + "title": "Marvel One-Shot: Agent Carter", + "release_date": "2013-09-08" + }, + { + "title": "Thor: The Dark World", + "release_date": "2013-10-29" + }, + { + "title": "Marvel One-Shot: All Hail the King", + "release_date": "2014-02-04" + }, + { + "title": "Marvel Studios: Assembling a Universe", + "release_date": "2014-03-18" + }, + { + "title": "Captain America: The Winter Soldier", + "release_date": "2014-03-20" + }, + { + "title": "Guardians of the Galaxy", + "release_date": "2014-07-30" + }, + { + "title": "Avengers: Age of Ultron", + "release_date": "2015-04-22" + }, + { + "title": "Ant-Man", + "release_date": "2015-07-14" + }, + { + "title": "Captain America: Civil War", + "release_date": "2016-04-27" + }, + { + "title": "Team Thor", + "release_date": "2016-08-28" + }, + { + "title": "Doctor Strange", + "release_date": "2016-10-25" + }, + { + "title": "Guardians of the Galaxy Vol. 2", + "release_date": "2017-04-19" + }, + { + "title": "Spider-Man: Homecoming", + "release_date": "2017-07-05" + }, + { + "title": "Thor: Ragnarok", + "release_date": "2017-10-25" + }, + { + "title": "Black Panther", + "release_date": "2018-02-13" + }, + { + "title": "Avengers: Infinity War", + "release_date": "2018-04-25" + }, + { + "title": "Ant-Man and the Wasp", + "release_date": "2018-07-04" + }, + { + "title": "Captain Marvel", + "release_date": "2019-03-06" + }, + { + "title": "Avengers: Endgame", + "release_date": "2019-04-24" + }, + { + "title": "Spider-Man: Far from Home", + "release_date": "2019-06-28" + }, + { + "title": "Black Widow", + "release_date": "2020-10-28" + }, + { + "title": "Untitled Spider-Man 3", + "release_date": "2021-11-04" + }, + { + "title": "Thor: Love and Thunder", + "release_date": "2022-02-10" + }, + { + "title": "Doctor Strange in the Multiverse of Madness", + "release_date": "2022-03-23" + }, + { + "title": "Untitled Marvel Project (3)", + "release_date": "2022-07-29" + }, + { + "title": "Guardians of the Galaxy Vol. 3", + "release_date": "2023-02-16" + } ] ``` - --- ## Use search_json to show the movies with the largest casts -This example shows how we can use SEARCH_JSON to perform a simple calculation on JSON and order by the results. The cast attribute holds an object array of details around the cast of a movie. We use the expression '$count(id)' that counts each id and returns the value back which we alias in SQL as cast_size which in turn gets used to sort the rows. + +This example shows how we can use SEARCH_JSON to perform a simple calculation on JSON and order by the results. The cast attribute holds an object array of details around the cast of a movie. We use the expression '$count(id)' that counts each id and returns the value back which we alias in SQL as cast_size which in turn gets used to sort the rows. ### Body ```json { - "operation": "sql", - "sql": "SELECT movie_title, search_json('$count(id)', `cast`) as cast_size FROM movies.credits ORDER BY cast_size DESC LIMIT 10" + "operation": "sql", + "sql": "SELECT movie_title, search_json('$count(id)', `cast`) as cast_size FROM movies.credits ORDER BY cast_size DESC LIMIT 10" } ``` ### Response: 200 + ```json [ - { - "movie_title": "Around the World in Eighty Days", - "cast_size": 312 - }, - { - "movie_title": "And the Oscar Goes To...", - "cast_size": 259 - }, - { - "movie_title": "Rock of Ages", - "cast_size": 223 - }, - { - "movie_title": "Mr. Smith Goes to Washington", - "cast_size": 213 - }, - { - "movie_title": "Les Misérables", - "cast_size": 208 - }, - { - "movie_title": "Jason Bourne", - "cast_size": 201 - }, - { - "movie_title": "The Muppets", - "cast_size": 191 - }, - { - "movie_title": "You Don't Mess with the Zohan", - "cast_size": 183 - }, - { - "movie_title": "The Irishman", - "cast_size": 173 - }, - { - "movie_title": "Spider-Man: Far from Home", - "cast_size": 173 - } + { + "movie_title": "Around the World in Eighty Days", + "cast_size": 312 + }, + { + "movie_title": "And the Oscar Goes To...", + "cast_size": 259 + }, + { + "movie_title": "Rock of Ages", + "cast_size": 223 + }, + { + "movie_title": "Mr. Smith Goes to Washington", + "cast_size": 213 + }, + { + "movie_title": "Les Misérables", + "cast_size": 208 + }, + { + "movie_title": "Jason Bourne", + "cast_size": 201 + }, + { + "movie_title": "The Muppets", + "cast_size": 191 + }, + { + "movie_title": "You Don't Mess with the Zohan", + "cast_size": 183 + }, + { + "movie_title": "The Irishman", + "cast_size": 173 + }, + { + "movie_title": "Spider-Man: Far from Home", + "cast_size": 173 + } ] ``` - --- ## search_json as a condition, in a select with a table join -This example shows how we can use SEARCH_JSON to find movies where at least of 2 our favorite actors from Marvel films have acted together then list the movie, its overview, release date, and the actors names and their characters. The WHERE clause performs a count on credits.cast attribute that have the matching actors. The SELECT performs the same filter on the cast attribute and performs a transform on each object to just return the actor's name and their character. + +This example shows how we can use SEARCH_JSON to find movies where at least of 2 our favorite actors from Marvel films have acted together then list the movie, its overview, release date, and the actors names and their characters. The WHERE clause performs a count on credits.cast attribute that have the matching actors. The SELECT performs the same filter on the cast attribute and performs a transform on each object to just return the actor's name and their character. ### Body ```json { - "operation": "sql", - "sql": "SELECT m.title, m.overview, m.release_date, search_json('$[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]].{\"actor\": name, \"character\": character}', c.`cast`) as characters FROM movies.credits c INNER JOIN movies.movie m ON c.movie_id = m.id WHERE search_json('$count($[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]])', c.`cast`) >= 2" + "operation": "sql", + "sql": "SELECT m.title, m.overview, m.release_date, search_json('$[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]].{\"actor\": name, \"character\": character}', c.`cast`) as characters FROM movies.credits c INNER JOIN movies.movie m ON c.movie_id = m.id WHERE search_json('$count($[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]])', c.`cast`) >= 2" } ``` ### Response: 200 + ```json [ - { - "title": "Out of Sight", - "overview": "Meet Jack Foley, a smooth criminal who bends the law and is determined to make one last heist. Karen Sisco is a federal marshal who chooses all the right moves … and all the wrong guys. Now they're willing to risk it all to find out if there's more between them than just the law.", - "release_date": "1998-06-26", - "characters": [ - { - "actor": "Don Cheadle", - "character": "Maurice Miller" - }, - { - "actor": "Samuel L. Jackson", - "character": "Hejira Henry (uncredited)" - } - ] - }, - { - "title": "Iron Man", - "overview": "After being held captive in an Afghan cave, billionaire engineer Tony Stark creates a unique weaponized suit of armor to fight evil.", - "release_date": "2008-04-30", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury (uncredited)" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - } - ] - }, - { - "title": "Captain America: The First Avenger", - "overview": "During World War II, Steve Rogers is a sickly man from Brooklyn who's transformed into super-soldier Captain America to aid in the war effort. Rogers must stop the Red Skull – Adolf Hitler's ruthless head of weaponry, and the leader of an organization that intends to use a mysterious device of untold powers for world domination.", - "release_date": "2011-07-22", - "characters": [ - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - } - ] - }, - { - "title": "In Good Company", - "overview": "Dan Foreman is a seasoned advertisement sales executive at a high-ranking publication when a corporate takeover results in him being placed under naive supervisor Carter Duryea, who is half his age. Matters are made worse when Dan's new supervisor becomes romantically involved with his daughter an 18 year-old college student Alex.", - "release_date": "2004-12-29", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Alex Foreman" - }, - { - "actor": "Clark Gregg", - "character": "Mark Steckle" - } - ] - }, - { - "title": "Zodiac", - "overview": "The true story of the investigation of the \"Zodiac Killer\", a serial killer who terrified the San Francisco Bay Area, taunting police with his ciphers and letters. The case becomes an obsession for three men as their lives and careers are built and destroyed by the endless trail of clues.", - "release_date": "2007-03-02", - "characters": [ - { - "actor": "Mark Ruffalo", - "character": "Dave Toschi" - }, - { - "actor": "Robert Downey Jr.", - "character": "Paul Avery" - } - ] - }, - { - "title": "Hard Eight", - "overview": "A stranger mentors a young Reno gambler who weds a hooker and befriends a vulgar casino regular.", - "release_date": "1996-02-28", - "characters": [ - { - "actor": "Gwyneth Paltrow", - "character": "Clementine" - }, - { - "actor": "Samuel L. Jackson", - "character": "Jimmy" - } - ] - }, - { - "title": "The Spirit", - "overview": "Down these mean streets a man must come. A hero born, murdered, and born again. A Rookie cop named Denny Colt returns from the beyond as The Spirit, a hero whose mission is to fight against the bad forces from the shadows of Central City. The Octopus, who kills anyone unfortunate enough to see his face, has other plans; he is going to wipe out the entire city.", - "release_date": "2008-12-25", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Silken Floss" - }, - { - "actor": "Samuel L. Jackson", - "character": "Octopuss" - } - ] - }, - { - "title": "S.W.A.T.", - "overview": "Hondo Harrelson recruits Jim Street to join an elite unit of the Los Angeles Police Department. Together they seek out more members, including tough Deke Kay and single mom Chris Sanchez. The team's first big assignment is to escort crime boss Alex Montel to prison. It seems routine, but when Montel offers a huge reward to anyone who can break him free, criminals of various stripes step up for the prize.", - "release_date": "2003-08-08", - "characters": [ - { - "actor": "Samuel L. Jackson", - "character": "Sgt. Dan 'Hondo' Harrelson" - }, - { - "actor": "Jeremy Renner", - "character": "Brian Gamble" - } - ] - }, - { - "title": "Iron Man 2", - "overview": "With the world now aware of his dual life as the armored superhero Iron Man, billionaire inventor Tony Stark faces pressure from the government, the press and the public to share his technology with the military. Unwilling to let go of his invention, Stark, with Pepper Potts and James 'Rhodey' Rhodes at his side, must forge new alliances – and confront powerful enemies.", - "release_date": "2010-04-28", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - }, - { - "actor": "Scarlett Johansson", - "character": "Natalie Rushman / Natasha Romanoff / Black Widow" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - } - ] - }, - { - "title": "Thor", - "overview": "Against his father Odin's will, The Mighty Thor - a powerful but arrogant warrior god - recklessly reignites an ancient war. Thor is cast down to Earth and forced to live among humans as punishment. Once here, Thor learns what it takes to be a true hero when the most dangerous villain of his world sends the darkest forces of Asgard to invade Earth.", - "release_date": "2011-04-21", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye (uncredited)" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury (uncredited)" - } - ] - }, - { - "title": "View from the Top", - "overview": "A small-town woman tries to achieve her goal of becoming a flight attendant.", - "release_date": "2003-03-21", - "characters": [ - { - "actor": "Gwyneth Paltrow", - "character": "Donna" - }, - { - "actor": "Mark Ruffalo", - "character": "Ted Stewart" - } - ] - }, - { - "title": "The Nanny Diaries", - "overview": "A college graduate goes to work as a nanny for a rich New York family. Ensconced in their home, she has to juggle their dysfunction, a new romance, and the spoiled brat in her charge.", - "release_date": "2007-08-24", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Annie Braddock" - }, - { - "actor": "Chris Evans", - "character": "Hayden \"Harvard Hottie\"" - } - ] - }, - { - "title": "The Perfect Score", - "overview": "Six high school seniors decide to break into the Princeton Testing Center so they can steal the answers to their upcoming SAT tests and all get perfect scores.", - "release_date": "2004-01-30", - "characters": [ - { - "actor": "Chris Evans", - "character": "Kyle" - }, - { - "actor": "Scarlett Johansson", - "character": "Francesca Curtis" - } - ] - }, - { - "title": "The Avengers", - "overview": "When an unexpected enemy emerges and threatens global safety and security, Nick Fury, director of the international peacekeeping agency known as S.H.I.E.L.D., finds himself in need of a team to pull the world back from the brink of disaster. Spanning the globe, a daring recruitment effort begins!", - "release_date": "2012-04-25", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - } - ] - }, - { - "title": "Iron Man 3", - "overview": "When Tony Stark's world is torn apart by a formidable terrorist called the Mandarin, he starts an odyssey of rebuilding and retribution.", - "release_date": "2013-04-18", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / Iron Patriot" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner (uncredited)" - } - ] - }, - { - "title": "Marvel One-Shot: The Consultant", - "overview": "Agent Coulson informs Agent Sitwell that the World Security Council wishes Emil Blonsky to be released from prison to join the Avengers Initiative. As Nick Fury doesn't want to release Blonsky, the two agents decide to send a patsy to sabotage the meeting...", - "release_date": "2011-09-12", - "characters": [ - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark (archive footage)" - } - ] - }, - { - "title": "Thor: The Dark World", - "overview": "Thor fights to restore order across the cosmos… but an ancient race led by the vengeful Malekith returns to plunge the universe back into darkness. Faced with an enemy that even Odin and Asgard cannot withstand, Thor must embark on his most perilous and personal journey yet, one that will reunite him with Jane Foster and force him to sacrifice everything to save us all.", - "release_date": "2013-10-29", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Chris Evans", - "character": "Loki as Captain America (uncredited)" - } - ] - }, - { - "title": "Avengers: Age of Ultron", - "overview": "When Tony Stark tries to jumpstart a dormant peacekeeping program, things go awry and Earth’s Mightiest Heroes are put to the ultimate test as the fate of the planet hangs in the balance. As the villainous Ultron emerges, it is up to The Avengers to stop him from enacting his terrible plans, and soon uneasy alliances and unexpected action pave the way for an epic and unique global adventure.", - "release_date": "2015-04-22", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - } - ] - }, - { - "title": "Captain America: The Winter Soldier", - "overview": "After the cataclysmic events in New York with The Avengers, Steve Rogers, aka Captain America is living quietly in Washington, D.C. and trying to adjust to the modern world. But when a S.H.I.E.L.D. colleague comes under attack, Steve becomes embroiled in a web of intrigue that threatens to put the world at risk. Joining forces with the Black Widow, Captain America struggles to expose the ever-widening conspiracy while fighting off professional assassins sent to silence him at every turn. When the full scope of the villainous plot is revealed, Captain America and the Black Widow enlist the help of a new ally, the Falcon. However, they soon find themselves up against an unexpected and formidable enemy—the Winter Soldier.", - "release_date": "2014-03-20", - "characters": [ - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - } - ] - }, - { - "title": "Thanks for Sharing", - "overview": "A romantic comedy that brings together three disparate characters who are learning to face a challenging and often confusing world as they struggle together against a common demon—sex addiction.", - "release_date": "2013-09-19", - "characters": [ - { - "actor": "Mark Ruffalo", - "character": "Adam" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Phoebe" - } - ] - }, - { - "title": "Chef", - "overview": "When Chef Carl Casper suddenly quits his job at a prominent Los Angeles restaurant after refusing to compromise his creative integrity for its controlling owner, he is left to figure out what's next. Finding himself in Miami, he teams up with his ex-wife, his friend and his son to launch a food truck. Taking to the road, Chef Carl goes back to his roots to reignite his passion for the kitchen -- and zest for life and love.", - "release_date": "2014-05-08", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Molly" - }, - { - "actor": "Robert Downey Jr.", - "character": "Marvin" - } - ] - }, - { - "title": "Marvel Studios: Assembling a Universe", - "overview": "A look at the story behind Marvel Studios and the Marvel Cinematic Universe, featuring interviews and behind-the-scenes footage from all of the Marvel films, the Marvel One-Shots and \"Marvel's Agents of S.H.I.E.L.D.\"", - "release_date": "2014-03-18", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Himself / Tony Stark / Iron Man" - }, - { - "actor": "Chris Hemsworth", - "character": "Himself / Thor" - }, - { - "actor": "Chris Evans", - "character": "Himself / Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Himself / Bruce Banner / Hulk" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Herself" - }, - { - "actor": "Clark Gregg", - "character": "Himself" - }, - { - "actor": "Samuel L. Jackson", - "character": "Himself" - }, - { - "actor": "Scarlett Johansson", - "character": "Herself" - }, - { - "actor": "Jeremy Renner", - "character": "Himself" - } - ] - }, - { - "title": "Captain America: Civil War", - "overview": "Following the events of Age of Ultron, the collective governments of the world pass an act designed to regulate all superhuman activity. This polarizes opinion amongst the Avengers, causing two factions to side with Iron Man or Captain America, which causes an epic battle between former allies.", - "release_date": "2016-04-27", - "characters": [ - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - } - ] - }, - { - "title": "Thor: Ragnarok", - "overview": "Thor is imprisoned on the other side of the universe and finds himself in a race against time to get back to Asgard to stop Ragnarok, the destruction of his home-world and the end of Asgardian civilization, at the hands of an all-powerful new threat, the ruthless Hela.", - "release_date": "2017-10-25", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / Hulk" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow (archive footage / uncredited)" - } - ] - }, - { - "title": "Avengers: Endgame", - "overview": "After the devastating events of Avengers: Infinity War, the universe is in ruins due to the efforts of the Mad Titan, Thanos. With the help of remaining allies, the Avengers must assemble once more in order to undo Thanos' actions and restore order to the universe once and for all, no matter what consequences may be in store.", - "release_date": "2019-04-24", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / Hulk" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - }, - { - "actor": "Don Cheadle", - "character": "James Rhodes / War Machine" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Pepper Potts" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - } - ] - }, - { - "title": "Avengers: Infinity War", - "overview": "As the Avengers and their allies have continued to protect the world from threats too large for any one hero to handle, a new danger has emerged from the cosmic shadows: Thanos. A despot of intergalactic infamy, his goal is to collect all six Infinity Stones, artifacts of unimaginable power, and use them to inflict his twisted will on all of reality. Everything the Avengers have fought for has led up to this moment - the fate of Earth and existence itself has never been more uncertain.", - "release_date": "2018-04-25", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury (uncredited)" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - } - ] - }, - { - "title": "Captain Marvel", - "overview": "The story follows Carol Danvers as she becomes one of the universe’s most powerful heroes when Earth is caught in the middle of a galactic war between two alien races. Set in the 1990s, Captain Marvel is an all-new adventure from a previously unseen period in the history of the Marvel Cinematic Universe.", - "release_date": "2019-03-06", - "characters": [ - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Clark Gregg", - "character": "Agent Phil Coulson" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America (uncredited)" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow (uncredited)" - }, - { - "actor": "Don Cheadle", - "character": "James 'Rhodey' Rhodes / War Machine (uncredited)" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk (uncredited)" - } - ] - }, - { - "title": "Spider-Man: Homecoming", - "overview": "Following the events of Captain America: Civil War, Peter Parker, with the help of his mentor Tony Stark, tries to balance his life as an ordinary high school student in Queens, New York City, with fighting crime as his superhero alter ego Spider-Man as a new threat, the Vulture, emerges.", - "release_date": "2017-07-05", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - } - ] - }, - { - "title": "Team Thor", - "overview": "Discover what Thor was up to during the events of Captain America: Civil War.", - "release_date": "2016-08-28", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner" - } - ] - }, - { - "title": "Black Widow", - "overview": "Natasha Romanoff, also known as Black Widow, confronts the darker parts of her ledger when a dangerous conspiracy with ties to her past arises. Pursued by a force that will stop at nothing to bring her down, Natasha must deal with her history as a spy and the broken relationships left in her wake long before she became an Avenger.", - "release_date": "2020-10-28", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - } - ] - } + { + "title": "Out of Sight", + "overview": "Meet Jack Foley, a smooth criminal who bends the law and is determined to make one last heist. Karen Sisco is a federal marshal who chooses all the right moves … and all the wrong guys. Now they're willing to risk it all to find out if there's more between them than just the law.", + "release_date": "1998-06-26", + "characters": [ + { + "actor": "Don Cheadle", + "character": "Maurice Miller" + }, + { + "actor": "Samuel L. Jackson", + "character": "Hejira Henry (uncredited)" + } + ] + }, + { + "title": "Iron Man", + "overview": "After being held captive in an Afghan cave, billionaire engineer Tony Stark creates a unique weaponized suit of armor to fight evil.", + "release_date": "2008-04-30", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury (uncredited)" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + } + ] + }, + { + "title": "Captain America: The First Avenger", + "overview": "During World War II, Steve Rogers is a sickly man from Brooklyn who's transformed into super-soldier Captain America to aid in the war effort. Rogers must stop the Red Skull – Adolf Hitler's ruthless head of weaponry, and the leader of an organization that intends to use a mysterious device of untold powers for world domination.", + "release_date": "2011-07-22", + "characters": [ + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + } + ] + }, + { + "title": "In Good Company", + "overview": "Dan Foreman is a seasoned advertisement sales executive at a high-ranking publication when a corporate takeover results in him being placed under naive supervisor Carter Duryea, who is half his age. Matters are made worse when Dan's new supervisor becomes romantically involved with his daughter an 18 year-old college student Alex.", + "release_date": "2004-12-29", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Alex Foreman" + }, + { + "actor": "Clark Gregg", + "character": "Mark Steckle" + } + ] + }, + { + "title": "Zodiac", + "overview": "The true story of the investigation of the \"Zodiac Killer\", a serial killer who terrified the San Francisco Bay Area, taunting police with his ciphers and letters. The case becomes an obsession for three men as their lives and careers are built and destroyed by the endless trail of clues.", + "release_date": "2007-03-02", + "characters": [ + { + "actor": "Mark Ruffalo", + "character": "Dave Toschi" + }, + { + "actor": "Robert Downey Jr.", + "character": "Paul Avery" + } + ] + }, + { + "title": "Hard Eight", + "overview": "A stranger mentors a young Reno gambler who weds a hooker and befriends a vulgar casino regular.", + "release_date": "1996-02-28", + "characters": [ + { + "actor": "Gwyneth Paltrow", + "character": "Clementine" + }, + { + "actor": "Samuel L. Jackson", + "character": "Jimmy" + } + ] + }, + { + "title": "The Spirit", + "overview": "Down these mean streets a man must come. A hero born, murdered, and born again. A Rookie cop named Denny Colt returns from the beyond as The Spirit, a hero whose mission is to fight against the bad forces from the shadows of Central City. The Octopus, who kills anyone unfortunate enough to see his face, has other plans; he is going to wipe out the entire city.", + "release_date": "2008-12-25", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Silken Floss" + }, + { + "actor": "Samuel L. Jackson", + "character": "Octopuss" + } + ] + }, + { + "title": "S.W.A.T.", + "overview": "Hondo Harrelson recruits Jim Street to join an elite unit of the Los Angeles Police Department. Together they seek out more members, including tough Deke Kay and single mom Chris Sanchez. The team's first big assignment is to escort crime boss Alex Montel to prison. It seems routine, but when Montel offers a huge reward to anyone who can break him free, criminals of various stripes step up for the prize.", + "release_date": "2003-08-08", + "characters": [ + { + "actor": "Samuel L. Jackson", + "character": "Sgt. Dan 'Hondo' Harrelson" + }, + { + "actor": "Jeremy Renner", + "character": "Brian Gamble" + } + ] + }, + { + "title": "Iron Man 2", + "overview": "With the world now aware of his dual life as the armored superhero Iron Man, billionaire inventor Tony Stark faces pressure from the government, the press and the public to share his technology with the military. Unwilling to let go of his invention, Stark, with Pepper Potts and James 'Rhodey' Rhodes at his side, must forge new alliances – and confront powerful enemies.", + "release_date": "2010-04-28", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + }, + { + "actor": "Scarlett Johansson", + "character": "Natalie Rushman / Natasha Romanoff / Black Widow" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + } + ] + }, + { + "title": "Thor", + "overview": "Against his father Odin's will, The Mighty Thor - a powerful but arrogant warrior god - recklessly reignites an ancient war. Thor is cast down to Earth and forced to live among humans as punishment. Once here, Thor learns what it takes to be a true hero when the most dangerous villain of his world sends the darkest forces of Asgard to invade Earth.", + "release_date": "2011-04-21", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye (uncredited)" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury (uncredited)" + } + ] + }, + { + "title": "View from the Top", + "overview": "A small-town woman tries to achieve her goal of becoming a flight attendant.", + "release_date": "2003-03-21", + "characters": [ + { + "actor": "Gwyneth Paltrow", + "character": "Donna" + }, + { + "actor": "Mark Ruffalo", + "character": "Ted Stewart" + } + ] + }, + { + "title": "The Nanny Diaries", + "overview": "A college graduate goes to work as a nanny for a rich New York family. Ensconced in their home, she has to juggle their dysfunction, a new romance, and the spoiled brat in her charge.", + "release_date": "2007-08-24", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Annie Braddock" + }, + { + "actor": "Chris Evans", + "character": "Hayden \"Harvard Hottie\"" + } + ] + }, + { + "title": "The Perfect Score", + "overview": "Six high school seniors decide to break into the Princeton Testing Center so they can steal the answers to their upcoming SAT tests and all get perfect scores.", + "release_date": "2004-01-30", + "characters": [ + { + "actor": "Chris Evans", + "character": "Kyle" + }, + { + "actor": "Scarlett Johansson", + "character": "Francesca Curtis" + } + ] + }, + { + "title": "The Avengers", + "overview": "When an unexpected enemy emerges and threatens global safety and security, Nick Fury, director of the international peacekeeping agency known as S.H.I.E.L.D., finds himself in need of a team to pull the world back from the brink of disaster. Spanning the globe, a daring recruitment effort begins!", + "release_date": "2012-04-25", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + } + ] + }, + { + "title": "Iron Man 3", + "overview": "When Tony Stark's world is torn apart by a formidable terrorist called the Mandarin, he starts an odyssey of rebuilding and retribution.", + "release_date": "2013-04-18", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / Iron Patriot" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner (uncredited)" + } + ] + }, + { + "title": "Marvel One-Shot: The Consultant", + "overview": "Agent Coulson informs Agent Sitwell that the World Security Council wishes Emil Blonsky to be released from prison to join the Avengers Initiative. As Nick Fury doesn't want to release Blonsky, the two agents decide to send a patsy to sabotage the meeting...", + "release_date": "2011-09-12", + "characters": [ + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark (archive footage)" + } + ] + }, + { + "title": "Thor: The Dark World", + "overview": "Thor fights to restore order across the cosmos… but an ancient race led by the vengeful Malekith returns to plunge the universe back into darkness. Faced with an enemy that even Odin and Asgard cannot withstand, Thor must embark on his most perilous and personal journey yet, one that will reunite him with Jane Foster and force him to sacrifice everything to save us all.", + "release_date": "2013-10-29", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Chris Evans", + "character": "Loki as Captain America (uncredited)" + } + ] + }, + { + "title": "Avengers: Age of Ultron", + "overview": "When Tony Stark tries to jumpstart a dormant peacekeeping program, things go awry and Earth’s Mightiest Heroes are put to the ultimate test as the fate of the planet hangs in the balance. As the villainous Ultron emerges, it is up to The Avengers to stop him from enacting his terrible plans, and soon uneasy alliances and unexpected action pave the way for an epic and unique global adventure.", + "release_date": "2015-04-22", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + } + ] + }, + { + "title": "Captain America: The Winter Soldier", + "overview": "After the cataclysmic events in New York with The Avengers, Steve Rogers, aka Captain America is living quietly in Washington, D.C. and trying to adjust to the modern world. But when a S.H.I.E.L.D. colleague comes under attack, Steve becomes embroiled in a web of intrigue that threatens to put the world at risk. Joining forces with the Black Widow, Captain America struggles to expose the ever-widening conspiracy while fighting off professional assassins sent to silence him at every turn. When the full scope of the villainous plot is revealed, Captain America and the Black Widow enlist the help of a new ally, the Falcon. However, they soon find themselves up against an unexpected and formidable enemy—the Winter Soldier.", + "release_date": "2014-03-20", + "characters": [ + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + } + ] + }, + { + "title": "Thanks for Sharing", + "overview": "A romantic comedy that brings together three disparate characters who are learning to face a challenging and often confusing world as they struggle together against a common demon—sex addiction.", + "release_date": "2013-09-19", + "characters": [ + { + "actor": "Mark Ruffalo", + "character": "Adam" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Phoebe" + } + ] + }, + { + "title": "Chef", + "overview": "When Chef Carl Casper suddenly quits his job at a prominent Los Angeles restaurant after refusing to compromise his creative integrity for its controlling owner, he is left to figure out what's next. Finding himself in Miami, he teams up with his ex-wife, his friend and his son to launch a food truck. Taking to the road, Chef Carl goes back to his roots to reignite his passion for the kitchen -- and zest for life and love.", + "release_date": "2014-05-08", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Molly" + }, + { + "actor": "Robert Downey Jr.", + "character": "Marvin" + } + ] + }, + { + "title": "Marvel Studios: Assembling a Universe", + "overview": "A look at the story behind Marvel Studios and the Marvel Cinematic Universe, featuring interviews and behind-the-scenes footage from all of the Marvel films, the Marvel One-Shots and \"Marvel's Agents of S.H.I.E.L.D.\"", + "release_date": "2014-03-18", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Himself / Tony Stark / Iron Man" + }, + { + "actor": "Chris Hemsworth", + "character": "Himself / Thor" + }, + { + "actor": "Chris Evans", + "character": "Himself / Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Himself / Bruce Banner / Hulk" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Herself" + }, + { + "actor": "Clark Gregg", + "character": "Himself" + }, + { + "actor": "Samuel L. Jackson", + "character": "Himself" + }, + { + "actor": "Scarlett Johansson", + "character": "Herself" + }, + { + "actor": "Jeremy Renner", + "character": "Himself" + } + ] + }, + { + "title": "Captain America: Civil War", + "overview": "Following the events of Age of Ultron, the collective governments of the world pass an act designed to regulate all superhuman activity. This polarizes opinion amongst the Avengers, causing two factions to side with Iron Man or Captain America, which causes an epic battle between former allies.", + "release_date": "2016-04-27", + "characters": [ + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + } + ] + }, + { + "title": "Thor: Ragnarok", + "overview": "Thor is imprisoned on the other side of the universe and finds himself in a race against time to get back to Asgard to stop Ragnarok, the destruction of his home-world and the end of Asgardian civilization, at the hands of an all-powerful new threat, the ruthless Hela.", + "release_date": "2017-10-25", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / Hulk" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow (archive footage / uncredited)" + } + ] + }, + { + "title": "Avengers: Endgame", + "overview": "After the devastating events of Avengers: Infinity War, the universe is in ruins due to the efforts of the Mad Titan, Thanos. With the help of remaining allies, the Avengers must assemble once more in order to undo Thanos' actions and restore order to the universe once and for all, no matter what consequences may be in store.", + "release_date": "2019-04-24", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / Hulk" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + }, + { + "actor": "Don Cheadle", + "character": "James Rhodes / War Machine" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Pepper Potts" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + } + ] + }, + { + "title": "Avengers: Infinity War", + "overview": "As the Avengers and their allies have continued to protect the world from threats too large for any one hero to handle, a new danger has emerged from the cosmic shadows: Thanos. A despot of intergalactic infamy, his goal is to collect all six Infinity Stones, artifacts of unimaginable power, and use them to inflict his twisted will on all of reality. Everything the Avengers have fought for has led up to this moment - the fate of Earth and existence itself has never been more uncertain.", + "release_date": "2018-04-25", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury (uncredited)" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + } + ] + }, + { + "title": "Captain Marvel", + "overview": "The story follows Carol Danvers as she becomes one of the universe’s most powerful heroes when Earth is caught in the middle of a galactic war between two alien races. Set in the 1990s, Captain Marvel is an all-new adventure from a previously unseen period in the history of the Marvel Cinematic Universe.", + "release_date": "2019-03-06", + "characters": [ + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Clark Gregg", + "character": "Agent Phil Coulson" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America (uncredited)" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow (uncredited)" + }, + { + "actor": "Don Cheadle", + "character": "James 'Rhodey' Rhodes / War Machine (uncredited)" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk (uncredited)" + } + ] + }, + { + "title": "Spider-Man: Homecoming", + "overview": "Following the events of Captain America: Civil War, Peter Parker, with the help of his mentor Tony Stark, tries to balance his life as an ordinary high school student in Queens, New York City, with fighting crime as his superhero alter ego Spider-Man as a new threat, the Vulture, emerges.", + "release_date": "2017-07-05", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + } + ] + }, + { + "title": "Team Thor", + "overview": "Discover what Thor was up to during the events of Captain America: Civil War.", + "release_date": "2016-08-28", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner" + } + ] + }, + { + "title": "Black Widow", + "overview": "Natasha Romanoff, also known as Black Widow, confronts the darker parts of her ledger when a dangerous conspiracy with ties to her past arises. Pursued by a force that will stop at nothing to bring her down, Natasha must deal with her history as a spy and the broken relationships left in her wake long before she became an Avenger.", + "release_date": "2020-10-28", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + } + ] + } ] ``` diff --git a/site/versioned_docs/version-4.2/developers/operations-api/bulk-operations.md b/site/versioned_docs/version-4.2/developers/operations-api/bulk-operations.md index 59430b69..d698130f 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/bulk-operations.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/bulk-operations.md @@ -5,132 +5,144 @@ title: Bulk Operations # Bulk Operations ## CSV Data Load + Ingests CSV data, provided directly in the operation as an `insert`, `update` or `upsert` into the specified database table. -* operation _(required)_ - must always be `csv_data_load` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* data _(required)_ - csv data to import into HarperDB +- operation _(required)_ - must always be `csv_data_load` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- data _(required)_ - csv data to import into HarperDB ### Body + ```json { - "operation": "csv_data_load", - "database": "dev", - "action": "insert", - "table": "breed", - "data": "id,name,section,country,image\n1,ENGLISH POINTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/001g07.jpg\n2,ENGLISH SETTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/002g07.jpg\n3,KERRY BLUE TERRIER,Large and medium sized Terriers,IRELAND,\n" + "operation": "csv_data_load", + "database": "dev", + "action": "insert", + "table": "breed", + "data": "id,name,section,country,image\n1,ENGLISH POINTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/001g07.jpg\n2,ENGLISH SETTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/002g07.jpg\n3,KERRY BLUE TERRIER,Large and medium sized Terriers,IRELAND,\n" } ``` ### Response: 200 + ```json - { - "message": "Starting job with id 2fe25039-566e-4670-8bb3-2db3d4e07e69", - "job_id": "2fe25039-566e-4670-8bb3-2db3d4e07e69" - } +{ + "message": "Starting job with id 2fe25039-566e-4670-8bb3-2db3d4e07e69", + "job_id": "2fe25039-566e-4670-8bb3-2db3d4e07e69" +} ``` --- ## CSV File Load -Ingests CSV data, provided via a path on the local filesystem, as an `insert`, `update` or `upsert` into the specified database table. + +Ingests CSV data, provided via a path on the local filesystem, as an `insert`, `update` or `upsert` into the specified database table. _Note: The CSV file must reside on the same machine on which HarperDB is running. For example, the path to a CSV on your computer will produce an error if your HarperDB instance is a cloud instance._ -* operation _(required)_ - must always be `csv_file_load` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* file_path _(required)_ - path to the csv file on the host running harperdb +- operation _(required)_ - must always be `csv_file_load` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- file*path *(required)\_ - path to the csv file on the host running harperdb ### Body + ```json { - "operation": "csv_file_load", - "action": "insert", - "database": "dev", - "table": "breed", - "file_path": "/home/user/imports/breeds.csv" + "operation": "csv_file_load", + "action": "insert", + "database": "dev", + "table": "breed", + "file_path": "/home/user/imports/breeds.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 3994d8e2-ec6a-43c4-8563-11c1df81870e", - "job_id": "3994d8e2-ec6a-43c4-8563-11c1df81870e" + "message": "Starting job with id 3994d8e2-ec6a-43c4-8563-11c1df81870e", + "job_id": "3994d8e2-ec6a-43c4-8563-11c1df81870e" } ``` --- ## CSV URL Load + Ingests CSV data, provided via URL, as an `insert`, `update` or `upsert` into the specified database table. -* operation _(required)_ - must always be `csv_url_load` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* csv_url _(required)_ - URL to the csv +- operation _(required)_ - must always be `csv_url_load` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- csv*url *(required)\_ - URL to the csv ### Body + ```json { - "operation": "csv_url_load", - "action": "insert", - "database": "dev", - "table": "breed", - "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" + "operation": "csv_url_load", + "action": "insert", + "database": "dev", + "table": "breed", + "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 332aa0a2-6833-46cd-88a6-ae375920436a", - "job_id": "332aa0a2-6833-46cd-88a6-ae375920436a" + "message": "Starting job with id 332aa0a2-6833-46cd-88a6-ae375920436a", + "job_id": "332aa0a2-6833-46cd-88a6-ae375920436a" } ``` --- ## Import from S3 + This operation allows users to import CSV or JSON files from an AWS S3 bucket as an `insert`, `update` or `upsert`. -* operation _(required)_ - must always be `import_from_s3` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* s3 _(required)_ - object containing required AWS S3 bucket info for operation: - * aws_access_key_id - AWS access key for authenticating into your S3 bucket - * aws_secret_access_key - AWS secret for authenticating into your S3 bucket - * bucket - AWS S3 bucket to import from - * key - the name of the file to import - _the file must include a valid file extension ('.csv' or '.json')_ - * region - the region of the bucket +- operation _(required)_ - must always be `import_from_s3` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- s3 _(required)_ - object containing required AWS S3 bucket info for operation: + - aws_access_key_id - AWS access key for authenticating into your S3 bucket + - aws_secret_access_key - AWS secret for authenticating into your S3 bucket + - bucket - AWS S3 bucket to import from + - key - the name of the file to import - _the file must include a valid file extension ('.csv' or '.json')_ + - region - the region of the bucket ### Body + ```json { - "operation": "import_from_s3", - "action": "insert", - "database": "dev", - "table": "dog", - "s3": { - "aws_access_key_id": "YOUR_KEY", - "aws_secret_access_key": "YOUR_SECRET_KEY", - "bucket": "BUCKET_NAME", - "key": "OBJECT_NAME", - "region": "BUCKET_REGION" - } + "operation": "import_from_s3", + "action": "insert", + "database": "dev", + "table": "dog", + "s3": { + "aws_access_key_id": "YOUR_KEY", + "aws_secret_access_key": "YOUR_SECRET_KEY", + "bucket": "BUCKET_NAME", + "key": "OBJECT_NAME", + "region": "BUCKET_REGION" + } } ``` ### Response: 200 + ```json { - "message": "Starting job with id 062a1892-6a0a-4282-9791-0f4c93b12e16", - "job_id": "062a1892-6a0a-4282-9791-0f4c93b12e16" + "message": "Starting job with id 062a1892-6a0a-4282-9791-0f4c93b12e16", + "job_id": "062a1892-6a0a-4282-9791-0f4c93b12e16" } -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.2/developers/operations-api/clustering.md b/site/versioned_docs/version-4.2/developers/operations-api/clustering.md index 6933acfd..d2a34751 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/clustering.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/clustering.md @@ -1,183 +1,191 @@ --- -title: Clustering +title: Clustering --- -# Clustering +# Clustering ## Cluster Set Routes + Adds a route/routes to either the hub or leaf server cluster configuration. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_set_routes` -* server _(required)_ - must always be `hub` or `leaf`, in most cases you should use `hub` here -* routes _(required)_ - must always be an objects array with a host and port: - * host - the host of the remote instance you are clustering to - * port - the clustering port of the remote instance you are clustering to, in most cases this is the value in `clustering.hubServer.cluster.network.port` on the remote instance `harperdb-config.yaml` +- operation _(required)_ - must always be `cluster_set_routes` +- server _(required)_ - must always be `hub` or `leaf`, in most cases you should use `hub` here +- routes _(required)_ - must always be an objects array with a host and port: + - host - the host of the remote instance you are clustering to + - port - the clustering port of the remote instance you are clustering to, in most cases this is the value in `clustering.hubServer.cluster.network.port` on the remote instance `harperdb-config.yaml` ### Body + ```json { - "operation": "cluster_set_routes", - "server": "hub", - "routes": [ - { - "host": "3.22.181.22", - "port": 12345 - }, - { - "host": "3.137.184.8", - "port": 12345 - }, - { - "host": "18.223.239.195", - "port": 12345 - }, - { - "host": "18.116.24.71", - "port": 12345 - } - ] + "operation": "cluster_set_routes", + "server": "hub", + "routes": [ + { + "host": "3.22.181.22", + "port": 12345 + }, + { + "host": "3.137.184.8", + "port": 12345 + }, + { + "host": "18.223.239.195", + "port": 12345 + }, + { + "host": "18.116.24.71", + "port": 12345 + } + ] } ``` ### Response: 200 + ```json { - "message": "cluster routes successfully set", - "set": [ - { - "host": "3.22.181.22", - "port": 12345 - }, - { - "host": "3.137.184.8", - "port": 12345 - }, - { - "host": "18.223.239.195", - "port": 12345 - }, - { - "host": "18.116.24.71", - "port": 12345 - } - ], - "skipped": [] + "message": "cluster routes successfully set", + "set": [ + { + "host": "3.22.181.22", + "port": 12345 + }, + { + "host": "3.137.184.8", + "port": 12345 + }, + { + "host": "18.223.239.195", + "port": 12345 + }, + { + "host": "18.116.24.71", + "port": 12345 + } + ], + "skipped": [] } ``` --- ## Cluster Get Routes + Gets all the hub and leaf server routes from the config file. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_get_routes` +- operation _(required)_ - must always be `cluster_get_routes` ### Body + ```json { - "operation": "cluster_get_routes" + "operation": "cluster_get_routes" } ``` ### Response: 200 + ```json { - "hub": [ - { - "host": "3.22.181.22", - "port": 12345 - }, - { - "host": "3.137.184.8", - "port": 12345 - }, - { - "host": "18.223.239.195", - "port": 12345 - }, - { - "host": "18.116.24.71", - "port": 12345 - } - ], - "leaf": [] + "hub": [ + { + "host": "3.22.181.22", + "port": 12345 + }, + { + "host": "3.137.184.8", + "port": 12345 + }, + { + "host": "18.223.239.195", + "port": 12345 + }, + { + "host": "18.116.24.71", + "port": 12345 + } + ], + "leaf": [] } ``` --- ## Cluster Delete Routes + Removes route(s) from hub and/or leaf server routes array in config file. Returns a deletion success message and arrays of deleted and skipped records. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_delete_routes` -* routes _required_ - Must be an array of route object(s) +- operation _(required)_ - must always be `cluster_delete_routes` +- routes _required_ - Must be an array of route object(s) ### Body ```json { - "operation": "cluster_delete_routes", - "routes": [ - { - "host": "18.116.24.71", - "port": 12345 - } - ] + "operation": "cluster_delete_routes", + "routes": [ + { + "host": "18.116.24.71", + "port": 12345 + } + ] } ``` ### Response: 200 + ```json { - "message": "cluster routes successfully deleted", - "deleted": [ - { - "host": "18.116.24.71", - "port": 12345 - } - ], - "skipped": [] + "message": "cluster routes successfully deleted", + "deleted": [ + { + "host": "18.116.24.71", + "port": 12345 + } + ], + "skipped": [] } ``` - --- ## Add Node + Registers an additional HarperDB instance with associated subscriptions. Learn more about HarperDB clustering here: [https://harperdb.io/docs/clustering/](https://harperdb.io/docs/clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_node` -* node_name _(required)_ - the node name of the remote node -* subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: - * schema - the schema to replicate from - * table - the table to replicate from - * subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish - a boolean which determines if transactions on the local table should be replicated on the remote table - * start_time _(optional)_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format - +- operation _(required)_ - must always be `add_node` +- node*name *(required)\_ - the node name of the remote node +- subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: + - schema - the schema to replicate from + - table - the table to replicate from + - subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish - a boolean which determines if transactions on the local table should be replicated on the remote table + - start*time *(optional)\_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format + ### Body ```json { - "operation": "add_node", - "node_name": "ec2-3-22-181-22", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": false, - "publish": true, - "start_time": "2022-09-02T20:06:35.993Z" - } - ] + "operation": "add_node", + "node_name": "ec2-3-22-181-22", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": false, + "publish": true, + "start_time": "2022-09-02T20:06:35.993Z" + } + ] } ``` @@ -185,7 +193,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully added 'ec2-3-22-181-22' to manifest" + "message": "Successfully added 'ec2-3-22-181-22' to manifest" } ``` @@ -197,28 +205,28 @@ Modifies an existing HarperDB instance registration and associated subscriptions _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `update_node` -* node_name _(required)_ - the node name of the remote node you are updating -* subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: - * schema - the schema to replicate from - * table - the table to replicate from - * subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish - a boolean which determines if transactions on the local table should be replicated on the remote table +- operation _(required)_ - must always be `update_node` +- node*name *(required)\_ - the node name of the remote node you are updating +- subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: + - schema - the schema to replicate from + - table - the table to replicate from + - subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish - a boolean which determines if transactions on the local table should be replicated on the remote table ### Body ```json { - "operation": "update_node", - "node_name": "ec2-18-223-239-195", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": false - } - ] + "operation": "update_node", + "node_name": "ec2-18-223-239-195", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": false + } + ] } ``` @@ -226,7 +234,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully updated 'ec2-3-22-181-22'" + "message": "Successfully updated 'ec2-3-22-181-22'" } ``` @@ -238,13 +246,13 @@ Returns an array of status objects from a cluster. A status object will contain _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_status` +- operation _(required)_ - must always be `cluster_status` ### Body ```json { - "operation": "cluster_status" + "operation": "cluster_status" } ``` @@ -252,28 +260,28 @@ _Operation is restricted to super_user roles only_ ```json { - "node_name": "ec2-18-221-143-69", - "is_enabled": true, - "connections": [ - { - "node_name": "ec2-3-22-181-22", - "status": "open", - "ports": { - "clustering": 12345, - "operations_api": 9925 - }, - "latency_ms": 13, - "uptime": "30d 1h 18m 8s", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ] - } - ] + "node_name": "ec2-18-221-143-69", + "is_enabled": true, + "connections": [ + { + "node_name": "ec2-3-22-181-22", + "status": "open", + "ports": { + "clustering": 12345, + "operations_api": 9925 + }, + "latency_ms": 13, + "uptime": "30d 1h 18m 8s", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ] + } + ] } ``` @@ -285,16 +293,16 @@ Returns an object array of enmeshed nodes. Each node object will contain the nam _Operation is restricted to super_user roles only_ -* operation _(required)_- must always be `cluster_network` -* timeout (_optional_) - the amount of time in milliseconds to wait for a response from the network. Must be a number -* connected_nodes (_optional_) - omit `connected_nodes` from the response. Must be a boolean. Defaults to `false` -* routes (_optional_) - omit `routes` from the response. Must be a boolean. Defaults to `false` +- operation _(required)_- must always be `cluster_network` +- timeout (_optional_) - the amount of time in milliseconds to wait for a response from the network. Must be a number +- connected*nodes (\_optional*) - omit `connected_nodes` from the response. Must be a boolean. Defaults to `false` +- routes (_optional_) - omit `routes` from the response. Must be a boolean. Defaults to `false` ### Body ```json { - "operation": "cluster_network" + "operation": "cluster_network" } ``` @@ -302,25 +310,25 @@ _Operation is restricted to super_user roles only_ ```json { - "nodes": [ - { - "name": "local_node", - "response_time": 4, - "connected_nodes": ["ec2-3-142-255-78"], - "routes": [ - { - "host": "3.142.255.78", - "port": 9932 - } - ] - }, - { - "name": "ec2-3-142-255-78", - "response_time": 57, - "connected_nodes": ["ec2-3-12-153-124", "ec2-3-139-236-138", "local_node"], - "routes": [] - } - ] + "nodes": [ + { + "name": "local_node", + "response_time": 4, + "connected_nodes": ["ec2-3-142-255-78"], + "routes": [ + { + "host": "3.142.255.78", + "port": 9932 + } + ] + }, + { + "name": "ec2-3-142-255-78", + "response_time": 57, + "connected_nodes": ["ec2-3-12-153-124", "ec2-3-139-236-138", "local_node"], + "routes": [] + } + ] } ``` @@ -332,15 +340,15 @@ Removes a HarperDB instance and associated subscriptions from the cluster. Learn _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `remove_node` -* name _(required)_ - The name of the node you are de-registering +- operation _(required)_ - must always be `remove_node` +- name _(required)_ - The name of the node you are de-registering ### Body ```json { - "operation": "remove_node", - "node_name": "ec2-3-22-181-22" + "operation": "remove_node", + "node_name": "ec2-3-22-181-22" } ``` @@ -348,7 +356,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully removed 'ec2-3-22-181-22' from manifest" + "message": "Successfully removed 'ec2-3-22-181-22' from manifest" } ``` @@ -361,43 +369,45 @@ Learn more about HarperDB clustering here: [https://harperdb.io/docs/clustering/ _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `configure_cluster` -* connections _(required)_ - must be an object array with each object containing `node_name` and `subscriptions` for that node +- operation _(required)_ - must always be `configure_cluster` +- connections _(required)_ - must be an object array with each object containing `node_name` and `subscriptions` for that node ### Body + ```json { - "operation": "configure_cluster", - "connections": [ - { - "node_name": "ec2-3-137-184-8", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": false - } - ] - }, - { - "node_name": "ec2-18-223-239-195", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": true - } - ] - } - ] + "operation": "configure_cluster", + "connections": [ + { + "node_name": "ec2-3-137-184-8", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": false + } + ] + }, + { + "node_name": "ec2-18-223-239-195", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": true + } + ] + } + ] } ``` ### Response: 200 + ```json { - "message": "Cluster successfully configured." + "message": "Cluster successfully configured." } ``` diff --git a/site/versioned_docs/version-4.2/developers/operations-api/components.md b/site/versioned_docs/version-4.2/developers/operations-api/components.md index 3b5fcd1e..e8c9a236 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/components.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/components.md @@ -10,24 +10,28 @@ Creates a new component project in the component root directory using a predefin _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_component` -* project _(required)_ - the name of the project you wish to create +- operation _(required)_ - must always be `add_component` +- project _(required)_ - the name of the project you wish to create ### Body + ```json { - "operation": "add_component", - "project": "my-component" + "operation": "add_component", + "project": "my-component" } ``` ### Response: 200 + ```json { - "message": "Successfully added project: my-component" + "message": "Successfully added project: my-component" } ``` + --- + ## Deploy Component Will deploy a component using either a base64-encoded string representation of a `.tar` file (the output from `package_component`) or a package value, which can be any valid NPM reference, such as a GitHub repo, an NPM package, a tarball, a local directory or a website.\ @@ -35,52 +39,61 @@ Will deploy a component using either a base64-encoded string representation of a If deploying with the `payload` option, HarperDB will decrypt the base64-encoded string, reconstitute the .tar file of your project folder, and extract it to the component root project directory.\ If deploying with the `package` option, the package value will be written to `harperdb-config.yaml`. Then npm install will be utilized to install the component in the `node_modules` directory located in the hdb root. The value is a package reference, which should generally be a [URL reference, as described here](https://docs.npmjs.com/cli/v10/configuring-npm/package-json#urls-as-dependencies) (it is also possible to include NPM registerd packages and file paths). URL package references can directly reference tarballs that can be installed as a package. However, the most common and recommended usage is to install from a Git repository, which can be combined with a tag to deploy a specific version directly from versioned source control. When using tags, we highly recommend that you use the `semver` directive to ensure consistent and reliable installation by NPM. In addition to tags, you can also reference branches or commit numbers. Here is an example URL package reference to a (public) Git repository that doesn't require authentication: + ``` https://github.com/HarperDB/application-template#semver:v1.0.0 ``` + or this can be shortened to: + ``` HarperDB/application-template#semver:v1.0.0 ``` You can also install from private repository if you have an installed SSH keys on the server: + ``` git+ssh:/git@github.com:my-org/my-app.git#semver:v1.0.0 ``` + Or you can use a Github token: + ``` https://@github.com/my-org/my-app#semver:v1.0.0 ``` + Or you can use a GitLab Project Access Token: + ``` https://my-project:@gitlab.com/my-group/my-project#semver:v1.0.0 ``` + Note that your component will be installed by NPM. If your component has dependencies, NPM will attempt to download and install these as well. NPM normally uses the public registry.npmjs.org registry. If you are installing without network access to this, you may wish to define [custom registry locations](https://docs.npmjs.com/cli/v8/configuring-npm/npmrc) if you have any dependencies that need to be installed. NPM will install the deployed component and any dependencies in node_modules in the hdb root directory (typically `~/hdb/node_modules`). _Note: After deploying a component a restart may be required_ _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `deploy_component` -* project _(required)_ - the name of the project you wish to deploy -* package _(optional)_ - this can be any valid GitHub or NPM reference -* payload _(optional)_ - a base64-encoded string representation of the .tar file. Must be a string +- operation _(required)_ - must always be `deploy_component` +- project _(required)_ - the name of the project you wish to deploy +- package _(optional)_ - this can be any valid GitHub or NPM reference +- payload _(optional)_ - a base64-encoded string representation of the .tar file. Must be a string ### Body ```json { - "operation": "deploy_component", - "project": "my-component", - "payload": "A very large base64-encoded string representation of the .tar file" + "operation": "deploy_component", + "project": "my-component", + "payload": "A very large base64-encoded string representation of the .tar file" } ``` ```json { - "operation": "deploy_component", - "project": "my-component", - "package": "HarperDB/application-template" + "operation": "deploy_component", + "project": "my-component", + "package": "HarperDB/application-template" } ``` @@ -88,27 +101,29 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully deployed: my-component" + "message": "Successfully deployed: my-component" } ``` + --- + ## Package Component Creates a temporary `.tar` file of the specified project folder, then reads it into a base64-encoded string and returns an object with the string and the payload. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `package_component` -* project _(required)_ - the name of the project you wish to package -* skip_node_modules _(optional)_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean +- operation _(required)_ - must always be `package_component` +- project _(required)_ - the name of the project you wish to package +- skip*node_modules *(optional)\_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean ### Body ```json { - "operation": "package_component", - "project": "my-component", - "skip_node_modules": true + "operation": "package_component", + "project": "my-component", + "skip_node_modules": true } ``` @@ -116,11 +131,13 @@ _Operation is restricted to super_user roles only_ ```json { - "project": "my-component", - "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + "project": "my-component", + "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" } ``` + --- + ## Drop Component Deletes a file from inside the component project or deletes the complete project. @@ -129,17 +146,17 @@ Deletes a file from inside the component project or deletes the complete project _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_component` -* project _(required)_ - the name of the project you wish to delete or to delete from if using the `file` parameter -* file _(optional)_ - the path relative to your project folder of the file you wish to delete +- operation _(required)_ - must always be `drop_component` +- project _(required)_ - the name of the project you wish to delete or to delete from if using the `file` parameter +- file _(optional)_ - the path relative to your project folder of the file you wish to delete ### Body ```json { - "operation": "drop_component", - "project": "my-component", - "file": "utils/myUtils.js" + "operation": "drop_component", + "project": "my-component", + "file": "utils/myUtils.js" } ``` @@ -147,23 +164,25 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully dropped: my-component/utils/myUtils.js" + "message": "Successfully dropped: my-component/utils/myUtils.js" } ``` + --- + ## Get Components Gets all local component files and folders and any component config from `harperdb-config.yaml` _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_components` +- operation _(required)_ - must always be `get_components` ### Body ```json { - "operation": "get_components" + "operation": "get_components" } ``` @@ -171,83 +190,85 @@ _Operation is restricted to super_user roles only_ ```json { - "name": "components", - "entries": [ - { - "package": "HarperDB/application-template", - "name": "deploy-test-gh" - }, - { - "package": "@fastify/compress", - "name": "fast-compress" - }, - { - "name": "my-component", - "entries": [ - { - "name": "LICENSE", - "mtime": "2023-08-22T16:00:40.286Z", - "size": 1070 - }, - { - "name": "index.md", - "mtime": "2023-08-22T16:00:40.287Z", - "size": 1207 - }, - { - "name": "config.yaml", - "mtime": "2023-08-22T16:00:40.287Z", - "size": 1069 - }, - { - "name": "package.json", - "mtime": "2023-08-22T16:00:40.288Z", - "size": 145 - }, - { - "name": "resources.js", - "mtime": "2023-08-22T16:00:40.289Z", - "size": 583 - }, - { - "name": "schema.graphql", - "mtime": "2023-08-22T16:00:40.289Z", - "size": 466 - }, - { - "name": "utils", - "entries": [ - { - "name": "commonUtils.js", - "mtime": "2023-08-22T16:00:40.289Z", - "size": 583 - } - ] - } - ] - } - ] + "name": "components", + "entries": [ + { + "package": "HarperDB/application-template", + "name": "deploy-test-gh" + }, + { + "package": "@fastify/compress", + "name": "fast-compress" + }, + { + "name": "my-component", + "entries": [ + { + "name": "LICENSE", + "mtime": "2023-08-22T16:00:40.286Z", + "size": 1070 + }, + { + "name": "index.md", + "mtime": "2023-08-22T16:00:40.287Z", + "size": 1207 + }, + { + "name": "config.yaml", + "mtime": "2023-08-22T16:00:40.287Z", + "size": 1069 + }, + { + "name": "package.json", + "mtime": "2023-08-22T16:00:40.288Z", + "size": 145 + }, + { + "name": "resources.js", + "mtime": "2023-08-22T16:00:40.289Z", + "size": 583 + }, + { + "name": "schema.graphql", + "mtime": "2023-08-22T16:00:40.289Z", + "size": 466 + }, + { + "name": "utils", + "entries": [ + { + "name": "commonUtils.js", + "mtime": "2023-08-22T16:00:40.289Z", + "size": 583 + } + ] + } + ] + } + ] } ``` + --- + ## Get Component File Gets the contents of a file inside a component project. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_component_file` -* project _(required)_ - the name of the project where the file is located -* file _(required)_ - the path relative to your project folder of the file you wish to view -* encoding _(optional)_ - the encoding that will be passed to the read file call. Defaults to `utf8` +- operation _(required)_ - must always be `get_component_file` +- project _(required)_ - the name of the project where the file is located +- file _(required)_ - the path relative to your project folder of the file you wish to view +- encoding _(optional)_ - the encoding that will be passed to the read file call. Defaults to `utf8` ### Body ```json { - "operation": "get_component_file", - "project": "my-component", - "file": "resources.js" + "operation": "get_component_file", + "project": "my-component", + "file": "resources.js" } ``` @@ -255,30 +276,32 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "/**export class MyCustomResource extends tables.TableName {\n\t/ we can define our own custom POST handler\n\tpost(content) {\n\t\t/ do something with the incoming content;\n\t\treturn super.post(content);\n\t}\n\t/ or custom GET handler\n\tget() {\n\t\t/ we can modify this resource before returning\n\t\treturn super.get();\n\t}\n}\n */\n/ we can also define a custom resource without a specific table\nexport class Greeting extends Resource {\n\t/ a \"Hello, world!\" handler\n\tget() {\n\t\treturn { greeting: 'Hello, world!' };\n\t}\n}" + "message": "/**export class MyCustomResource extends tables.TableName {\n\t/ we can define our own custom POST handler\n\tpost(content) {\n\t\t/ do something with the incoming content;\n\t\treturn super.post(content);\n\t}\n\t/ or custom GET handler\n\tget() {\n\t\t/ we can modify this resource before returning\n\t\treturn super.get();\n\t}\n}\n */\n/ we can also define a custom resource without a specific table\nexport class Greeting extends Resource {\n\t/ a \"Hello, world!\" handler\n\tget() {\n\t\treturn { greeting: 'Hello, world!' };\n\t}\n}" } ``` + --- + ## Set Component File Creates or updates a file inside a component project. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_component_file` -* project _(required)_ - the name of the project the file is located in -* file _(required)_ - the path relative to your project folder of the file you wish to set -* payload _(required)_ - what will be written to the file -* encoding _(optional)_ - the encoding that will be passed to the write file call. Defaults to `utf8` +- operation _(required)_ - must always be `set_component_file` +- project _(required)_ - the name of the project the file is located in +- file _(required)_ - the path relative to your project folder of the file you wish to set +- payload _(required)_ - what will be written to the file +- encoding _(optional)_ - the encoding that will be passed to the write file call. Defaults to `utf8` ### Body ```json { - "operation": "set_component_file", - "project": "my-component", - "file": "test.js", - "payload": "console.log('hello world')" + "operation": "set_component_file", + "project": "my-component", + "file": "test.js", + "payload": "console.log('hello world')" } ``` @@ -286,6 +309,6 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully set component: test.js" + "message": "Successfully set component: test.js" } ``` diff --git a/site/versioned_docs/version-4.2/developers/operations-api/custom-functions.md b/site/versioned_docs/version-4.2/developers/operations-api/custom-functions.md index e6e8ef11..86f76157 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/custom-functions.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/custom-functions.md @@ -10,21 +10,23 @@ Returns the state of the Custom functions server. This includes whether it is en _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `custom_function_status` +- operation _(required)_ - must always be `custom_function_status` ### Body + ```json { - "operation": "custom_functions_status" + "operation": "custom_functions_status" } ``` ### Response: 200 + ```json { - "is_enabled": true, - "port": 9926, - "directory": "/Users/myuser/hdb/custom_functions" + "is_enabled": true, + "port": 9926, + "directory": "/Users/myuser/hdb/custom_functions" } ``` @@ -36,13 +38,13 @@ Returns an array of projects within the Custom Functions root project directory. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_custom_functions` +- operation _(required)_ - must always be `get_custom_functions` ### Body ```json { - "operation": "get_custom_functions" + "operation": "get_custom_functions" } ``` @@ -50,11 +52,11 @@ _Operation is restricted to super_user roles only_ ```json { - "dogs": { - "routes": ["examples"], - "helpers":["example"], - "static":3 - } + "dogs": { + "routes": ["examples"], + "helpers": ["example"], + "static": 3 + } } ``` @@ -66,19 +68,19 @@ Returns the content of the specified file as text. HarperDB Studio uses this cal _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_custom_function` -* project _(required)_ - the name of the project containing the file for which you wish to get content -* type _(required)_ - the name of the sub-folder containing the file for which you wish to get content - must be either routes or helpers -* file _(required)_ - The name of the file for which you wish to get content - should not include the file extension (which is always .js) +- operation _(required)_ - must always be `get_custom_function` +- project _(required)_ - the name of the project containing the file for which you wish to get content +- type _(required)_ - the name of the sub-folder containing the file for which you wish to get content - must be either routes or helpers +- file _(required)_ - The name of the file for which you wish to get content - should not include the file extension (which is always .js) ### Body ```json { - "operation": "get_custom_function", - "project": "dogs", - "type": "helpers", - "file": "example" + "operation": "get_custom_function", + "project": "dogs", + "type": "helpers", + "file": "example" } ``` @@ -86,7 +88,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" + "message": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" } ``` @@ -98,21 +100,21 @@ Updates the content of the specified file. HarperDB Studio uses this call to sav _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_custom_function` -* project _(required)_ - the name of the project containing the file for which you wish to set content -* type _(required)_ - the name of the sub-folder containing the file for which you wish to set content - must be either routes or helpers -* file _(required)_ - the name of the file for which you wish to set content - should not include the file extension (which is always .js) -* function_content _(required)_ - the content you wish to save into the specified file +- operation _(required)_ - must always be `set_custom_function` +- project _(required)_ - the name of the project containing the file for which you wish to set content +- type _(required)_ - the name of the sub-folder containing the file for which you wish to set content - must be either routes or helpers +- file _(required)_ - the name of the file for which you wish to set content - should not include the file extension (which is always .js) +- function*content *(required)\_ - the content you wish to save into the specified file ### Body ```json { - "operation": "set_custom_function", - "project": "dogs", - "type": "helpers", - "file": "example", - "function_content": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" + "operation": "set_custom_function", + "project": "dogs", + "type": "helpers", + "file": "example", + "function_content": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" } ``` @@ -120,7 +122,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully updated custom function: example.js" + "message": "Successfully updated custom function: example.js" } ``` @@ -132,19 +134,19 @@ Deletes the specified file. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_custom_function` -* project _(required)_ - the name of the project containing the file you wish to delete -* type _(required)_ - the name of the sub-folder containing the file you wish to delete. Must be either routes or helpers -* file _(required)_ - the name of the file you wish to delete. Should not include the file extension (which is always .js) +- operation _(required)_ - must always be `drop_custom_function` +- project _(required)_ - the name of the project containing the file you wish to delete +- type _(required)_ - the name of the sub-folder containing the file you wish to delete. Must be either routes or helpers +- file _(required)_ - the name of the file you wish to delete. Should not include the file extension (which is always .js) ### Body ```json { - "operation": "drop_custom_function", - "project": "dogs", - "type": "helpers", - "file": "example" + "operation": "drop_custom_function", + "project": "dogs", + "type": "helpers", + "file": "example" } ``` @@ -152,7 +154,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message":"Successfully deleted custom function: example.js" + "message": "Successfully deleted custom function: example.js" } ``` @@ -164,15 +166,15 @@ Creates a new project folder in the Custom Functions root project directory. It _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_custom_function_project` -* project _(required)_ - the name of the project you wish to create +- operation _(required)_ - must always be `add_custom_function_project` +- project _(required)_ - the name of the project you wish to create ### Body ```json { - "operation": "add_custom_function_project", - "project": "dogs" + "operation": "add_custom_function_project", + "project": "dogs" } ``` @@ -180,7 +182,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message":"Successfully created custom function project: dogs" + "message": "Successfully created custom function project: dogs" } ``` @@ -192,15 +194,15 @@ Deletes the specified project folder and all of its contents. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_custom_function_project` -* project _(required)_ - the name of the project you wish to delete +- operation _(required)_ - must always be `drop_custom_function_project` +- project _(required)_ - the name of the project you wish to delete ### Body ```json { - "operation": "drop_custom_function_project", - "project": "dogs" + "operation": "drop_custom_function_project", + "project": "dogs" } ``` @@ -208,7 +210,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully deleted project: dogs" + "message": "Successfully deleted project: dogs" } ``` @@ -220,17 +222,17 @@ Creates a .tar file of the specified project folder, then reads it into a base64 _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `package_custom_function_project` -* project _(required)_ - the name of the project you wish to package up for deployment -* skip_node_modules _(optional)_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean. +- operation _(required)_ - must always be `package_custom_function_project` +- project _(required)_ - the name of the project you wish to package up for deployment +- skip*node_modules *(optional)\_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean. ### Body ```json { - "operation": "package_custom_function_project", - "project": "dogs", - "skip_node_modules": true + "operation": "package_custom_function_project", + "project": "dogs", + "skip_node_modules": true } ``` @@ -238,9 +240,9 @@ _Operation is restricted to super_user roles only_ ```json { - "project": "dogs", - "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", - "file": "/tmp/d27f1154-5d82-43f0-a5fb-a3018f366081.tar" + "project": "dogs", + "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "file": "/tmp/d27f1154-5d82-43f0-a5fb-a3018f366081.tar" } ``` @@ -252,18 +254,17 @@ Takes the output of package_custom_function_project, decrypts the base64-encoded _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `deploy_custom_function_project` -* project _(required)_ - the name of the project you wish to deploy. Must be a string -* payload _(required)_ - a base64-encoded string representation of the .tar file. Must be a string - +- operation _(required)_ - must always be `deploy_custom_function_project` +- project _(required)_ - the name of the project you wish to deploy. Must be a string +- payload _(required)_ - a base64-encoded string representation of the .tar file. Must be a string ### Body ```json { - "operation": "deploy_custom_function_project", - "project": "dogs", - "payload": "A very large base64-encoded string represenation of the .tar file" + "operation": "deploy_custom_function_project", + "project": "dogs", + "payload": "A very large base64-encoded string represenation of the .tar file" } ``` @@ -271,6 +272,6 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully deployed project: dogs" + "message": "Successfully deployed project: dogs" } ``` diff --git a/site/versioned_docs/version-4.2/developers/operations-api/databases-and-tables.md b/site/versioned_docs/version-4.2/developers/operations-api/databases-and-tables.md index 18f23171..5efb6861 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/databases-and-tables.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/databases-and-tables.md @@ -1,362 +1,386 @@ --- -title: Databases and Tables +title: Databases and Tables --- -# Databases and Tables +# Databases and Tables ## Describe All + Returns the definitions of all databases and tables within the database. Record counts about 5000 records are estimated, as determining the exact count can be expensive. When the record count is estimated, this is indicated by the inclusion of a confidence interval of `estimated_record_range`. If you need the exact count, you can include an `"exact_count": true` in the operation, but be aware that this requires a full table scan (may be expensive). -* operation _(required)_ - must always be `describe_all` +- operation _(required)_ - must always be `describe_all` ### Body + ```json { - "operation": "describe_all" + "operation": "describe_all" } ``` ### Response: 200 + ```json { - "dev": { - "dog": { - "schema": "dev", - "name": "dog", - "hash_attribute": "id", - "audit": true, - "schema_defined": false, - "attributes": [ - { - "attribute": "id", - "indexed": true, - "is_primary_key": true - }, - { - "attribute": "__createdtime__", - "indexed": true - }, - { - "attribute": "__updatedtime__", - "indexed": true - }, - { - "attribute": "type", - "indexed": true - } - ], - "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", - "record_count": 4000, - "estimated_record_range": [3976, 4033], - "last_updated_record": 1697658683698.4504 - } - } + "dev": { + "dog": { + "schema": "dev", + "name": "dog", + "hash_attribute": "id", + "audit": true, + "schema_defined": false, + "attributes": [ + { + "attribute": "id", + "indexed": true, + "is_primary_key": true + }, + { + "attribute": "__createdtime__", + "indexed": true + }, + { + "attribute": "__updatedtime__", + "indexed": true + }, + { + "attribute": "type", + "indexed": true + } + ], + "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", + "record_count": 4000, + "estimated_record_range": [3976, 4033], + "last_updated_record": 1697658683698.4504 + } + } } ``` --- ## Describe database + Returns the definitions of all tables within the specified database. -* operation _(required)_ - must always be `describe_database` -* database _(optional)_ - database where the table you wish to describe lives. The default is `data` +- operation _(required)_ - must always be `describe_database` +- database _(optional)_ - database where the table you wish to describe lives. The default is `data` ### Body + ```json { - "operation": "describe_database", - "database": "dev" + "operation": "describe_database", + "database": "dev" } ``` ### Response: 200 + ```json { - "dog": { - "schema": "dev", - "name": "dog", - "hash_attribute": "id", - "audit": true, - "schema_defined": false, - "attributes": [ - { - "attribute": "id", - "indexed": true, - "is_primary_key": true - }, - { - "attribute": "__createdtime__", - "indexed": true - }, - { - "attribute": "__updatedtime__", - "indexed": true - }, - { - "attribute": "type", - "indexed": true - } - ], - "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", - "record_count": 4000, - "estimated_record_range": [3976, 4033], - "last_updated_record": 1697658683698.4504 - } + "dog": { + "schema": "dev", + "name": "dog", + "hash_attribute": "id", + "audit": true, + "schema_defined": false, + "attributes": [ + { + "attribute": "id", + "indexed": true, + "is_primary_key": true + }, + { + "attribute": "__createdtime__", + "indexed": true + }, + { + "attribute": "__updatedtime__", + "indexed": true + }, + { + "attribute": "type", + "indexed": true + } + ], + "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", + "record_count": 4000, + "estimated_record_range": [3976, 4033], + "last_updated_record": 1697658683698.4504 + } } ``` --- ## Describe Table + Returns the definition of the specified table. -* operation _(required)_ - must always be `describe_table` -* table _(required)_ - table you wish to describe -* database _(optional)_ - database where the table you wish to describe lives. The default is `data` +- operation _(required)_ - must always be `describe_table` +- table _(required)_ - table you wish to describe +- database _(optional)_ - database where the table you wish to describe lives. The default is `data` ### Body + ```json { - "operation": "describe_table", - "table": "dog" + "operation": "describe_table", + "table": "dog" } ``` ### Response: 200 + ```json { - "schema": "dev", - "name": "dog", - "hash_attribute": "id", - "audit": true, - "schema_defined": false, - "attributes": [ - { - "attribute": "id", - "indexed": true, - "is_primary_key": true - }, - { - "attribute": "__createdtime__", - "indexed": true - }, - { - "attribute": "__updatedtime__", - "indexed": true - }, - { - "attribute": "type", - "indexed": true - } - ], - "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", - "record_count": 4000, - "estimated_record_range": [3976, 4033], - "last_updated_record": 1697658683698.4504 + "schema": "dev", + "name": "dog", + "hash_attribute": "id", + "audit": true, + "schema_defined": false, + "attributes": [ + { + "attribute": "id", + "indexed": true, + "is_primary_key": true + }, + { + "attribute": "__createdtime__", + "indexed": true + }, + { + "attribute": "__updatedtime__", + "indexed": true + }, + { + "attribute": "type", + "indexed": true + } + ], + "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", + "record_count": 4000, + "estimated_record_range": [3976, 4033], + "last_updated_record": 1697658683698.4504 } ``` --- ## Create database + Create a new database. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `create_database` -* database _(optional)_ - name of the database you are creating. The default is `data` +- operation _(required)_ - must always be `create_database` +- database _(optional)_ - name of the database you are creating. The default is `data` ### Body + ```json { - "operation": "create_database", - "database": "dev" + "operation": "create_database", + "database": "dev" } ``` ### Response: 200 + ```json { - "message": "database 'dev' successfully created" + "message": "database 'dev' successfully created" } ``` --- ## Drop database + Drop an existing database. NOTE: Dropping a database will delete all tables and all of their records in that database. _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `drop_database` -* database _(required)_ - name of the database you are dropping +- operation _(required)_ - this should always be `drop_database` +- database _(required)_ - name of the database you are dropping ### Body + ```json { - "operation": "drop_database", - "database": "dev" + "operation": "drop_database", + "database": "dev" } ``` ### Response: 200 + ```json { - "message": "successfully deleted 'dev'" + "message": "successfully deleted 'dev'" } ``` --- ## Create Table + Create a new table within a database. _Operation is restricted to super_user roles only_ - -* operation _(required)_ - must always be `create_table` -* database _(optional)_ - name of the database where you want your table to live. If the database does not exist, it will be created. If the `database` property is not provided it will default to `data`. -* table _(required)_ - name of the table you are creating -* primary_key _(required)_ - primary key for the table -* attributes _(optional)_ - an array of attributes that specifies the schema for the table, that is the set of attributes for the table. When attributes are supplied the table will not be considered a "dynamic schema" table, and attributes will not be auto-added when records with new properties are inserted. Each attribute is specified as: - * name _(required)_ - the name of the attribute - * indexed _(optional)_ - indicates if the attribute should be indexed - * type _(optional)_ - specifies the data type of the attribute (can be String, Int, Float, Date, ID, Any) -* expiration _(optional)_ - specifies the time-to-live or expiration of records in the table before they are evicted (records are not evicted on any timer if not specified). This is specified in seconds. +- operation _(required)_ - must always be `create_table` +- database _(optional)_ - name of the database where you want your table to live. If the database does not exist, it will be created. If the `database` property is not provided it will default to `data`. +- table _(required)_ - name of the table you are creating +- primary*key *(required)\_ - primary key for the table +- attributes _(optional)_ - an array of attributes that specifies the schema for the table, that is the set of attributes for the table. When attributes are supplied the table will not be considered a "dynamic schema" table, and attributes will not be auto-added when records with new properties are inserted. Each attribute is specified as: + - name _(required)_ - the name of the attribute + - indexed _(optional)_ - indicates if the attribute should be indexed + - type _(optional)_ - specifies the data type of the attribute (can be String, Int, Float, Date, ID, Any) +- expiration _(optional)_ - specifies the time-to-live or expiration of records in the table before they are evicted (records are not evicted on any timer if not specified). This is specified in seconds. ### Body + ```json { - "operation": "create_table", - "database": "dev", - "table": "dog", - "primary_key": "id" + "operation": "create_table", + "database": "dev", + "table": "dog", + "primary_key": "id" } ``` ### Response: 200 + ```json { - "message": "table 'dev.dog' successfully created." + "message": "table 'dev.dog' successfully created." } ``` --- ## Drop Table + Drop an existing database table. NOTE: Dropping a table will delete all associated records in that table. _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `drop_table` -* database _(optional)_ - database where the table you are dropping lives. The default is `data` -* table _(required)_ - name of the table you are dropping +- operation _(required)_ - this should always be `drop_table` +- database _(optional)_ - database where the table you are dropping lives. The default is `data` +- table _(required)_ - name of the table you are dropping ### Body ```json { - "operation": "drop_table", - "database": "dev", - "table": "dog" + "operation": "drop_table", + "database": "dev", + "table": "dog" } ``` ### Response: 200 + ```json { - "message": "successfully deleted table 'dev.dog'" + "message": "successfully deleted table 'dev.dog'" } ``` --- -## Create Attribute +## Create Attribute + Create a new attribute within the specified table. **The create_attribute operation can be used for admins wishing to pre-define schema values for setting role-based permissions or for any other reason.** _Note: HarperDB will automatically create new attributes on insert and update if they do not already exist within the schema._ -* operation _(required)_ - must always be `create_attribute` -* database _(optional)_ - name of the database of the table you want to add your attribute. The default is `data` -* table _(required)_ - name of the table where you want to add your attribute to live -* attribute _(required)_ - name for the attribute +- operation _(required)_ - must always be `create_attribute` +- database _(optional)_ - name of the database of the table you want to add your attribute. The default is `data` +- table _(required)_ - name of the table where you want to add your attribute to live +- attribute _(required)_ - name for the attribute ### Body + ```json { - "operation": "create_attribute", - "database": "dev", - "table": "dog", - "attribute": "is_adorable" + "operation": "create_attribute", + "database": "dev", + "table": "dog", + "attribute": "is_adorable" } ``` ### Response: 200 + ```json { - "message": "inserted 1 of 1 records", - "skipped_hashes": [], - "inserted_hashes": [ - "383c0bef-5781-4e1c-b5c8-987459ad0831" - ] + "message": "inserted 1 of 1 records", + "skipped_hashes": [], + "inserted_hashes": ["383c0bef-5781-4e1c-b5c8-987459ad0831"] } ``` --- ## Drop Attribute + Drop an existing attribute from the specified table. NOTE: Dropping an attribute will delete all associated attribute values in that table. _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `drop_attribute` -* database _(optional)_ - database where the table you are dropping lives. The default is `data` -* table _(required)_ - table where the attribute you are dropping lives -* attribute _(required)_ - attribute that you intend to drop +- operation _(required)_ - this should always be `drop_attribute` +- database _(optional)_ - database where the table you are dropping lives. The default is `data` +- table _(required)_ - table where the attribute you are dropping lives +- attribute _(required)_ - attribute that you intend to drop ### Body ```json { - "operation": "drop_attribute", - "database": "dev", - "table": "dog", - "attribute": "is_adorable" + "operation": "drop_attribute", + "database": "dev", + "table": "dog", + "attribute": "is_adorable" } ``` ### Response: 200 + ```json { - "message": "successfully deleted attribute 'is_adorable'" + "message": "successfully deleted attribute 'is_adorable'" } ``` --- ## Get Backup + This will return a snapshot of the requested database. This provides a means for backing up the database through the operations API. The response will be the raw database file (in binary format), which can later be restored as a database file by copying into the appropriate hdb/databases directory (with HarperDB not running). The returned file is a snapshot of the database at the moment in time that the get_backup operation begins. This also supports backing up individual tables in a database. However, this is a more expensive operation than backing up a database in whole, and will lose any transactional atomicity between writes across tables, so generally it is recommended that you backup the entire database. It is important to note that trying to copy a database file that is in use (HarperDB actively running and writing to the file) using standard file copying tools is not safe (the copied file will likely be corrupt), which is why using this snapshot operation is recommended for backups (volume snapshots are also a good way to backup HarperDB databases). _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `get_backup` -* database _(required)_ - this is the database that will be snapshotted and returned -* table _(optional)_ - this will specify a specific table to backup -* tables _(optional)_ - this will specify a specific set of tables to backup +- operation _(required)_ - this should always be `get_backup` +- database _(required)_ - this is the database that will be snapshotted and returned +- table _(optional)_ - this will specify a specific table to backup +- tables _(optional)_ - this will specify a specific set of tables to backup ### Body ```json { - "operation": "get_backup", - "database": "dev" + "operation": "get_backup", + "database": "dev" } ``` ### Response: 200 + ``` The database in raw binary data format ``` diff --git a/site/versioned_docs/version-4.2/developers/operations-api/index.md b/site/versioned_docs/version-4.2/developers/operations-api/index.md index e0f26443..44350290 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/index.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/index.md @@ -19,20 +19,20 @@ Content-Type: application/json The operations API reference is available below and categorized by topic: -* [Quick Start Examples](./quickstart-examples) -* [Databases and Tables](./databases-and-tables) -* [NoSQL Operations](./nosql-operations) -* [Bulk Operations](./bulk-operations) -* [Users and Roles](./users-and-roles) -* [Clustering](./clustering) -* [Components](./components) -* [Registration](./registration) -* [Jobs](./jobs) -* [Logs](./logs) -* [Utilities](./utilities) -* [Token Authentication](./token-authentication) -* [SQL Operations](./sql-operations) -* [Advanced JSON SQL Examples](./advanced-json-sql-examples) +- [Quick Start Examples](./quickstart-examples) +- [Databases and Tables](./databases-and-tables) +- [NoSQL Operations](./nosql-operations) +- [Bulk Operations](./bulk-operations) +- [Users and Roles](./users-and-roles) +- [Clustering](./clustering) +- [Components](./components) +- [Registration](./registration) +- [Jobs](./jobs) +- [Logs](./logs) +- [Utilities](./utilities) +- [Token Authentication](./token-authentication) +- [SQL Operations](./sql-operations) +- [Advanced JSON SQL Examples](./advanced-json-sql-examples) • [Past Release API Documentation](https://olddocs.harperdb.io) diff --git a/site/versioned_docs/version-4.2/developers/operations-api/jobs.md b/site/versioned_docs/version-4.2/developers/operations-api/jobs.md index 8b05357f..173125a1 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/jobs.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/jobs.md @@ -1,82 +1,87 @@ --- -title: Jobs +title: Jobs --- -# Jobs +# Jobs ## Get Job + Returns job status, metrics, and messages for the specified job ID. -* operation _(required)_ - must always be `get_job` -* id _(required)_ - the id of the job you wish to view +- operation _(required)_ - must always be `get_job` +- id _(required)_ - the id of the job you wish to view ### Body ```json { - "operation": "get_job", - "id": "4a982782-929a-4507-8794-26dae1132def" + "operation": "get_job", + "id": "4a982782-929a-4507-8794-26dae1132def" } ``` ### Response: 200 + ```json [ - { - "__createdtime__": 1611615798782, - "__updatedtime__": 1611615801207, - "created_datetime": 1611615798774, - "end_datetime": 1611615801206, - "id": "4a982782-929a-4507-8794-26dae1132def", - "job_body": null, - "message": "successfully loaded 350 of 350 records", - "start_datetime": 1611615798805, - "status": "COMPLETE", - "type": "csv_url_load", - "user": "HDB_ADMIN", - "start_datetime_converted": "2021-01-25T23:03:18.805Z", - "end_datetime_converted": "2021-01-25T23:03:21.206Z" - } + { + "__createdtime__": 1611615798782, + "__updatedtime__": 1611615801207, + "created_datetime": 1611615798774, + "end_datetime": 1611615801206, + "id": "4a982782-929a-4507-8794-26dae1132def", + "job_body": null, + "message": "successfully loaded 350 of 350 records", + "start_datetime": 1611615798805, + "status": "COMPLETE", + "type": "csv_url_load", + "user": "HDB_ADMIN", + "start_datetime_converted": "2021-01-25T23:03:18.805Z", + "end_datetime_converted": "2021-01-25T23:03:21.206Z" + } ] ``` --- ## Search Jobs By Start Date + Returns a list of job statuses, metrics, and messages for all jobs executed within the specified time window. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `search_jobs_by_start_date` -* from_date _(required)_ - the date you wish to start the search -* to_date _(required)_ - the date you wish to end the search +- operation _(required)_ - must always be `search_jobs_by_start_date` +- from*date *(required)\_ - the date you wish to start the search +- to*date *(required)\_ - the date you wish to end the search ### Body + ```json { - "operation": "search_jobs_by_start_date", - "from_date": "2021-01-25T22:05:27.464+0000", - "to_date": "2021-01-25T23:05:27.464+0000" + "operation": "search_jobs_by_start_date", + "from_date": "2021-01-25T22:05:27.464+0000", + "to_date": "2021-01-25T23:05:27.464+0000" } ``` ### Response: 200 + ```json [ - { - "id": "942dd5cb-2368-48a5-8a10-8770ff7eb1f1", - "user": "HDB_ADMIN", - "type": "csv_url_load", - "status": "COMPLETE", - "start_datetime": 1611613284781, - "end_datetime": 1611613287204, - "job_body": null, - "message": "successfully loaded 350 of 350 records", - "created_datetime": 1611613284764, - "__createdtime__": 1611613284767, - "__updatedtime__": 1611613287207, - "start_datetime_converted": "2021-01-25T22:21:24.781Z", - "end_datetime_converted": "2021-01-25T22:21:27.204Z" - } + { + "id": "942dd5cb-2368-48a5-8a10-8770ff7eb1f1", + "user": "HDB_ADMIN", + "type": "csv_url_load", + "status": "COMPLETE", + "start_datetime": 1611613284781, + "end_datetime": 1611613287204, + "job_body": null, + "message": "successfully loaded 350 of 350 records", + "created_datetime": 1611613284764, + "__createdtime__": 1611613284767, + "__updatedtime__": 1611613287207, + "start_datetime_converted": "2021-01-25T22:21:24.781Z", + "end_datetime_converted": "2021-01-25T22:21:27.204Z" + } ] -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.2/developers/operations-api/logs.md b/site/versioned_docs/version-4.2/developers/operations-api/logs.md index 00a1fde8..761a164d 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/logs.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/logs.md @@ -1,33 +1,34 @@ --- -title: Logs +title: Logs --- -# Logs +# Logs ## Read HarperDB Log + Returns log outputs from the primary HarperDB log based on the provided search criteria. Read more about HarperDB logging here: [https://docs.harperdb.io/docs/logging#read-logs-via-the-api](https://docs.harperdb.io/docs/logging#read-logs-via-the-api). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_Log` -* start _(optional)_ - result to start with. Must be a number -* limit _(optional)_ - number of results returned. Default behavior is 100. Must be a number -* level _(optional)_ - error level to filter on. Default behavior is all levels. Must be `error`, `info`, or `null` -* from _(optional)_ - date to begin showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss` -* until _(optional)_ - date to end showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss` -* order _(optional)_ - order to display logs desc or asc by timestamp +- operation _(required)_ - must always be `read_Log` +- start _(optional)_ - result to start with. Must be a number +- limit _(optional)_ - number of results returned. Default behavior is 100. Must be a number +- level _(optional)_ - error level to filter on. Default behavior is all levels. Must be `error`, `info`, or `null` +- from _(optional)_ - date to begin showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss` +- until _(optional)_ - date to end showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss` +- order _(optional)_ - order to display logs desc or asc by timestamp ### Body ```json { - "operation": "read_log", - "start": 0, - "limit": 1000, - "level": "error", - "from": "2021-01-25T22:05:27.464+0000", - "until": "2021-01-25T23:05:27.464+0000", - "order": "desc" + "operation": "read_log", + "start": 0, + "limit": 1000, + "level": "error", + "from": "2021-01-25T22:05:27.464+0000", + "until": "2021-01-25T23:05:27.464+0000", + "order": "desc" } ``` @@ -35,29 +36,28 @@ _Operation is restricted to super_user roles only_ ```json [ - { - "level": "notify", - "message": "Connected to cluster server.", - "timestamp": "2021-01-25T23:03:20.710Z", - "thread": "main/0", - "tags": [] - }, - { - "level": "warn", - "message": "Login failed", - "timestamp": "2021-01-25T22:24:45.113Z", - "thread": "http/9", - "tags": [] - }, - { - "level": "error", - "message": "unknown attribute 'name and breed'", - "timestamp": "2021-01-25T22:23:24.167Z", - "thread": "http/9", - "tags": [] - } + { + "level": "notify", + "message": "Connected to cluster server.", + "timestamp": "2021-01-25T23:03:20.710Z", + "thread": "main/0", + "tags": [] + }, + { + "level": "warn", + "message": "Login failed", + "timestamp": "2021-01-25T22:24:45.113Z", + "thread": "http/9", + "tags": [] + }, + { + "level": "error", + "message": "unknown attribute 'name and breed'", + "timestamp": "2021-01-25T22:23:24.167Z", + "thread": "http/9", + "tags": [] + } ] - ``` --- @@ -68,23 +68,23 @@ Returns all transactions logged for the specified database table. You may filter _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_transaction_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* from _(optional)_ - time format must be millisecond-based epoch in UTC -* to _(optional)_ - time format must be millisecond-based epoch in UTC -* limit _(optional)_ - max number of logs you want to receive. Must be a number +- operation _(required)_ - must always be `read_transaction_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- from _(optional)_ - time format must be millisecond-based epoch in UTC +- to _(optional)_ - time format must be millisecond-based epoch in UTC +- limit _(optional)_ - max number of logs you want to receive. Must be a number ### Body ```json { - "operation": "read_transaction_log", - "schema": "dev", - "table": "dog", - "from": 1560249020865, - "to": 1660585656639, - "limit": 10 + "operation": "read_transaction_log", + "schema": "dev", + "table": "dog", + "from": 1560249020865, + "to": 1660585656639, + "limit": 10 } ``` @@ -92,174 +92,174 @@ _Operation is restricted to super_user roles only_ ```json [ - { - "operation": "insert", - "user": "admin", - "timestamp": 1660165619736, - "records": [ - { - "id": 1, - "dog_name": "Penny", - "owner_name": "Kyle", - "breed_id": 154, - "age": 7, - "weight_lbs": 38, - "__updatedtime__": 1660165619688, - "__createdtime__": 1660165619688 - } - ] - }, - { - "operation": "insert", - "user": "admin", - "timestamp": 1660165619813, - "records": [ - { - "id": 2, - "dog_name": "Harper", - "owner_name": "Stephen", - "breed_id": 346, - "age": 7, - "weight_lbs": 55, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 3, - "dog_name": "Alby", - "owner_name": "Kaylan", - "breed_id": 348, - "age": 7, - "weight_lbs": 84, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 4, - "dog_name": "Billy", - "owner_name": "Zach", - "breed_id": 347, - "age": 6, - "weight_lbs": 60, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 5, - "dog_name": "Rose Merry", - "owner_name": "Zach", - "breed_id": 348, - "age": 8, - "weight_lbs": 15, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 6, - "dog_name": "Kato", - "owner_name": "Kyle", - "breed_id": 351, - "age": 6, - "weight_lbs": 32, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 7, - "dog_name": "Simon", - "owner_name": "Fred", - "breed_id": 349, - "age": 3, - "weight_lbs": 35, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 8, - "dog_name": "Gemma", - "owner_name": "Stephen", - "breed_id": 350, - "age": 5, - "weight_lbs": 55, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 9, - "dog_name": "Yeti", - "owner_name": "Jaxon", - "breed_id": 200, - "age": 5, - "weight_lbs": 55, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 10, - "dog_name": "Monkey", - "owner_name": "Aron", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 11, - "dog_name": "Bode", - "owner_name": "Margo", - "breed_id": 104, - "age": 8, - "weight_lbs": 75, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 12, - "dog_name": "Tucker", - "owner_name": "David", - "breed_id": 346, - "age": 2, - "weight_lbs": 60, - "adorable": true, - "__updatedtime__": 1660165619798, - "__createdtime__": 1660165619798 - }, - { - "id": 13, - "dog_name": "Jagger", - "owner_name": "Margo", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true, - "__updatedtime__": 1660165619798, - "__createdtime__": 1660165619798 - } - ] - }, - { - "operation": "update", - "user": "admin", - "timestamp": 1660165620040, - "records": [ - { - "id": 1, - "dog_name": "Penny B", - "__updatedtime__": 1660165620036 - } - ] - } + { + "operation": "insert", + "user": "admin", + "timestamp": 1660165619736, + "records": [ + { + "id": 1, + "dog_name": "Penny", + "owner_name": "Kyle", + "breed_id": 154, + "age": 7, + "weight_lbs": 38, + "__updatedtime__": 1660165619688, + "__createdtime__": 1660165619688 + } + ] + }, + { + "operation": "insert", + "user": "admin", + "timestamp": 1660165619813, + "records": [ + { + "id": 2, + "dog_name": "Harper", + "owner_name": "Stephen", + "breed_id": 346, + "age": 7, + "weight_lbs": 55, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 3, + "dog_name": "Alby", + "owner_name": "Kaylan", + "breed_id": 348, + "age": 7, + "weight_lbs": 84, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 4, + "dog_name": "Billy", + "owner_name": "Zach", + "breed_id": 347, + "age": 6, + "weight_lbs": 60, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 5, + "dog_name": "Rose Merry", + "owner_name": "Zach", + "breed_id": 348, + "age": 8, + "weight_lbs": 15, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 6, + "dog_name": "Kato", + "owner_name": "Kyle", + "breed_id": 351, + "age": 6, + "weight_lbs": 32, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 7, + "dog_name": "Simon", + "owner_name": "Fred", + "breed_id": 349, + "age": 3, + "weight_lbs": 35, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 8, + "dog_name": "Gemma", + "owner_name": "Stephen", + "breed_id": 350, + "age": 5, + "weight_lbs": 55, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 9, + "dog_name": "Yeti", + "owner_name": "Jaxon", + "breed_id": 200, + "age": 5, + "weight_lbs": 55, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 10, + "dog_name": "Monkey", + "owner_name": "Aron", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 11, + "dog_name": "Bode", + "owner_name": "Margo", + "breed_id": 104, + "age": 8, + "weight_lbs": 75, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 12, + "dog_name": "Tucker", + "owner_name": "David", + "breed_id": 346, + "age": 2, + "weight_lbs": 60, + "adorable": true, + "__updatedtime__": 1660165619798, + "__createdtime__": 1660165619798 + }, + { + "id": 13, + "dog_name": "Jagger", + "owner_name": "Margo", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true, + "__updatedtime__": 1660165619798, + "__createdtime__": 1660165619798 + } + ] + }, + { + "operation": "update", + "user": "admin", + "timestamp": 1660165620040, + "records": [ + { + "id": 1, + "dog_name": "Penny B", + "__updatedtime__": 1660165620036 + } + ] + } ] ``` @@ -271,19 +271,19 @@ Deletes transaction log data for the specified database table that is older than _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_transaction_log_before` -* schema _(required)_ - schema under which the transaction log resides. Must be a string -* table _(required)_ - table under which the transaction log resides. Must be a string -* timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC +- operation _(required)_ - must always be `delete_transaction_log_before` +- schema _(required)_ - schema under which the transaction log resides. Must be a string +- table _(required)_ - table under which the transaction log resides. Must be a string +- timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC ### Body ```json { - "operation": "delete_transaction_logs_before", - "schema": "dev", - "table": "dog", - "timestamp": 1598290282817 + "operation": "delete_transaction_logs_before", + "schema": "dev", + "table": "dog", + "timestamp": 1598290282817 } ``` @@ -291,7 +291,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Starting job with id 26a6d3a6-6d77-40f9-bee7-8d6ef479a126" + "message": "Starting job with id 26a6d3a6-6d77-40f9-bee7-8d6ef479a126" } ``` @@ -303,19 +303,19 @@ AuditLog must be enabled in the HarperDB configuration file to make this request _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search_type _(optional)_ - possibilities are `hash_value`, `timestamp` and `username` -* search_values _(optional)_ - an array of string or numbers relating to search_type +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search*type *(optional)\_ - possibilities are `hash_value`, `timestamp` and `username` +- search*values *(optional)\_ - an array of string or numbers relating to search_type ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog" + "operation": "read_audit_log", + "schema": "dev", + "table": "dog" } ``` @@ -323,78 +323,70 @@ _Operation is restricted to super_user roles only_ ```json [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585716133.01, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660585740558.415, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "fur_type": "coarse", - "__updatedtime__": 1660585740556 - } - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "delete", - "user_name": "admin", - "timestamp": 1660585759710.56, - "hash_values": [ - 444 - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585740556, - "__createdtime__": 1660585716128, - "fur_type": "coarse" - } - ] - } + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "hash_values": [318], + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585716133.01, + "hash_values": [444], + "records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660585740558.415, + "hash_values": [444], + "records": [ + { + "id": 444, + "fur_type": "coarse", + "__updatedtime__": 1660585740556 + } + ], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "delete", + "user_name": "admin", + "timestamp": 1660585759710.56, + "hash_values": [444], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585740556, + "__createdtime__": 1660585716128, + "fur_type": "coarse" + } + ] + } ] ``` @@ -406,27 +398,24 @@ AuditLog must be enabled in the HarperDB configuration file to make this request _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search_type _(optional)_ - timestamp -* search_values _(optional)_ - an array containing a maximum of two values [`from_timestamp`, `to_timestamp`] defining the range of transactions you would like to view. - * Timestamp format is millisecond-based epoch in UTC - * If no items are supplied then all transactions are returned - * If only one entry is supplied then all transactions after the supplied timestamp will be returned +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search*type *(optional)\_ - timestamp +- search*values *(optional)\_ - an array containing a maximum of two values [`from_timestamp`, `to_timestamp`] defining the range of transactions you would like to view. + - Timestamp format is millisecond-based epoch in UTC + - If no items are supplied then all transactions are returned + - If only one entry is supplied then all transactions after the supplied timestamp will be returned ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "timestamp", - "search_values": [ - 1660585740558, - 1660585759710.56 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "timestamp", + "search_values": [1660585740558, 1660585759710.56] } ``` @@ -434,101 +423,91 @@ _Operation is restricted to super_user roles only_ ```json [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585716133.01, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660585740558.415, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "fur_type": "coarse", - "__updatedtime__": 1660585740556 - } - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "delete", - "user_name": "admin", - "timestamp": 1660585759710.56, - "hash_values": [ - 444 - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585740556, - "__createdtime__": 1660585716128, - "fur_type": "coarse" - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660586298457.224, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "fur_type": "super fluffy", - "__updatedtime__": 1660586298455 - } - ], - "original_records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - } + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "hash_values": [318], + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585716133.01, + "hash_values": [444], + "records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660585740558.415, + "hash_values": [444], + "records": [ + { + "id": 444, + "fur_type": "coarse", + "__updatedtime__": 1660585740556 + } + ], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "delete", + "user_name": "admin", + "timestamp": 1660585759710.56, + "hash_values": [444], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585740556, + "__createdtime__": 1660585716128, + "fur_type": "coarse" + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660586298457.224, + "hash_values": [318], + "records": [ + { + "id": 318, + "fur_type": "super fluffy", + "__updatedtime__": 1660586298455 + } + ], + "original_records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + } ] ``` @@ -540,23 +519,21 @@ AuditLog must be enabled in the HarperDB configuration file to make this request _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search_type _(optional)_ - username -* search_values _(optional)_ - the HarperDB user for whom you would like to view transactions +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search*type *(optional)\_ - username +- search*values *(optional)\_ - the HarperDB user for whom you would like to view transactions ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "username", - "search_values": [ - "admin" - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "username", + "search_values": ["admin"] } ``` @@ -564,103 +541,93 @@ _Operation is restricted to super_user roles only_ ```json { - "admin": [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585716133.01, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660585740558.415, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "fur_type": "coarse", - "__updatedtime__": 1660585740556 - } - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "delete", - "user_name": "admin", - "timestamp": 1660585759710.56, - "hash_values": [ - 444 - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585740556, - "__createdtime__": 1660585716128, - "fur_type": "coarse" - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660586298457.224, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "fur_type": "super fluffy", - "__updatedtime__": 1660586298455 - } - ], - "original_records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - } - ] + "admin": [ + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "hash_values": [318], + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585716133.01, + "hash_values": [444], + "records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660585740558.415, + "hash_values": [444], + "records": [ + { + "id": 444, + "fur_type": "coarse", + "__updatedtime__": 1660585740556 + } + ], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "delete", + "user_name": "admin", + "timestamp": 1660585759710.56, + "hash_values": [444], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585740556, + "__createdtime__": 1660585716128, + "fur_type": "coarse" + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660586298457.224, + "hash_values": [318], + "records": [ + { + "id": 318, + "fur_type": "super fluffy", + "__updatedtime__": 1660586298455 + } + ], + "original_records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + } + ] } ``` @@ -672,92 +639,94 @@ AuditLog must be enabled in the HarperDB configuration file to make this request _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search_type _(optional)_ - hash_value -* search_values _(optional)_ - an array of hash_attributes for which you wish to see transaction logs +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search*type *(optional)\_ - hash_value +- search*values *(optional)\_ - an array of hash_attributes for which you wish to see transaction logs ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "hash_value", - "search_values": [ - 318 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "hash_value", + "search_values": [318] } ``` ### Response: 200 + ```json { - "318": [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660586298457.224, - "records": [ - { - "id": 318, - "fur_type": "super fluffy", - "__updatedtime__": 1660586298455 - } - ], - "original_records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - } - ] + "318": [ + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660586298457.224, + "records": [ + { + "id": 318, + "fur_type": "super fluffy", + "__updatedtime__": 1660586298455 + } + ], + "original_records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + } + ] } ``` --- ## Delete Audit Logs Before + AuditLog must be enabled in the HarperDB configuration file to make this request. Deletes audit log data for the specified database table that is older than the specified timestamp. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_audit_logs_before` -* schema _(required)_ - schema under which the transaction log resides. Must be a string -* table _(required)_ - table under which the transaction log resides. Must be a string -* timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC +- operation _(required)_ - must always be `delete_audit_logs_before` +- schema _(required)_ - schema under which the transaction log resides. Must be a string +- table _(required)_ - table under which the transaction log resides. Must be a string +- timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC ### Body + ```json { - "operation": "delete_audit_logs_before", - "schema": "dev", - "table": "dog", - "timestamp": 1660585759710.56 + "operation": "delete_audit_logs_before", + "schema": "dev", + "table": "dog", + "timestamp": 1660585759710.56 } ``` ### Response: 200 + ```json { - "message": "Starting job with id 7479e5f8-a86e-4fc9-add7-749493bc100f" + "message": "Starting job with id 7479e5f8-a86e-4fc9-add7-749493bc100f" } ``` diff --git a/site/versioned_docs/version-4.2/developers/operations-api/nosql-operations.md b/site/versioned_docs/version-4.2/developers/operations-api/nosql-operations.md index d27e0c95..06c652de 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/nosql-operations.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/nosql-operations.md @@ -8,32 +8,32 @@ title: NoSQL Operations Adds one or more rows of data to a database table. Primary keys of the inserted JSON record may be supplied on insert. If a primary key is not provided, then a GUID will be generated for each record. -* operation _(required)_ - must always be `insert` -* database _(optional)_ - database where the table you are inserting records into lives. The default is `data` -* table _(required)_ - table where you want to insert records -* records _(required)_ - array of one or more records for insert +- operation _(required)_ - must always be `insert` +- database _(optional)_ - database where the table you are inserting records into lives. The default is `data` +- table _(required)_ - table where you want to insert records +- records _(required)_ - array of one or more records for insert ### Body ```json { - "operation": "insert", - "database": "dev", - "table": "dog", - "records": [ - { - "id": 8, - "dog_name": "Harper", - "breed_id": 346, - "age": 7 - }, - { - "id": 9, - "dog_name": "Penny", - "breed_id": 154, - "age": 7 - } - ] + "operation": "insert", + "database": "dev", + "table": "dog", + "records": [ + { + "id": 8, + "dog_name": "Harper", + "breed_id": 346, + "age": 7 + }, + { + "id": 9, + "dog_name": "Penny", + "breed_id": 154, + "age": 7 + } + ] } ``` @@ -41,12 +41,9 @@ Adds one or more rows of data to a database table. Primary keys of the inserted ```json { - "message": "inserted 2 of 2 records", - "inserted_hashes": [ - 8, - 9 - ], - "skipped_hashes": [] + "message": "inserted 2 of 2 records", + "inserted_hashes": [8, 9], + "skipped_hashes": [] } ``` @@ -56,29 +53,29 @@ Adds one or more rows of data to a database table. Primary keys of the inserted Changes the values of specified attributes in one or more rows in a database table as identified by the primary key. NOTE: Primary key of the updated JSON record(s) MUST be supplied on update. -* operation _(required)_ - must always be `update` -* database _(optional)_ - database of the table you are updating records in. The default is `data` -* table _(required)_ - table where you want to update records -* records _(required)_ - array of one or more records for update +- operation _(required)_ - must always be `update` +- database _(optional)_ - database of the table you are updating records in. The default is `data` +- table _(required)_ - table where you want to update records +- records _(required)_ - array of one or more records for update ### Body ```json { - "operation": "update", - "database": "dev", - "table": "dog", - "records": [ - { - "id": 1, - "weight_lbs": 55 - }, - { - "id": 2, - "owner": "Kyle B", - "weight_lbs": 35 - } - ] + "operation": "update", + "database": "dev", + "table": "dog", + "records": [ + { + "id": 1, + "weight_lbs": 55 + }, + { + "id": 2, + "owner": "Kyle B", + "weight_lbs": 35 + } + ] } ``` @@ -86,12 +83,9 @@ Changes the values of specified attributes in one or more rows in a database tab ```json { - "message": "updated 2 of 2 records", - "update_hashes": [ - 1, - 3 - ], - "skipped_hashes": [] + "message": "updated 2 of 2 records", + "update_hashes": [1, 3], + "skipped_hashes": [] } ``` @@ -101,37 +95,37 @@ Changes the values of specified attributes in one or more rows in a database tab Changes the values of specified attributes for rows with matching primary keys that exist in the table. Adds rows to the database table for primary keys that do not exist or are not provided. -* operation _(required)_ - must always be `update` -* database _(optional)_ - database of the table you are updating records in. The default is `data` -* table _(required)_ - table where you want to update records -* records _(required)_ - array of one or more records for update +- operation _(required)_ - must always be `update` +- database _(optional)_ - database of the table you are updating records in. The default is `data` +- table _(required)_ - table where you want to update records +- records _(required)_ - array of one or more records for update ### Body ```json { - "operation": "upsert", - "database": "dev", - "table": "dog", - "records": [ - { - "id": 8, - "weight_lbs": 155 - }, - { - "name": "Bill", - "breed": "Pit Bull", - "id": 10, - "Age": 11, - "weight_lbs": 155 - }, - { - "name": "Harper", - "breed": "Mutt", - "age": 5, - "weight_lbs": 155 - } - ] + "operation": "upsert", + "database": "dev", + "table": "dog", + "records": [ + { + "id": 8, + "weight_lbs": 155 + }, + { + "name": "Bill", + "breed": "Pit Bull", + "id": 10, + "Age": 11, + "weight_lbs": 155 + }, + { + "name": "Harper", + "breed": "Mutt", + "age": 5, + "weight_lbs": 155 + } + ] } ``` @@ -139,12 +133,8 @@ Changes the values of specified attributes for rows with matching primary keys t ```json { - "message": "upserted 3 of 3 records", - "upserted_hashes": [ - 8, - 10, - "ea06fc8e-717b-4c6c-b69d-b29014054ab7" - ] + "message": "upserted 3 of 3 records", + "upserted_hashes": [8, 10, "ea06fc8e-717b-4c6c-b69d-b29014054ab7"] } ``` @@ -154,22 +144,19 @@ Changes the values of specified attributes for rows with matching primary keys t Removes one or more rows of data from a specified table. -* operation _(required)_ - must always be `delete` -* database _(optional)_ - database where the table you are deleting records lives. The default is `data` -* table _(required)_ - table where you want to deleting records -* ids _(required)_ - array of one or more primary key values, which identifies records to delete +- operation _(required)_ - must always be `delete` +- database _(optional)_ - database where the table you are deleting records lives. The default is `data` +- table _(required)_ - table where you want to deleting records +- ids _(required)_ - array of one or more primary key values, which identifies records to delete ### Body ```json { - "operation": "delete", - "database": "dev", - "table": "dog", - "ids": [ - 1, - 2 - ] + "operation": "delete", + "database": "dev", + "table": "dog", + "ids": [1, 2] } ``` @@ -177,12 +164,9 @@ Removes one or more rows of data from a specified table. ```json { - "message": "2 of 2 records successfully deleted", - "deleted_hashes": [ - 1, - 2 - ], - "skipped_hashes": [] + "message": "2 of 2 records successfully deleted", + "deleted_hashes": [1, 2], + "skipped_hashes": [] } ``` @@ -192,27 +176,21 @@ Removes one or more rows of data from a specified table. Returns data from a table for one or more primary keys. -* operation _(required)_ - must always be `search_by_id` -* database _(optional)_ - database where the table you are searching lives. The default is `data` -* table _(required)_ - table you wish to search -* ids _(required)_ - array of primary keys to retrieve -* get_attributes _(required)_ - define which attributes you want returned. _Use `['*']` to return all attributes_ +- operation _(required)_ - must always be `search_by_id` +- database _(optional)_ - database where the table you are searching lives. The default is `data` +- table _(required)_ - table you wish to search +- ids _(required)_ - array of primary keys to retrieve +- get*attributes *(required)_ - define which attributes you want returned. \_Use `['*']` to return all attributes_ ### Body ```json { - "operation": "search_by_id", - "database": "dev", - "table": "dog", - "ids": [ - 1, - 2 - ], - "get_attributes": [ - "dog_name", - "breed_id" - ] + "operation": "search_by_id", + "database": "dev", + "table": "dog", + "ids": [1, 2], + "get_attributes": ["dog_name", "breed_id"] } ``` @@ -220,14 +198,14 @@ Returns data from a table for one or more primary keys. ```json [ - { - "dog_name": "Penny", - "breed_id": 154 - }, - { - "dog_name": "Harper", - "breed_id": 346 - } + { + "dog_name": "Penny", + "breed_id": 154 + }, + { + "dog_name": "Harper", + "breed_id": 346 + } ] ``` @@ -237,26 +215,23 @@ Returns data from a table for one or more primary keys. Returns data from a table for a matching value. -* operation _(required)_ - must always be `search_by_value` -* database _(optional)_ - database where the table you are searching lives. The default is `data` -* table _(required)_ - table you wish to search -* search_attribute _(required)_ - attribute you wish to search can be any attribute -* search_value _(required)_ - value you wish to search - wild cards are allowed -* get_attributes _(required)_ - define which attributes you want returned. Use `['*']` to return all attributes +- operation _(required)_ - must always be `search_by_value` +- database _(optional)_ - database where the table you are searching lives. The default is `data` +- table _(required)_ - table you wish to search +- search*attribute *(required)\_ - attribute you wish to search can be any attribute +- search*value *(required)\_ - value you wish to search - wild cards are allowed +- get*attributes *(required)\_ - define which attributes you want returned. Use `['*']` to return all attributes ### Body ```json { - "operation": "search_by_value", - "database": "dev", - "table": "dog", - "search_attribute": "owner_name", - "search_value": "Ky*", - "get_attributes": [ - "id", - "dog_name" - ] + "operation": "search_by_value", + "database": "dev", + "table": "dog", + "search_attribute": "owner_name", + "search_value": "Ky*", + "get_attributes": ["id", "dog_name"] } ``` @@ -264,12 +239,12 @@ Returns data from a table for a matching value. ```json [ - { - "dog_name": "Penny" - }, - { - "dog_name": "Kato" - } + { + "dog_name": "Penny" + }, + { + "dog_name": "Kato" + } ] ``` @@ -279,51 +254,46 @@ Returns data from a table for a matching value. Returns data from a table for one or more matching conditions. -* operation _(required)_ - must always be `search_by_conditions` -* database _(optional)_ - database where the table you are searching lives. The default is `data` -* table _(required)_ - table you wish to search -* operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` -* offset _(optional)_ - the number of records that the query results will skip. The default is `0` -* limit _(optional)_ - the number of records that the query results will include. The default is `null`, resulting in no limit -* get_attributes _(required)_ - define which attributes you want returned. Use `['*']` to return all attributes -* conditions _(required)_ - the array of conditions objects, specified below, to filter by. Must include one or more object in the array - * search_attribute _(required)_ - the attribute you wish to search, can be any attribute - * search_type _(required)_ - the type of search to perform - `equals`, `contains`, `starts_with`, `ends_with`, `greater_than`, `greater_than_equal`, `less_than`, `less_than_equal`, `between` - * search_value _(required)_ - case-sensitive value you wish to search. If the `search_type` is `between` then use an array of two values to search between +- operation _(required)_ - must always be `search_by_conditions` +- database _(optional)_ - database where the table you are searching lives. The default is `data` +- table _(required)_ - table you wish to search +- operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` +- offset _(optional)_ - the number of records that the query results will skip. The default is `0` +- limit _(optional)_ - the number of records that the query results will include. The default is `null`, resulting in no limit +- get*attributes *(required)\_ - define which attributes you want returned. Use `['*']` to return all attributes +- conditions _(required)_ - the array of conditions objects, specified below, to filter by. Must include one or more object in the array + - search*attribute *(required)\_ - the attribute you wish to search, can be any attribute + - search*type *(required)\_ - the type of search to perform - `equals`, `contains`, `starts_with`, `ends_with`, `greater_than`, `greater_than_equal`, `less_than`, `less_than_equal`, `between` + - search*value *(required)\_ - case-sensitive value you wish to search. If the `search_type` is `between` then use an array of two values to search between ### Body ```json { - "operation": "search_by_conditions", - "database": "dev", - "table": "dog", - "operator": "and", - "offset": 0, - "limit": 10, - "get_attributes": [ - "*" - ], - "conditions": [ - { - "search_attribute": "age", - "search_type": "between", - "search_value": [ - 5, - 8 - ] - }, - { - "search_attribute": "weight_lbs", - "search_type": "greater_than", - "search_value": 40 - }, - { - "search_attribute": "adorable", - "search_type": "equals", - "search_value": true - } - ] + "operation": "search_by_conditions", + "database": "dev", + "table": "dog", + "operator": "and", + "offset": 0, + "limit": 10, + "get_attributes": ["*"], + "conditions": [ + { + "search_attribute": "age", + "search_type": "between", + "search_value": [5, 8] + }, + { + "search_attribute": "weight_lbs", + "search_type": "greater_than", + "search_value": 40 + }, + { + "search_attribute": "adorable", + "search_type": "equals", + "search_value": true + } + ] } ``` @@ -331,60 +301,60 @@ Returns data from a table for one or more matching conditions. ```json [ - { - "__createdtime__": 1620227719791, - "__updatedtime__": 1620227719791, - "adorable": true, - "age": 7, - "breed_id": 346, - "dog_name": "Harper", - "id": 2, - "owner_name": "Stephen", - "weight_lbs": 55 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 7, - "breed_id": 348, - "dog_name": "Alby", - "id": 3, - "owner_name": "Kaylan", - "weight_lbs": 84 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 6, - "breed_id": 347, - "dog_name": "Billy", - "id": 4, - "owner_name": "Zach", - "weight_lbs": 60 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 5, - "breed_id": 250, - "dog_name": "Gemma", - "id": 8, - "owner_name": "Stephen", - "weight_lbs": 55 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 8, - "breed_id": 104, - "dog_name": "Bode", - "id": 11, - "owner_name": "Margo", - "weight_lbs": 75 - } + { + "__createdtime__": 1620227719791, + "__updatedtime__": 1620227719791, + "adorable": true, + "age": 7, + "breed_id": 346, + "dog_name": "Harper", + "id": 2, + "owner_name": "Stephen", + "weight_lbs": 55 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 7, + "breed_id": 348, + "dog_name": "Alby", + "id": 3, + "owner_name": "Kaylan", + "weight_lbs": 84 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 6, + "breed_id": 347, + "dog_name": "Billy", + "id": 4, + "owner_name": "Zach", + "weight_lbs": 60 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 5, + "breed_id": 250, + "dog_name": "Gemma", + "id": 8, + "owner_name": "Stephen", + "weight_lbs": 55 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 8, + "breed_id": 104, + "dog_name": "Bode", + "id": 11, + "owner_name": "Margo", + "weight_lbs": 75 + } ] ``` diff --git a/site/versioned_docs/version-4.2/developers/operations-api/quickstart-examples.md b/site/versioned_docs/version-4.2/developers/operations-api/quickstart-examples.md index 68844ff4..22b16f43 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/quickstart-examples.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/quickstart-examples.md @@ -8,7 +8,7 @@ title: Quick Start Examples We first need to create a table. Since our company is named after our CEO's dog, lets create a table to store all our employees' dogs. We'll call this table, `dogs`. -Tables in HarperDB are schema-less, so we don't need to add any attributes other than a primary_key (in pre 4.2 versions this was referred to as the hash_attribute) to create this table. A hash attribute is an attribute that defines the unique identifier for each row in your table. In a traditional RDMS this would be called a primary key. +Tables in HarperDB are schema-less, so we don't need to add any attributes other than a primary_key (in pre 4.2 versions this was referred to as the hash_attribute) to create this table. A hash attribute is an attribute that defines the unique identifier for each row in your table. In a traditional RDMS this would be called a primary key. HarperDB does offer a `database` parameter that can be used to hold logical groupings of tables. The parameter is optional and if not provided the operation will default to using a database named `data`. @@ -18,9 +18,9 @@ If you receive an error response, make sure your Basic Authentication user and p ```json { - "operation": "create_table", - "table": "dog", - "primary_key": "id" + "operation": "create_table", + "table": "dog", + "primary_key": "id" } ``` @@ -28,22 +28,23 @@ If you receive an error response, make sure your Basic Authentication user and p ```json { - "message": "table 'data.dog' successfully created." + "message": "table 'data.dog' successfully created." } ``` --- ## Create breed Table + Now that we have a table to store our dog data, we also want to create a table to track known breeds. Just as with the dog table, the only attribute we need to specify is the `primary_key`. ### Body ```json { - "operation": "create_table", - "table": "breed", - "primary_key": "id" + "operation": "create_table", + "table": "breed", + "primary_key": "id" } ``` @@ -51,7 +52,7 @@ Now that we have a table to store our dog data, we also want to create a table t ```json { - "message": "table 'data.breed' successfully created." + "message": "table 'data.breed' successfully created." } ``` @@ -65,18 +66,18 @@ We're ready to add some dog data. Penny is our CTO's pup, so she gets ID 1 or we ```json { - "operation": "insert", - "table": "dog", - "records": [ - { - "id": 1, - "dog_name": "Penny", - "owner_name": "Kyle", - "breed_id": 154, - "age": 7, - "weight_lbs": 38 - } - ] + "operation": "insert", + "table": "dog", + "records": [ + { + "id": 1, + "dog_name": "Penny", + "owner_name": "Kyle", + "breed_id": 154, + "age": 7, + "weight_lbs": 38 + } + ] } ``` @@ -84,11 +85,9 @@ We're ready to add some dog data. Penny is our CTO's pup, so she gets ID 1 or we ```json { - "message": "inserted 1 of 1 records", - "inserted_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "inserted 1 of 1 records", + "inserted_hashes": [1], + "skipped_hashes": [] } ``` @@ -102,118 +101,118 @@ Let's add some more Harper doggies! We can add as many dog objects as we want in ```json { - "operation": "insert", - "table": "dog", - "records": [ - { - "id": 2, - "dog_name": "Harper", - "owner_name": "Stephen", - "breed_id": 346, - "age": 7, - "weight_lbs": 55, - "adorable": true - }, - { - "id": 3, - "dog_name": "Alby", - "owner_name": "Kaylan", - "breed_id": 348, - "age": 7, - "weight_lbs": 84, - "adorable": true - }, - { - "id": 4, - "dog_name": "Billy", - "owner_name": "Zach", - "breed_id": 347, - "age": 6, - "weight_lbs": 60, - "adorable": true - }, - { - "id": 5, - "dog_name": "Rose Merry", - "owner_name": "Zach", - "breed_id": 348, - "age": 8, - "weight_lbs": 15, - "adorable": true - }, - { - "id": 6, - "dog_name": "Kato", - "owner_name": "Kyle", - "breed_id": 351, - "age": 6, - "weight_lbs": 32, - "adorable": true - }, - { - "id": 7, - "dog_name": "Simon", - "owner_name": "Fred", - "breed_id": 349, - "age": 3, - "weight_lbs": 35, - "adorable": true - }, - { - "id": 8, - "dog_name": "Gemma", - "owner_name": "Stephen", - "breed_id": 350, - "age": 5, - "weight_lbs": 55, - "adorable": true - }, - { - "id": 9, - "dog_name": "Yeti", - "owner_name": "Jaxon", - "breed_id": 200, - "age": 5, - "weight_lbs": 55, - "adorable": true - }, - { - "id": 10, - "dog_name": "Monkey", - "owner_name": "Aron", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true - }, - { - "id": 11, - "dog_name": "Bode", - "owner_name": "Margo", - "breed_id": 104, - "age": 8, - "weight_lbs": 75, - "adorable": true - }, - { - "id": 12, - "dog_name": "Tucker", - "owner_name": "David", - "breed_id": 346, - "age": 2, - "weight_lbs": 60, - "adorable": true - }, - { - "id": 13, - "dog_name": "Jagger", - "owner_name": "Margo", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true - } - ] + "operation": "insert", + "table": "dog", + "records": [ + { + "id": 2, + "dog_name": "Harper", + "owner_name": "Stephen", + "breed_id": 346, + "age": 7, + "weight_lbs": 55, + "adorable": true + }, + { + "id": 3, + "dog_name": "Alby", + "owner_name": "Kaylan", + "breed_id": 348, + "age": 7, + "weight_lbs": 84, + "adorable": true + }, + { + "id": 4, + "dog_name": "Billy", + "owner_name": "Zach", + "breed_id": 347, + "age": 6, + "weight_lbs": 60, + "adorable": true + }, + { + "id": 5, + "dog_name": "Rose Merry", + "owner_name": "Zach", + "breed_id": 348, + "age": 8, + "weight_lbs": 15, + "adorable": true + }, + { + "id": 6, + "dog_name": "Kato", + "owner_name": "Kyle", + "breed_id": 351, + "age": 6, + "weight_lbs": 32, + "adorable": true + }, + { + "id": 7, + "dog_name": "Simon", + "owner_name": "Fred", + "breed_id": 349, + "age": 3, + "weight_lbs": 35, + "adorable": true + }, + { + "id": 8, + "dog_name": "Gemma", + "owner_name": "Stephen", + "breed_id": 350, + "age": 5, + "weight_lbs": 55, + "adorable": true + }, + { + "id": 9, + "dog_name": "Yeti", + "owner_name": "Jaxon", + "breed_id": 200, + "age": 5, + "weight_lbs": 55, + "adorable": true + }, + { + "id": 10, + "dog_name": "Monkey", + "owner_name": "Aron", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true + }, + { + "id": 11, + "dog_name": "Bode", + "owner_name": "Margo", + "breed_id": 104, + "age": 8, + "weight_lbs": 75, + "adorable": true + }, + { + "id": 12, + "dog_name": "Tucker", + "owner_name": "David", + "breed_id": 346, + "age": 2, + "weight_lbs": 60, + "adorable": true + }, + { + "id": 13, + "dog_name": "Jagger", + "owner_name": "Margo", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true + } + ] } ``` @@ -221,22 +220,9 @@ Let's add some more Harper doggies! We can add as many dog objects as we want in ```json { - "message": "inserted 12 of 12 records", - "inserted_hashes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13 - ], - "skipped_hashes": [] + "message": "inserted 12 of 12 records", + "inserted_hashes": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], + "skipped_hashes": [] } ``` @@ -252,9 +238,9 @@ Each header in a column will be considered as an attribute, and each row in the ```json { - "operation": "csv_url_load", - "table": "breed", - "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" + "operation": "csv_url_load", + "table": "breed", + "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" } ``` @@ -262,8 +248,8 @@ Each header in a column will be considered as an attribute, and each row in the ```json { - "message": "Starting job with id e77d63b9-70d5-499c-960f-6736718a4369", - "job_id": "e77d63b9-70d5-499c-960f-6736718a4369" + "message": "Starting job with id e77d63b9-70d5-499c-960f-6736718a4369", + "job_id": "e77d63b9-70d5-499c-960f-6736718a4369" } ``` @@ -277,14 +263,14 @@ HarperDB supports NoSQL and SQL commands. We're going to update the dog table to ```json { - "operation": "update", - "table": "dog", - "records": [ - { - "id": 1, - "dog_name": "Penny B" - } - ] + "operation": "update", + "table": "dog", + "records": [ + { + "id": 1, + "dog_name": "Penny B" + } + ] } ``` @@ -292,11 +278,9 @@ HarperDB supports NoSQL and SQL commands. We're going to update the dog table to ```json { - "message": "updated 1 of 1 records", - "update_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "updated 1 of 1 records", + "update_hashes": [1], + "skipped_hashes": [] } ``` @@ -310,8 +294,8 @@ Now we're going to use a simple SQL SELECT call to pull Penny's updated data. No ```json { - "operation": "sql", - "sql": "SELECT * FROM data.dog where id = 1" + "operation": "sql", + "sql": "SELECT * FROM data.dog where id = 1" } ``` @@ -319,17 +303,17 @@ Now we're going to use a simple SQL SELECT call to pull Penny's updated data. No ```json [ - { - "owner_name": "Kyle", - "adorable": null, - "breed_id": 154, - "__updatedtime__": 1610749428575, - "dog_name": "Penny B", - "weight_lbs": 38, - "id": 1, - "age": 7, - "__createdtime__": 1610749386566 - } + { + "owner_name": "Kyle", + "adorable": null, + "breed_id": 154, + "__updatedtime__": 1610749428575, + "dog_name": "Penny B", + "weight_lbs": 38, + "id": 1, + "age": 7, + "__createdtime__": 1610749386566 + } ] ``` @@ -343,8 +327,8 @@ Here's a more complex SQL command joining the breed table with the dog table. We ```json { - "operation": "sql", - "sql": "SELECT d.id, d.dog_name, d.owner_name, b.name, b.section FROM data.dog AS d INNER JOIN data.breed AS b ON d.breed_id = b.id WHERE d.owner_name IN ('Kyle', 'Zach', 'Stephen') AND b.section = 'Mutt' ORDER BY d.dog_name" + "operation": "sql", + "sql": "SELECT d.id, d.dog_name, d.owner_name, b.name, b.section FROM data.dog AS d INNER JOIN data.breed AS b ON d.breed_id = b.id WHERE d.owner_name IN ('Kyle', 'Zach', 'Stephen') AND b.section = 'Mutt' ORDER BY d.dog_name" } ``` @@ -352,34 +336,33 @@ Here's a more complex SQL command joining the breed table with the dog table. We ```json [ - { - "id": 4, - "dog_name": "Billy", - "owner_name": "Zach", - "name": "LABRADOR / GREAT DANE MIX", - "section": "Mutt" - }, - { - "id": 8, - "dog_name": "Gemma", - "owner_name": "Stephen", - "name": "SHORT HAIRED SETTER MIX", - "section": "Mutt" - }, - { - "id": 2, - "dog_name": "Harper", - "owner_name": "Stephen", - "name": "HUSKY MIX", - "section": "Mutt" - }, - { - "id": 5, - "dog_name": "Rose Merry", - "owner_name": "Zach", - "name": "TERRIER MIX", - "section": "Mutt" - } + { + "id": 4, + "dog_name": "Billy", + "owner_name": "Zach", + "name": "LABRADOR / GREAT DANE MIX", + "section": "Mutt" + }, + { + "id": 8, + "dog_name": "Gemma", + "owner_name": "Stephen", + "name": "SHORT HAIRED SETTER MIX", + "section": "Mutt" + }, + { + "id": 2, + "dog_name": "Harper", + "owner_name": "Stephen", + "name": "HUSKY MIX", + "section": "Mutt" + }, + { + "id": 5, + "dog_name": "Rose Merry", + "owner_name": "Zach", + "name": "TERRIER MIX", + "section": "Mutt" + } ] - ``` diff --git a/site/versioned_docs/version-4.2/developers/operations-api/registration.md b/site/versioned_docs/version-4.2/developers/operations-api/registration.md index 53d953af..f31f8370 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/registration.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/registration.md @@ -1,16 +1,17 @@ --- -title: Registration +title: Registration --- -# Registration - +# Registration ## Registration Info + Returns the registration data of the HarperDB instance. -* operation _(required)_ - must always be `registration_info` +- operation _(required)_ - must always be `registration_info` ### Body + ```json { "operation": "registration_info" @@ -18,50 +19,52 @@ Returns the registration data of the HarperDB instance. ``` ### Response: 200 + ```json { - "registered": true, - "version": "4.2.0", - "ram_allocation": 2048, - "license_expiration_date": "2022-01-15" + "registered": true, + "version": "4.2.0", + "ram_allocation": 2048, + "license_expiration_date": "2022-01-15" } ``` --- ## Get Fingerprint + Returns the HarperDB fingerprint, uniquely generated based on the machine, for licensing purposes. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_fingerprint` +- operation _(required)_ - must always be `get_fingerprint` ### Body ```json { - "operation": "get_fingerprint" + "operation": "get_fingerprint" } ``` --- ## Set License + Sets the HarperDB license as generated by HarperDB License Management software. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_license` -* key _(required)_ - your license key -* company _(required)_ - the company that was used in the license +- operation _(required)_ - must always be `set_license` +- key _(required)_ - your license key +- company _(required)_ - the company that was used in the license ### Body ```json { - "operation": "set_license", - "key": "", - "company": "" + "operation": "set_license", + "key": "", + "company": "" } ``` - diff --git a/site/versioned_docs/version-4.2/developers/operations-api/sql-operations.md b/site/versioned_docs/version-4.2/developers/operations-api/sql-operations.md index 39259083..16e68ecc 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/sql-operations.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/sql-operations.md @@ -1,118 +1,123 @@ --- -title: SQL Operations +title: SQL Operations --- -# SQL Operations +# SQL Operations ## Select + Executes the provided SQL statement. The SELECT statement is used to query data from the database. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body ```json { - "operation": "sql", - "sql": "SELECT * FROM dev.dog WHERE id = 1" + "operation": "sql", + "sql": "SELECT * FROM dev.dog WHERE id = 1" } ``` ### Response: 200 + ```json [ - { - "id": 1, - "age": 7, - "dog_name": "Penny", - "weight_lbs": 38, - "breed_id": 154, - "owner_name": "Kyle", - "adorable": true, - "__createdtime__": 1611614106043, - "__updatedtime__": 1611614119507 - } + { + "id": 1, + "age": 7, + "dog_name": "Penny", + "weight_lbs": 38, + "breed_id": 154, + "owner_name": "Kyle", + "adorable": true, + "__createdtime__": 1611614106043, + "__updatedtime__": 1611614119507 + } ] ``` --- ## Insert + Executes the provided SQL statement. The INSERT statement is used to add one or more rows to a database table. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body ```json { - "operation": "sql", - "sql": "INSERT INTO dev.dog (id, dog_name) VALUE (22, 'Simon')" + "operation": "sql", + "sql": "INSERT INTO dev.dog (id, dog_name) VALUE (22, 'Simon')" } ``` ### Response: 200 + ```json { - "message": "inserted 1 of 1 records", - "inserted_hashes": [ - 22 - ], - "skipped_hashes": [] + "message": "inserted 1 of 1 records", + "inserted_hashes": [22], + "skipped_hashes": [] } ``` + --- ## Update + Executes the provided SQL statement. The UPDATE statement is used to change the values of specified attributes in one or more rows in a database table. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body + ```json { - "operation": "sql", - "sql": "UPDATE dev.dog SET dog_name = 'penelope' WHERE id = 1" + "operation": "sql", + "sql": "UPDATE dev.dog SET dog_name = 'penelope' WHERE id = 1" } ``` ### Response: 200 + ```json { - "message": "updated 1 of 1 records", - "update_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "updated 1 of 1 records", + "update_hashes": [1], + "skipped_hashes": [] } ``` --- ## Delete + Executes the provided SQL statement. The DELETE statement is used to remove one or more rows of data from a database table. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body + ```json { - "operation": "sql", - "sql": "DELETE FROM dev.dog WHERE id = 1" + "operation": "sql", + "sql": "DELETE FROM dev.dog WHERE id = 1" } ``` ### Response: 200 + ```json { - "message": "1 of 1 record successfully deleted", - "deleted_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "1 of 1 record successfully deleted", + "deleted_hashes": [1], + "skipped_hashes": [] } ``` diff --git a/site/versioned_docs/version-4.2/developers/operations-api/token-authentication.md b/site/versioned_docs/version-4.2/developers/operations-api/token-authentication.md index 161c69b5..b9ff5b31 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/token-authentication.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/token-authentication.md @@ -1,54 +1,60 @@ --- -title: Token Authentication +title: Token Authentication --- -# Token Authentication +# Token Authentication ## Create Authentication Tokens + Creates the tokens needed for authentication: operation & refresh token. _Note - this operation does not require authorization to be set_ -* operation _(required)_ - must always be `create_authentication_tokens` -* username _(required)_ - username of user to generate tokens for -* password _(required)_ - password of user to generate tokens for +- operation _(required)_ - must always be `create_authentication_tokens` +- username _(required)_ - username of user to generate tokens for +- password _(required)_ - password of user to generate tokens for ### Body + ```json { - "operation": "create_authentication_tokens", - "username": "", - "password": "" + "operation": "create_authentication_tokens", + "username": "", + "password": "" } ``` ### Response: 200 + ```json { - "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA1MTUwMzQ5LCJzdWIiOiJvcGVyYXRpb24ifQ.TlV93BqavQVQntXTt_WeY5IjAuCshfd6RzhihLWFWhu1qEKLHdwg9o5Z4ASaNmfuyKBqbFw65IbOYKd348EXeC_T6d0GO3yUhICYWXkqhQnxVW_T-ECKc7m5Bty9HTgfeaJ2e2yW55nbZYWG_gLtNgObUjCziX20-gGGR25sNTRm78mLQPYQkBJph6WXwAuyQrX704h0NfvNqyAZSwjxgtjuuEftTJ7FutLrQSLGIBIYq9nsHrFkheiDSn-C8_WKJ_zATa4YIofjqn9g5wA6o_7kSNaU2-gWnCm_jbcAcfvOmXh6rd89z8pwPqnC0f131qHIBps9UHaC1oozzmu_C6bsg7905OoAdFFY42Vojs98SMbfRApRvwaS4SprBsam3izODNI64ZUBREu3l4SZDalUf2kN8XPVWkI1LKq_mZsdtqr1r11Z9xslI1wVdxjunYeanjBhs7_j2HTX7ieVGn1a23cWceUk8F1HDGe_KEuPQs03R73V8acq_freh-kPhIa4eLqmcHeBw3WcyNGW8GuP8kyQRkGuO5sQSzZqbr_YSbZdSShZWTWDE6RYYC9ZV9KJtHVxhs0hexUpcoqO8OtJocyltRjtDjhSm9oUxszYRaALu-h8YadZT9dEKzsyQIt30d7LS9ETmmGWx4nKSTME2bV21PnDv_rEc5R6gnE", - "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA3NjU1OTQ5LCJzdWIiOiJyZWZyZXNoIn0.znhJhkdSROBPP_GLRzAxYdjgQ3BuqpAbQB7zMSSOQJ3s83HnmZ10Bnpw_3L2aF-tOFgz_t6HUAvn26fNOLsspJD2aOvHPcVS4yLKS5nagpA6ar_pqng9f6Ebfs8ohguLCfHnHRJ8poLxuWRvWW9_9pIlDiwsj4yo3Mbxi3mW8Bbtnk2MwiNHFxTksD12Ne8EWz8q2jic5MjArqBBgR373oYoWU1oxpTM6gIsZCBRowXcc9XFy2vyRoggEUU4ISRFQ4ZY9ayJ-_jleSDCUamJSNQsdb1OUTvc6CxeYlLjCoV0ijRUB6p2XWNVezFhDu8yGqOeyGFJzArhxbVc_pl4UYd5aUVxhrO9DdhG29cY_mHV0FqfXphR9QllK--LJFTP4aFqkCxnVr7HSa17hL0ZVK1HaKrx21PAdCkVNZpD6J3RtRbTkfnIB_C3Be9jhOV3vpTf7ZGn_Bs3CPJi_sL313Z1yKSDAS5rXTPceEOcTPHjzkMP9Wz19KfFq_0kuiZdDmeYNqJeFPAgGJ-S0tO51krzyGqLyCCA32_W104GR8OoQi2gEED6HIx2G0-1rnLnefN6eHQiY5r-Q3Oj9e2y3EvqqgWOmEDw88-SjPTwQVnMbBHYN2RfluU7EmvDh6Saoe79Lhlu8ZeSJ1x6ZgA8-Cirraz1_526Tn8v5FGDfrc" + "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA1MTUwMzQ5LCJzdWIiOiJvcGVyYXRpb24ifQ.TlV93BqavQVQntXTt_WeY5IjAuCshfd6RzhihLWFWhu1qEKLHdwg9o5Z4ASaNmfuyKBqbFw65IbOYKd348EXeC_T6d0GO3yUhICYWXkqhQnxVW_T-ECKc7m5Bty9HTgfeaJ2e2yW55nbZYWG_gLtNgObUjCziX20-gGGR25sNTRm78mLQPYQkBJph6WXwAuyQrX704h0NfvNqyAZSwjxgtjuuEftTJ7FutLrQSLGIBIYq9nsHrFkheiDSn-C8_WKJ_zATa4YIofjqn9g5wA6o_7kSNaU2-gWnCm_jbcAcfvOmXh6rd89z8pwPqnC0f131qHIBps9UHaC1oozzmu_C6bsg7905OoAdFFY42Vojs98SMbfRApRvwaS4SprBsam3izODNI64ZUBREu3l4SZDalUf2kN8XPVWkI1LKq_mZsdtqr1r11Z9xslI1wVdxjunYeanjBhs7_j2HTX7ieVGn1a23cWceUk8F1HDGe_KEuPQs03R73V8acq_freh-kPhIa4eLqmcHeBw3WcyNGW8GuP8kyQRkGuO5sQSzZqbr_YSbZdSShZWTWDE6RYYC9ZV9KJtHVxhs0hexUpcoqO8OtJocyltRjtDjhSm9oUxszYRaALu-h8YadZT9dEKzsyQIt30d7LS9ETmmGWx4nKSTME2bV21PnDv_rEc5R6gnE", + "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA3NjU1OTQ5LCJzdWIiOiJyZWZyZXNoIn0.znhJhkdSROBPP_GLRzAxYdjgQ3BuqpAbQB7zMSSOQJ3s83HnmZ10Bnpw_3L2aF-tOFgz_t6HUAvn26fNOLsspJD2aOvHPcVS4yLKS5nagpA6ar_pqng9f6Ebfs8ohguLCfHnHRJ8poLxuWRvWW9_9pIlDiwsj4yo3Mbxi3mW8Bbtnk2MwiNHFxTksD12Ne8EWz8q2jic5MjArqBBgR373oYoWU1oxpTM6gIsZCBRowXcc9XFy2vyRoggEUU4ISRFQ4ZY9ayJ-_jleSDCUamJSNQsdb1OUTvc6CxeYlLjCoV0ijRUB6p2XWNVezFhDu8yGqOeyGFJzArhxbVc_pl4UYd5aUVxhrO9DdhG29cY_mHV0FqfXphR9QllK--LJFTP4aFqkCxnVr7HSa17hL0ZVK1HaKrx21PAdCkVNZpD6J3RtRbTkfnIB_C3Be9jhOV3vpTf7ZGn_Bs3CPJi_sL313Z1yKSDAS5rXTPceEOcTPHjzkMP9Wz19KfFq_0kuiZdDmeYNqJeFPAgGJ-S0tO51krzyGqLyCCA32_W104GR8OoQi2gEED6HIx2G0-1rnLnefN6eHQiY5r-Q3Oj9e2y3EvqqgWOmEDw88-SjPTwQVnMbBHYN2RfluU7EmvDh6Saoe79Lhlu8ZeSJ1x6ZgA8-Cirraz1_526Tn8v5FGDfrc" } ``` --- ## Refresh Operation Token + This operation creates a new operation token. -* operation _(required)_ - must always be `refresh_operation_token` -* refresh_token _(required)_ - the refresh token that was provided when tokens were created +- operation _(required)_ - must always be `refresh_operation_token` +- refresh*token *(required)\_ - the refresh token that was provided when tokens were created ### Body + ```json { - "operation": "refresh_operation_token", - "refresh_token": "EXISTING_REFRESH_TOKEN" + "operation": "refresh_operation_token", + "refresh_token": "EXISTING_REFRESH_TOKEN" } ``` ### Response: 200 + ```json { - "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6eyJfX2NyZWF0ZWR0aW1lX18iOjE2MDQ1MTc4Nzk1MjMsIl9fdXBkYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMywiYWN0aXZlIjp0cnVlLCJhdXRoX3Rva2VuIjpudWxsLCJyb2xlIjp7Il9fY3JlYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMSwiX191cGRhdGVkdGltZV9fIjoxNjA0NTE3ODc5NTIxLCJpZCI6IjZhYmRjNGJhLWU5MjQtNDlhNi1iOGY0LWM1NWUxYmQ0OTYzZCIsInBlcm1pc3Npb24iOnsic3VwZXJfdXNlciI6dHJ1ZSwic3lzdGVtIjp7InRhYmxlcyI6eyJoZGJfdGFibGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9hdHRyaWJ1dGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9zY2hlbWEiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl91c2VyIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfcm9sZSI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2pvYiI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2xpY2Vuc2UiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9pbmZvIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfbm9kZXMiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl90ZW1wIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119fX19LCJyb2xlIjoic3VwZXJfdXNlciJ9LCJ1c2VybmFtZSI6IkhEQl9BRE1JTiJ9LCJpYXQiOjE2MDUwNjQ0MjMsImV4cCI6MTYwNTE1MDgyMywic3ViIjoib3BlcmF0aW9uIn0.VVZdhlh7_xFEaGPwhAh6VJ1d7eisiF3ok3ZwLTQAMWZB6umb2S7pPSTbXAmqAGHRlFAK3BYfnwT3YWt0gZbHvk24_0x3s_dej3PYJ8khIxzMjqpkR6qSjQIC2dhKqpwRPNtoqW_xnep9L-qf5iPtqkwsqWhF1c5VSN8nFouLWMZSuJ6Mag04soNhFvY0AF6QiTyzajMTb6uurRMWOnxk8hwMrY_5xtupabqtZheXP_0DV8l10B7GFi_oWf_lDLmwRmNbeUfW8ZyCIJMj36bjN3PsfVIxog87SWKKCwbWZWfJWw0KEph-HvU0ay35deyGWPIaDQmujuh2vtz-B0GoIAC58PJdXNyQRzES_nSb6Oqc_wGZsLM6EsNn_lrIp3mK_3a5jirZ8s6Z2SfcYKaLF2hCevdm05gRjFJ6ijxZrUSOR2S415wLxmqCCWCp_-sEUz8erUrf07_aj-Bv99GUub4b_znOsQF3uABKd4KKff2cNSMhAa-6sro5GDRRJg376dcLi2_9HOZbnSo90zrpVq8RNV900aydyzDdlXkZja8jdHBk4mxSSewYBvM7up6I0G4X-ZlzFOp30T7kjdLa6480Qp34iYRMMtq0Htpb5k2jPt8dNFnzW-Q2eRy1wNBbH3cCH0rd7_BIGuTCrl4hGU8QjlBiF7Gj0_-uJYhKnhg" + "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6eyJfX2NyZWF0ZWR0aW1lX18iOjE2MDQ1MTc4Nzk1MjMsIl9fdXBkYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMywiYWN0aXZlIjp0cnVlLCJhdXRoX3Rva2VuIjpudWxsLCJyb2xlIjp7Il9fY3JlYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMSwiX191cGRhdGVkdGltZV9fIjoxNjA0NTE3ODc5NTIxLCJpZCI6IjZhYmRjNGJhLWU5MjQtNDlhNi1iOGY0LWM1NWUxYmQ0OTYzZCIsInBlcm1pc3Npb24iOnsic3VwZXJfdXNlciI6dHJ1ZSwic3lzdGVtIjp7InRhYmxlcyI6eyJoZGJfdGFibGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9hdHRyaWJ1dGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9zY2hlbWEiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl91c2VyIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfcm9sZSI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2pvYiI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2xpY2Vuc2UiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9pbmZvIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfbm9kZXMiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl90ZW1wIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119fX19LCJyb2xlIjoic3VwZXJfdXNlciJ9LCJ1c2VybmFtZSI6IkhEQl9BRE1JTiJ9LCJpYXQiOjE2MDUwNjQ0MjMsImV4cCI6MTYwNTE1MDgyMywic3ViIjoib3BlcmF0aW9uIn0.VVZdhlh7_xFEaGPwhAh6VJ1d7eisiF3ok3ZwLTQAMWZB6umb2S7pPSTbXAmqAGHRlFAK3BYfnwT3YWt0gZbHvk24_0x3s_dej3PYJ8khIxzMjqpkR6qSjQIC2dhKqpwRPNtoqW_xnep9L-qf5iPtqkwsqWhF1c5VSN8nFouLWMZSuJ6Mag04soNhFvY0AF6QiTyzajMTb6uurRMWOnxk8hwMrY_5xtupabqtZheXP_0DV8l10B7GFi_oWf_lDLmwRmNbeUfW8ZyCIJMj36bjN3PsfVIxog87SWKKCwbWZWfJWw0KEph-HvU0ay35deyGWPIaDQmujuh2vtz-B0GoIAC58PJdXNyQRzES_nSb6Oqc_wGZsLM6EsNn_lrIp3mK_3a5jirZ8s6Z2SfcYKaLF2hCevdm05gRjFJ6ijxZrUSOR2S415wLxmqCCWCp_-sEUz8erUrf07_aj-Bv99GUub4b_znOsQF3uABKd4KKff2cNSMhAa-6sro5GDRRJg376dcLi2_9HOZbnSo90zrpVq8RNV900aydyzDdlXkZja8jdHBk4mxSSewYBvM7up6I0G4X-ZlzFOp30T7kjdLa6480Qp34iYRMMtq0Htpb5k2jPt8dNFnzW-Q2eRy1wNBbH3cCH0rd7_BIGuTCrl4hGU8QjlBiF7Gj0_-uJYhKnhg" } ``` diff --git a/site/versioned_docs/version-4.2/developers/operations-api/users-and-roles.md b/site/versioned_docs/version-4.2/developers/operations-api/users-and-roles.md index 19834424..5a6807b6 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/users-and-roles.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/users-and-roles.md @@ -5,17 +5,18 @@ title: Users and Roles # Users and Roles ## List Roles + Returns a list of all roles. Learn more about HarperDB roles here: [https://harperdb.io/docs/security/users-roles/](https://harperdb.io/docs/security/users-roles/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `list_roles` +- operation _(required)_ - must always be `list_roles` ### Body ```json { - "operation": "list_roles" + "operation": "list_roles" } ``` @@ -23,51 +24,51 @@ _Operation is restricted to super_user roles only_ ```json [ - { - "__createdtime__": 1611615061106, - "__updatedtime__": 1611615061106, - "id": "05c2ffcd-f780-40b1-9432-cfe8ba5ad890", - "permission": { - "super_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": true, - "insert": true, - "update": true - } - ] - } - } - } - }, - "role": "developer" - }, - { - "__createdtime__": 1610749235614, - "__updatedtime__": 1610749235614, - "id": "136f03fa-a0e9-46c3-bd5d-7f3e7dd5b564", - "permission": { - "cluster_user": true - }, - "role": "cluster_user" - }, - { - "__createdtime__": 1610749235609, - "__updatedtime__": 1610749235609, - "id": "745b3138-a7cf-455a-8256-ac03722eef12", - "permission": { - "super_user": true - }, - "role": "super_user" - } + { + "__createdtime__": 1611615061106, + "__updatedtime__": 1611615061106, + "id": "05c2ffcd-f780-40b1-9432-cfe8ba5ad890", + "permission": { + "super_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": true, + "insert": true, + "update": true + } + ] + } + } + } + }, + "role": "developer" + }, + { + "__createdtime__": 1610749235614, + "__updatedtime__": 1610749235614, + "id": "136f03fa-a0e9-46c3-bd5d-7f3e7dd5b564", + "permission": { + "cluster_user": true + }, + "role": "cluster_user" + }, + { + "__createdtime__": 1610749235609, + "__updatedtime__": 1610749235609, + "id": "745b3138-a7cf-455a-8256-ac03722eef12", + "permission": { + "super_user": true + }, + "role": "super_user" + } ] ``` @@ -79,40 +80,40 @@ Creates a new role with the specified permissions. Learn more about HarperDB rol _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_role` -* role _(required)_ - name of role you are defining -* permission _(required)_ - object defining permissions for users associated with this role: - * super_user _(optional)_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. - * structure_user (optional) - boolean OR array of schema names (as strings). If boolean, user can create new schemas and tables. If array of strings, users can only manage tables within the specified schemas. This overrides any individual table permissions for specified schemas, or for all schemas if the value is true. +- operation _(required)_ - must always be `add_role` +- role _(required)_ - name of role you are defining +- permission _(required)_ - object defining permissions for users associated with this role: + - super*user *(optional)\_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. + - structure_user (optional) - boolean OR array of schema names (as strings). If boolean, user can create new schemas and tables. If array of strings, users can only manage tables within the specified schemas. This overrides any individual table permissions for specified schemas, or for all schemas if the value is true. ### Body ```json { - "operation": "add_role", - "role": "developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": true, - "insert": true, - "update": true - } - ] - } - } - } - } + "operation": "add_role", + "role": "developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": true, + "insert": true, + "update": true + } + ] + } + } + } + } } ``` @@ -120,32 +121,32 @@ _Operation is restricted to super_user roles only_ ```json { - "role": "develope3r", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": true, - "insert": true, - "update": true - } - ] - } - } - } - }, - "id": "0a9368b0-bd81-482f-9f5a-8722e3582f96", - "__updatedtime__": 1598549532897, - "__createdtime__": 1598549532897 + "role": "develope3r", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": true, + "insert": true, + "update": true + } + ] + } + } + } + }, + "id": "0a9368b0-bd81-482f-9f5a-8722e3582f96", + "__updatedtime__": 1598549532897, + "__createdtime__": 1598549532897 } ``` @@ -157,42 +158,42 @@ Modifies an existing role with the specified permissions. updates permissions fr _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `alter_role` -* id _(required)_ - the id value for the role you are altering -* role _(optional)_ - name value to update on the role you are altering -* permission _(required)_ - object defining permissions for users associated with this role: - * super_user _(optional)_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. - * structure_user (optional) - boolean OR array of schema names (as strings). If boolean, user can create new schemas and tables. If array of strings, users can only manage tables within the specified schemas. This overrides any individual table permissions for specified schemas, or for all schemas if the value is true. +- operation _(required)_ - must always be `alter_role` +- id _(required)_ - the id value for the role you are altering +- role _(optional)_ - name value to update on the role you are altering +- permission _(required)_ - object defining permissions for users associated with this role: + - super*user *(optional)\_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. + - structure_user (optional) - boolean OR array of schema names (as strings). If boolean, user can create new schemas and tables. If array of strings, users can only manage tables within the specified schemas. This overrides any individual table permissions for specified schemas, or for all schemas if the value is true. ### Body ```json { - "operation": "alter_role", - "id": "f92162e2-cd17-450c-aae0-372a76859038", - "role": "another_developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": false, - "insert": true, - "update": true - } - ] - } - } - } - } + "operation": "alter_role", + "id": "f92162e2-cd17-450c-aae0-372a76859038", + "role": "another_developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": false, + "insert": true, + "update": true + } + ] + } + } + } + } } ``` @@ -200,31 +201,31 @@ _Operation is restricted to super_user roles only_ ```json { - "id": "a7cb91e9-32e4-4dbf-a327-fab4fa9191ea", - "role": "developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": false, - "insert": true, - "update": true - } - ] - } - } - } - }, - "__updatedtime__": 1598549996106 + "id": "a7cb91e9-32e4-4dbf-a327-fab4fa9191ea", + "role": "developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": false, + "insert": true, + "update": true + } + ] + } + } + } + }, + "__updatedtime__": 1598549996106 } ``` @@ -236,15 +237,15 @@ Deletes an existing role from the database. NOTE: Role with associated users can _Operation is restricted to super_user roles only_ -* operation _(required)_ - this must always be `drop_role` -* id _(required)_ - this is the id of the role you are dropping +- operation _(required)_ - this must always be `drop_role` +- id _(required)_ - this is the id of the role you are dropping ### Body ```json { - "operation": "drop_role", - "id": "2ebc3415-0aa0-4eea-9b8e-40860b436119" + "operation": "drop_role", + "id": "2ebc3415-0aa0-4eea-9b8e-40860b436119" } ``` @@ -252,7 +253,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "developer successfully deleted" + "message": "developer successfully deleted" } ``` @@ -264,13 +265,13 @@ Returns a list of all users. Learn more about HarperDB users here: [https://harp _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `list_users` +- operation _(required)_ - must always be `list_users` ### Body ```json { - "operation": "list_users" + "operation": "list_users" } ``` @@ -278,95 +279,95 @@ _Operation is restricted to super_user roles only_ ```json [ - { - "__createdtime__": 1635520961165, - "__updatedtime__": 1635520961165, - "active": true, - "role": { - "__createdtime__": 1635520961161, - "__updatedtime__": 1635520961161, - "id": "7c78ef13-c1f3-4063-8ea3-725127a78279", - "permission": { - "super_user": true, - "system": { - "tables": { - "hdb_table": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_attribute": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_schema": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_user": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_role": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_job": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_license": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_info": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_nodes": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_temp": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - } - } - } - }, - "role": "super_user" - }, - "username": "HDB_ADMIN" - } + { + "__createdtime__": 1635520961165, + "__updatedtime__": 1635520961165, + "active": true, + "role": { + "__createdtime__": 1635520961161, + "__updatedtime__": 1635520961161, + "id": "7c78ef13-c1f3-4063-8ea3-725127a78279", + "permission": { + "super_user": true, + "system": { + "tables": { + "hdb_table": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_attribute": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_schema": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_user": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_role": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_job": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_license": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_info": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_nodes": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_temp": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + } + } + } + }, + "role": "super_user" + }, + "username": "HDB_ADMIN" + } ] ``` @@ -376,13 +377,13 @@ _Operation is restricted to super_user roles only_ Returns user data for the associated user credentials. -* operation _(required)_ - must always be `user_info` +- operation _(required)_ - must always be `user_info` ### Body ```json { - "operation": "user_info" + "operation": "user_info" } ``` @@ -390,19 +391,19 @@ Returns user data for the associated user credentials. ```json { - "__createdtime__": 1610749235611, - "__updatedtime__": 1610749235611, - "active": true, - "role": { - "__createdtime__": 1610749235609, - "__updatedtime__": 1610749235609, - "id": "745b3138-a7cf-455a-8256-ac03722eef12", - "permission": { - "super_user": true - }, - "role": "super_user" - }, - "username": "HDB_ADMIN" + "__createdtime__": 1610749235611, + "__updatedtime__": 1610749235611, + "active": true, + "role": { + "__createdtime__": 1610749235609, + "__updatedtime__": 1610749235609, + "id": "745b3138-a7cf-455a-8256-ac03722eef12", + "permission": { + "super_user": true + }, + "role": "super_user" + }, + "username": "HDB_ADMIN" } ``` @@ -414,21 +415,21 @@ Creates a new user with the specified role and credentials. Learn more about Har _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_user` -* role _(required)_ - 'role' name value of the role you wish to assign to the user. See `add_role` for more detail -* username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash -* password _(required)_ - clear text for password. HarperDB will encrypt the password upon receipt -* active _(required)_ - boolean value for status of user's access to your HarperDB instance. If set to false, user will not be able to access your instance of HarperDB. +- operation _(required)_ - must always be `add_user` +- role _(required)_ - 'role' name value of the role you wish to assign to the user. See `add_role` for more detail +- username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash +- password _(required)_ - clear text for password. HarperDB will encrypt the password upon receipt +- active _(required)_ - boolean value for status of user's access to your HarperDB instance. If set to false, user will not be able to access your instance of HarperDB. ### Body ```json { - "operation": "add_user", - "role": "role_name", - "username": "hdb_user", - "password": "password", - "active": true + "operation": "add_user", + "role": "role_name", + "username": "hdb_user", + "password": "password", + "active": true } ``` @@ -436,7 +437,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "hdb_user successfully added" + "message": "hdb_user successfully added" } ``` @@ -446,23 +447,23 @@ _Operation is restricted to super_user roles only_ Modifies an existing user's role and/or credentials. Learn more about HarperDB users here: [https://harperdb.io/docs/security/users-roles/](https://harperdb.io/docs/security/users-roles/). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `alter_user` -* username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash. -* password _(optional)_ - clear text for password. HarperDB will encrypt the password upon receipt -* role _(optional)_ - `role` name value of the role you wish to assign to the user. See `add_role` for more detail -* active _(optional)_ - status of user's access to your HarperDB instance. See `add_role` for more detail +- operation _(required)_ - must always be `alter_user` +- username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash. +- password _(optional)_ - clear text for password. HarperDB will encrypt the password upon receipt +- role _(optional)_ - `role` name value of the role you wish to assign to the user. See `add_role` for more detail +- active _(optional)_ - status of user's access to your HarperDB instance. See `add_role` for more detail ### Body ```json { - "operation": "alter_user", - "role": "role_name", - "username": "hdb_user", - "password": "password", - "active": true + "operation": "alter_user", + "role": "role_name", + "username": "hdb_user", + "password": "password", + "active": true } ``` @@ -470,13 +471,11 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "updated 1 of 1 records", - "new_attributes": [], - "txn_time": 1611615114397.988, - "update_hashes": [ - "hdb_user" - ], - "skipped_hashes": [] + "message": "updated 1 of 1 records", + "new_attributes": [], + "txn_time": 1611615114397.988, + "update_hashes": ["hdb_user"], + "skipped_hashes": [] } ``` @@ -488,20 +487,22 @@ Deletes an existing user by username. Learn more about HarperDB users here: [htt _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_user` -* username _(required)_ - username assigned to the user +- operation _(required)_ - must always be `drop_user` +- username _(required)_ - username assigned to the user ### Body + ```json { - "operation": "drop_user", - "username": "sgoldberg" + "operation": "drop_user", + "username": "sgoldberg" } ``` ### Response: 200 + ```json { - "message": "sgoldberg successfully deleted" + "message": "sgoldberg successfully deleted" } ``` diff --git a/site/versioned_docs/version-4.2/developers/operations-api/utilities.md b/site/versioned_docs/version-4.2/developers/operations-api/utilities.md index 1a89ce4c..f14f8e4c 100644 --- a/site/versioned_docs/version-4.2/developers/operations-api/utilities.md +++ b/site/versioned_docs/version-4.2/developers/operations-api/utilities.md @@ -5,63 +5,73 @@ title: Utilities # Utilities ## Restart + Restarts the HarperDB instance. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `restart` +- operation _(required)_ - must always be `restart` ### Body + ```json { - "operation": "restart" + "operation": "restart" } ``` ### Response: 200 + ```json { - "message": "Restarting HarperDB. This may take up to 60 seconds." + "message": "Restarting HarperDB. This may take up to 60 seconds." } ``` + --- ## Restart Service + Restarts servers for the specified HarperDB service. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `restart_service` -* service _(required)_ - must be one of: `http_workers`, `clustering_config` or `clustering` +- operation _(required)_ - must always be `restart_service` +- service _(required)_ - must be one of: `http_workers`, `clustering_config` or `clustering` ### Body + ```json { - "operation": "restart_service", - "service": "http_workers" + "operation": "restart_service", + "service": "http_workers" } ``` ### Response: 200 + ```json { - "message": "Restarting http_workers" + "message": "Restarting http_workers" } ``` --- + ## System Information + Returns detailed metrics on the host system. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `system_information` -* attributes _(optional)_ - string array of top level attributes desired in the response, if no value is supplied all attributes will be returned. Available attributes are: ['system', 'time', 'cpu', 'memory', 'disk', 'network', 'harperdb_processes', 'table_size', 'replication'] +- operation _(required)_ - must always be `system_information` +- attributes _(optional)_ - string array of top level attributes desired in the response, if no value is supplied all attributes will be returned. Available attributes are: ['system', 'time', 'cpu', 'memory', 'disk', 'network', 'harperdb_processes', 'table_size', 'replication'] ### Body + ```json { - "operation": "system_information" + "operation": "system_information" } ``` @@ -73,116 +83,123 @@ Delete data before the specified timestamp on the specified database table exclu _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_records_before` -* date _(required)_ - records older than this date will be deleted. Supported format looks like: `YYYY-MM-DDThh:mm:ss.sZ` -* schema _(required)_ - name of the schema where you are deleting your data -* table _(required)_ - name of the table where you are deleting your data +- operation _(required)_ - must always be `delete_records_before` +- date _(required)_ - records older than this date will be deleted. Supported format looks like: `YYYY-MM-DDThh:mm:ss.sZ` +- schema _(required)_ - name of the schema where you are deleting your data +- table _(required)_ - name of the table where you are deleting your data ### Body + ```json { - "operation": "delete_records_before", - "date": "2021-01-25T23:05:27.464", - "schema": "dev", - "table": "breed" + "operation": "delete_records_before", + "date": "2021-01-25T23:05:27.464", + "schema": "dev", + "table": "breed" } ``` ### Response: 200 + ```json { - "message": "Starting job with id d3aed926-e9fe-4ec1-aea7-0fb4451bd373", - "job_id": "d3aed926-e9fe-4ec1-aea7-0fb4451bd373" + "message": "Starting job with id d3aed926-e9fe-4ec1-aea7-0fb4451bd373", + "job_id": "d3aed926-e9fe-4ec1-aea7-0fb4451bd373" } ``` --- ## Export Local + Exports data based on a given search operation to a local file in JSON or CSV format. -* operation _(required)_ - must always be `export_local` -* format _(required)_ - the format you wish to export the data, options are `json` & `csv` -* path _(required)_ - path local to the server to export the data -* search_operation _(required)_ - search_operation of `search_by_hash`, `search_by_value` or `sql` +- operation _(required)_ - must always be `export_local` +- format _(required)_ - the format you wish to export the data, options are `json` & `csv` +- path _(required)_ - path local to the server to export the data +- search*operation *(required)\_ - search_operation of `search_by_hash`, `search_by_value` or `sql` ### Body + ```json { - "operation": "export_local", - "format": "json", - "path": "/data/", - "search_operation": { - "operation": "sql", - "sql": "SELECT * FROM dev.breed" - } + "operation": "export_local", + "format": "json", + "path": "/data/", + "search_operation": { + "operation": "sql", + "sql": "SELECT * FROM dev.breed" + } } ``` ### Response: 200 + ```json { - "message": "Starting job with id 6fc18eaa-3504-4374-815c-44840a12e7e5" + "message": "Starting job with id 6fc18eaa-3504-4374-815c-44840a12e7e5" } ``` --- ## Export To S3 + Exports data based on a given search operation from table to AWS S3 in JSON or CSV format. -* operation _(required)_ - must always be `export_to_s3` -* format _(required)_ - the format you wish to export the data, options are `json` & `csv` -* s3 _(required)_ - details your access keys, bucket, bucket region and key for saving the data to S3 -* search_operation _(required)_ - search_operation of `search_by_hash`, `search_by_value` or `sql` +- operation _(required)_ - must always be `export_to_s3` +- format _(required)_ - the format you wish to export the data, options are `json` & `csv` +- s3 _(required)_ - details your access keys, bucket, bucket region and key for saving the data to S3 +- search*operation *(required)\_ - search_operation of `search_by_hash`, `search_by_value` or `sql` ### Body + ```json { - "operation": "export_to_s3", - "format": "json", - "s3": { - "aws_access_key_id": "YOUR_KEY", - "aws_secret_access_key": "YOUR_SECRET_KEY", - "bucket": "BUCKET_NAME", - "key": "OBJECT_NAME", - "region": "BUCKET_REGION" - }, - "search_operation": { - "operation": "sql", - "sql": "SELECT * FROM dev.dog" - } + "operation": "export_to_s3", + "format": "json", + "s3": { + "aws_access_key_id": "YOUR_KEY", + "aws_secret_access_key": "YOUR_SECRET_KEY", + "bucket": "BUCKET_NAME", + "key": "OBJECT_NAME", + "region": "BUCKET_REGION" + }, + "search_operation": { + "operation": "sql", + "sql": "SELECT * FROM dev.dog" + } } ``` ### Response: 200 + ```json { - "message": "Starting job with id 9fa85968-4cb1-4008-976e-506c4b13fc4a", - "job_id": "9fa85968-4cb1-4008-976e-506c4b13fc4a" + "message": "Starting job with id 9fa85968-4cb1-4008-976e-506c4b13fc4a", + "job_id": "9fa85968-4cb1-4008-976e-506c4b13fc4a" } ``` --- ## Install Node Modules + Executes npm install against specified custom function projects. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `install_node_modules` -* projects _(required)_ - must ba an array of custom functions projects. -* dry_run _(optional)_ - refers to the npm --dry-run flag: [https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run](https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run). Defaults to false. +- operation _(required)_ - must always be `install_node_modules` +- projects _(required)_ - must ba an array of custom functions projects. +- dry*run *(optional)\_ - refers to the npm --dry-run flag: [https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run](https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run). Defaults to false. ### Body + ```json { - "operation": "install_node_modules", - "projects": [ - "dogs", - "cats" - ], - "dry_run": true + "operation": "install_node_modules", + "projects": ["dogs", "cats"], + "dry_run": true } ``` @@ -194,165 +211,166 @@ Modifies the HarperDB configuration file parameters. Must follow with a restart _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_configuration` -* logging_level _(example/optional)_ - one or more configuration keywords to be updated in the HarperDB configuration file -* clustering_enabled _(example/optional)_ - one or more configuration keywords to be updated in the HarperDB configuration file +- operation _(required)_ - must always be `set_configuration` +- logging*level *(example/optional)\_ - one or more configuration keywords to be updated in the HarperDB configuration file +- clustering*enabled *(example/optional)\_ - one or more configuration keywords to be updated in the HarperDB configuration file ### Body + ```json { - "operation": "set_configuration", - "logging_level": "trace", - "clustering_enabled": true + "operation": "set_configuration", + "logging_level": "trace", + "clustering_enabled": true } ``` ### Response: 200 + ```json { - "message": "Configuration successfully set. You must restart HarperDB for new config settings to take effect." + "message": "Configuration successfully set. You must restart HarperDB for new config settings to take effect." } ``` --- ## Get Configuration + Returns the HarperDB configuration parameters. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_configuration` +- operation _(required)_ - must always be `get_configuration` ### Body + ```json { - "operation": "get_configuration" + "operation": "get_configuration" } ``` ### Response: 200 + ```json { - "http": { - "compressionThreshold": 1200, - "cors": false, - "corsAccessList": [ - null - ], - "keepAliveTimeout": 30000, - "port": 9926, - "securePort": null, - "timeout": 120000 - }, - "threads": 11, - "authentication": { - "cacheTTL": 30000, - "enableSessions": true, - "operationTokenTimeout": "1d", - "refreshTokenTimeout": "30d" - }, - "analytics": { - "aggregatePeriod": 60 - }, - "clustering": { - "enabled": true, - "hubServer": { - "cluster": { - "name": "harperdb", - "network": { - "port": 12345, - "routes": null - } - }, - "leafNodes": { - "network": { - "port": 9931 - } - }, - "network": { - "port": 9930 - } - }, - "leafServer": { - "network": { - "port": 9940, - "routes": null - }, - "streams": { - "maxAge": null, - "maxBytes": null, - "maxMsgs": null, - "path": "/Users/hdb/clustering/leaf" - } - }, - "logLevel": "info", - "nodeName": "node1", - "republishMessages": false, - "databaseLevel": false, - "tls": { - "certificate": "/Users/hdb/keys/certificate.pem", - "certificateAuthority": "/Users/hdb/keys/ca.pem", - "privateKey": "/Users/hdb/keys/privateKey.pem", - "insecure": true, - "verify": true - }, - "user": "cluster_user" - }, - "componentsRoot": "/Users/hdb/components", - "localStudio": { - "enabled": false - }, - "logging": { - "auditAuthEvents": { - "logFailed": false, - "logSuccessful": false - }, - "auditLog": true, - "auditRetention": "3d", - "file": true, - "level": "error", - "root": "/Users/hdb/log", - "rotation": { - "enabled": false, - "compress": false, - "interval": null, - "maxSize": null, - "path": "/Users/hdb/log" - }, - "stdStreams": false - }, - "mqtt": { - "network": { - "port": 1883, - "securePort": 8883 - }, - "webSocket": true, - "requireAuthentication": true - }, - "operationsApi": { - "network": { - "cors": true, - "corsAccessList": [ - "*" - ], - "domainSocket": "/Users/hdb/operations-server", - "port": 9925, - "securePort": null - } - }, - "rootPath": "/Users/hdb", - "storage": { - "writeAsync": false, - "caching": true, - "compression": false, - "noReadAhead": true, - "path": "/Users/hdb/database", - "prefetchWrites": true - }, - "tls": { - "certificate": "/Users/hdb/keys/certificate.pem", - "certificateAuthority": "/Users/hdb/keys/ca.pem", - "privateKey": "/Users/hdb/keys/privateKey.pem" - } + "http": { + "compressionThreshold": 1200, + "cors": false, + "corsAccessList": [null], + "keepAliveTimeout": 30000, + "port": 9926, + "securePort": null, + "timeout": 120000 + }, + "threads": 11, + "authentication": { + "cacheTTL": 30000, + "enableSessions": true, + "operationTokenTimeout": "1d", + "refreshTokenTimeout": "30d" + }, + "analytics": { + "aggregatePeriod": 60 + }, + "clustering": { + "enabled": true, + "hubServer": { + "cluster": { + "name": "harperdb", + "network": { + "port": 12345, + "routes": null + } + }, + "leafNodes": { + "network": { + "port": 9931 + } + }, + "network": { + "port": 9930 + } + }, + "leafServer": { + "network": { + "port": 9940, + "routes": null + }, + "streams": { + "maxAge": null, + "maxBytes": null, + "maxMsgs": null, + "path": "/Users/hdb/clustering/leaf" + } + }, + "logLevel": "info", + "nodeName": "node1", + "republishMessages": false, + "databaseLevel": false, + "tls": { + "certificate": "/Users/hdb/keys/certificate.pem", + "certificateAuthority": "/Users/hdb/keys/ca.pem", + "privateKey": "/Users/hdb/keys/privateKey.pem", + "insecure": true, + "verify": true + }, + "user": "cluster_user" + }, + "componentsRoot": "/Users/hdb/components", + "localStudio": { + "enabled": false + }, + "logging": { + "auditAuthEvents": { + "logFailed": false, + "logSuccessful": false + }, + "auditLog": true, + "auditRetention": "3d", + "file": true, + "level": "error", + "root": "/Users/hdb/log", + "rotation": { + "enabled": false, + "compress": false, + "interval": null, + "maxSize": null, + "path": "/Users/hdb/log" + }, + "stdStreams": false + }, + "mqtt": { + "network": { + "port": 1883, + "securePort": 8883 + }, + "webSocket": true, + "requireAuthentication": true + }, + "operationsApi": { + "network": { + "cors": true, + "corsAccessList": ["*"], + "domainSocket": "/Users/hdb/operations-server", + "port": 9925, + "securePort": null + } + }, + "rootPath": "/Users/hdb", + "storage": { + "writeAsync": false, + "caching": true, + "compression": false, + "noReadAhead": true, + "path": "/Users/hdb/database", + "prefetchWrites": true + }, + "tls": { + "certificate": "/Users/hdb/keys/certificate.pem", + "certificateAuthority": "/Users/hdb/keys/ca.pem", + "privateKey": "/Users/hdb/keys/privateKey.pem" + } } -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.2/developers/real-time.md b/site/versioned_docs/version-4.2/developers/real-time.md index 9db20eff..4c4c3183 100644 --- a/site/versioned_docs/version-4.2/developers/real-time.md +++ b/site/versioned_docs/version-4.2/developers/real-time.md @@ -9,9 +9,11 @@ title: Real-Time HarperDB provides real-time access to data and messaging. This allows clients to monitor and subscribe to data for changes in real-time as well as handling data-oriented messaging. HarperDB supports multiple standardized protocols to facilitate diverse standards-based client interaction. HarperDB real-time communication is based around database tables. Declared tables are the basis for monitoring data, and defining "topics" for publishing and subscribing to messages. Declaring a table that establishes a topic can be as simple as adding a table with no attributes to your [schema.graphql in a HarperDB application folder](./applications/): + ``` type MyTopic @table @export ``` + You can then subscribe to records or sub-topics in this topic/namespace, as well as save data and publish messages, with the protocols discussed below. ### Content Negotiation @@ -128,31 +130,31 @@ eventSource.onmessage = (event) => { ### MQTT Feature Support Matrix -| Feature | Support | -| ------- | ------- | -| Connections, protocol negotiation, and acknowledgement with v3.1.1 | :heavy_check_mark: | -| Connections, protocol negotiation, and acknowledgement with v5 | :heavy_check_mark: | -| Secure MQTTS | :heavy_check_mark: | -| MQTTS over WebSockets | :heavy_check_mark: | -| MQTT authentication via user/pass | :heavy_check_mark: | -| MQTT authentication via mTLS | :heavy_check_mark: | -| Publish | :heavy_check_mark: | -| Subscribe | :heavy_check_mark: | -| Multi-level wildcard | :heavy_check_mark: | -| Single-level wildcard | :heavy_check_mark: | -| QoS 0 | :heavy_check_mark: | -| QoS 1 | :heavy_check_mark: | -| QoS 2 | Not fully supported, can perform conversation but does persist | -| Clean session | :heavy_check_mark: | -| Durable session | :heavy_check_mark: | -| Distributed durable session | | -| Will | :heavy_check_mark: | -| MQTT V5 User properties | | -| MQTT V5 Will properties | | -| MQTT V5 Connection properties | | -| MQTT V5 Connection acknowledgement properties | | -| MQTT V5 Publish properties | | -| MQTT V5 Subscribe properties | | -| MQTT V5 Ack properties | | -| MQTT V5 AUTH command | | -| MQTT V5 Shared Subscriptions | | \ No newline at end of file +| Feature | Support | +| ------------------------------------------------------------------ | -------------------------------------------------------------- | +| Connections, protocol negotiation, and acknowledgement with v3.1.1 | :heavy_check_mark: | +| Connections, protocol negotiation, and acknowledgement with v5 | :heavy_check_mark: | +| Secure MQTTS | :heavy_check_mark: | +| MQTTS over WebSockets | :heavy_check_mark: | +| MQTT authentication via user/pass | :heavy_check_mark: | +| MQTT authentication via mTLS | :heavy_check_mark: | +| Publish | :heavy_check_mark: | +| Subscribe | :heavy_check_mark: | +| Multi-level wildcard | :heavy_check_mark: | +| Single-level wildcard | :heavy_check_mark: | +| QoS 0 | :heavy_check_mark: | +| QoS 1 | :heavy_check_mark: | +| QoS 2 | Not fully supported, can perform conversation but does persist | +| Clean session | :heavy_check_mark: | +| Durable session | :heavy_check_mark: | +| Distributed durable session | | +| Will | :heavy_check_mark: | +| MQTT V5 User properties | | +| MQTT V5 Will properties | | +| MQTT V5 Connection properties | | +| MQTT V5 Connection acknowledgement properties | | +| MQTT V5 Publish properties | | +| MQTT V5 Subscribe properties | | +| MQTT V5 Ack properties | | +| MQTT V5 AUTH command | | +| MQTT V5 Shared Subscriptions | | diff --git a/site/versioned_docs/version-4.2/developers/rest.md b/site/versioned_docs/version-4.2/developers/rest.md index c08765d3..8fd16f2c 100644 --- a/site/versioned_docs/version-4.2/developers/rest.md +++ b/site/versioned_docs/version-4.2/developers/rest.md @@ -10,11 +10,11 @@ Resources, including tables, can be configured as RESTful endpoints. The name of The default path structure provides access to resources at several different levels: -* `/my-resource` - The root path of a resource usually has a description of the resource (like a describe operation for a table). -* `/my-resource/` - The trailing slash in a path indicates it is a collection of the records. The root collection for a table represents all the records in a table, and usually you will append query parameters to query and search for more specific records. -* `/my-resource/record-id` - This resource locator represents a specific record, referenced by its id. This is typically how you can retrieve, update, and delete individual records. -* `/my-resource/record-id/` - Again, a trailing slash indicates a collection; here it is the collection of the records that begin with the specified id prefix. -* `/my-resource/record-id/with/multiple/parts` - A record id can consist of multiple path segments. +- `/my-resource` - The root path of a resource usually has a description of the resource (like a describe operation for a table). +- `/my-resource/` - The trailing slash in a path indicates it is a collection of the records. The root collection for a table represents all the records in a table, and usually you will append query parameters to query and search for more specific records. +- `/my-resource/record-id` - This resource locator represents a specific record, referenced by its id. This is typically how you can retrieve, update, and delete individual records. +- `/my-resource/record-id/` - Again, a trailing slash indicates a collection; here it is the collection of the records that begin with the specified id prefix. +- `/my-resource/record-id/with/multiple/parts` - A record id can consist of multiple path segments. ## GET @@ -79,13 +79,13 @@ Generally the POST method can be used for custom actions since POST has the broa This is handled by the Resource method `post(data)`, which is a good method to extend to make various other types of modifications. Also, with a table you can create a new record without specifying a primary key, for example: -````http +`````http ````http POST /MyTable/ Content-Type: application/json `{ "name": "some data" }` -```` +````` This will create a new record, auto-assigning a primary key, which will be returned in the `Location` header. @@ -199,3 +199,4 @@ Content-Type: image/gif ...image data... ``` +```` diff --git a/site/versioned_docs/version-4.2/developers/security/basic-auth.md b/site/versioned_docs/version-4.2/developers/security/basic-auth.md index 0c928c69..4f89d919 100644 --- a/site/versioned_docs/version-4.2/developers/security/basic-auth.md +++ b/site/versioned_docs/version-4.2/developers/security/basic-auth.md @@ -6,7 +6,7 @@ title: Basic Authentication HarperDB uses Basic Auth and JSON Web Tokens (JWTs) to secure our HTTP requests. In the context of an HTTP transaction, **basic access authentication** is a method for an HTTP user agent to provide a username and password when making a request. -** _**You do not need to log in separately. Basic Auth is added to each HTTP request like create\_schema, create\_table, insert etc… via headers.**_ ** +** \_**You do not need to log in separately. Basic Auth is added to each HTTP request like create_schema, create_table, insert etc… via headers.**\_ ** A header is added to each HTTP request. The header key is **“Authorization”** the header value is **“Basic <<your username and password buffer token>>”** @@ -17,46 +17,41 @@ In the below code sample, you can see where we add the authorization header to t _Note: This function uses btoa. Learn about_ [_btoa here_](https://developer.mozilla.org/en-US/docs/Web/API/btoa)_._ ```javascript -function callHarperDB(call_object, operation, callback){ - - const options = { - "method": "POST", - "hostname": call_object.endpoint_url, - "port": call_object.endpoint_port, - "path": "/", - "headers": { - "content-type": "application/json", - "authorization": "Basic " + btoa(call_object.username + ':' + call_object.password), - "cache-control": "no-cache" - - } - }; - - const http_req = http.request(options, function (hdb_res) { - let chunks = []; - - hdb_res.on("data", function (chunk) { - chunks.push(chunk); - }); - - hdb_res.on("end", function () { - const body = Buffer.concat(chunks); - if (isJson(body)) { - return callback(null, JSON.parse(body)); - } else { - return callback(body, null); - - } - - }); - }); - - http_req.on("error", function (chunk) { - return callback("Failed to connect", null); - }); - - http_req.write(JSON.stringify(operation)); - http_req.end(); - +function callHarperDB(call_object, operation, callback) { + const options = { + method: 'POST', + hostname: call_object.endpoint_url, + port: call_object.endpoint_port, + path: '/', + headers: { + 'content-type': 'application/json', + 'authorization': 'Basic ' + btoa(call_object.username + ':' + call_object.password), + 'cache-control': 'no-cache', + }, + }; + + const http_req = http.request(options, function (hdb_res) { + let chunks = []; + + hdb_res.on('data', function (chunk) { + chunks.push(chunk); + }); + + hdb_res.on('end', function () { + const body = Buffer.concat(chunks); + if (isJson(body)) { + return callback(null, JSON.parse(body)); + } else { + return callback(body, null); + } + }); + }); + + http_req.on('error', function (chunk) { + return callback('Failed to connect', null); + }); + + http_req.write(JSON.stringify(operation)); + http_req.end(); } ``` diff --git a/site/versioned_docs/version-4.2/developers/security/certificate-management.md b/site/versioned_docs/version-4.2/developers/security/certificate-management.md index 12b56eda..d15abc04 100644 --- a/site/versioned_docs/version-4.2/developers/security/certificate-management.md +++ b/site/versioned_docs/version-4.2/developers/security/certificate-management.md @@ -28,9 +28,9 @@ To replace the certificates, either replace the contents of the existing certifi ```yaml tls: - certificate: ~/hdb/keys/certificate.pem - certificateAuthority: ~/hdb/keys/ca.pem - privateKey: ~/hdb/keys/privateKey.pem + certificate: ~/hdb/keys/certificate.pem + certificateAuthority: ~/hdb/keys/ca.pem + privateKey: ~/hdb/keys/privateKey.pem ``` `operationsApi.tls` configuration is optional. If it is not set HarperDB will default to the values in the `tls` section. diff --git a/site/versioned_docs/version-4.2/developers/security/configuration.md b/site/versioned_docs/version-4.2/developers/security/configuration.md index f5feb51b..c8134aac 100644 --- a/site/versioned_docs/version-4.2/developers/security/configuration.md +++ b/site/versioned_docs/version-4.2/developers/security/configuration.md @@ -8,18 +8,19 @@ HarperDB was set up to require very minimal configuration to work out of the box ## CORS -HarperDB allows for managing [cross-origin HTTP requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access\_control\_CORS). By default, HarperDB enables CORS for all domains if you need to disable CORS completely or set up an access list of domains you can do the following: +HarperDB allows for managing [cross-origin HTTP requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS). By default, HarperDB enables CORS for all domains if you need to disable CORS completely or set up an access list of domains you can do the following: 1. Open the harperdb-config.yaml file, which can be found in \, the location you specified during install. 1. In harperdb-config.yaml there should be 2 entries under `operationsApi.network`: cors and corsAccessList. - * `cors` + - `cors` 1. To turn off, change to: `cors: false` 1. To turn on, change to: `cors: true` - * `corsAccessList` + - `corsAccessList` 1. The `corsAccessList` will only be recognized by the system when `cors` is `true` 1. To create an access list you set `corsAccessList` to a comma-separated list of domains. - i.e. `corsAccessList` is `https://harperdb.io,https://products.harperdb.io` + i.e. `corsAccessList` is `https://harperdb.io,https://products.harperdb.io` + 1. To clear out the access list and allow all domains: `corsAccessList` is `[null]` ## SSL diff --git a/site/versioned_docs/version-4.2/developers/security/index.md b/site/versioned_docs/version-4.2/developers/security/index.md index cc5dcfc2..c3bad492 100644 --- a/site/versioned_docs/version-4.2/developers/security/index.md +++ b/site/versioned_docs/version-4.2/developers/security/index.md @@ -6,7 +6,7 @@ title: Security HarperDB uses role-based, attribute-level security to ensure that users can only gain access to the data they’re supposed to be able to access. Our granular permissions allow for unparalleled flexibility and control, and can actually lower the total cost of ownership compared to other database solutions, since you no longer have to replicate subsets of your data to isolate use cases. -* [JWT Authentication](./jwt-auth) -* [Basic Authentication](./basic-auth) -* [Configuration](./configuration) -* [Users and Roles](./users-and-roles) +- [JWT Authentication](./jwt-auth) +- [Basic Authentication](./basic-auth) +- [Configuration](./configuration) +- [Users and Roles](./users-and-roles) diff --git a/site/versioned_docs/version-4.2/developers/security/jwt-auth.md b/site/versioned_docs/version-4.2/developers/security/jwt-auth.md index 18072f70..cd37119d 100644 --- a/site/versioned_docs/version-4.2/developers/security/jwt-auth.md +++ b/site/versioned_docs/version-4.2/developers/security/jwt-auth.md @@ -8,8 +8,8 @@ HarperDB uses token based authentication with JSON Web Tokens, JWTs. This consists of two primary operations `create_authentication_tokens` and `refresh_operation_token`. These generate two types of tokens, as follows: -* The `operation_token` which is used to authenticate all HarperDB operations in the Bearer Token Authorization Header. The default expiry is one day. -* The `refresh_token` which is used to generate a new `operation_token` upon expiry. This token is used in the Bearer Token Authorization Header for the `refresh_operation_token` operation only. The default expiry is thirty days. +- The `operation_token` which is used to authenticate all HarperDB operations in the Bearer Token Authorization Header. The default expiry is one day. +- The `refresh_token` which is used to generate a new `operation_token` upon expiry. This token is used in the Bearer Token Authorization Header for the `refresh_operation_token` operation only. The default expiry is thirty days. The `create_authentication_tokens` operation can be used at any time to refresh both tokens in the event that both have expired or been lost. @@ -19,9 +19,9 @@ Users must initially create tokens using their HarperDB credentials. The followi ```json { - "operation": "create_authentication_tokens", - "username": "username", - "password": "password" + "operation": "create_authentication_tokens", + "username": "username", + "password": "password" } ``` @@ -41,8 +41,8 @@ An example expected return object is: ```json { - "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDUwNjQ2MDAsInN1YiI6Im9wZXJhdGlvbiJ9.MpQA-9CMjA-mn-7mHyUXSuSC_-kqMqJXp_NDiKLFtbtMRbodCuY3DzH401rvy_4vb0yCELf0B5EapLVY1545sv80nxSl6FoZFxQaDWYXycoia6zHpiveR8hKlmA6_XTWHJbY2FM1HAFrdtt3yUTiF-ylkdNbPG7u7fRjTmHfsZ78gd2MNWIDkHoqWuFxIyqk8XydQpsjULf2Uacirt9FmHfkMZ-Jr_rRpcIEW0FZyLInbm6uxLfseFt87wA0TbZ0ofImjAuaW_3mYs-3H48CxP152UJ0jByPb0kHsk1QKP7YHWx1-Wce9NgNADfG5rfgMHANL85zvkv8sJmIGZIoSpMuU3CIqD2rgYnMY-L5dQN1fgfROrPMuAtlYCRK7r-IpjvMDQtRmCiNG45nGsM4DTzsa5GyDrkGssd5OBhl9gr9z9Bb5HQVYhSKIOiy72dK5dQNBklD4eGLMmo-u322zBITmE0lKaBcwYGJw2mmkYcrjDOmsDseU6Bf_zVUd9WF3FqwNkhg4D7nrfNSC_flalkxPHckU5EC_79cqoUIX2ogufBW5XgYbU4WfLloKcIpb51YTZlZfwBHlHPSyaq_guaXFaeCUXKq39_i1n0HRF_mRaxNru0cNDFT9Fm3eD7V8axFijSVAMDyQs_JR7SY483YDKUfN4l-vw-EVynImr4", - "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDc1NzAyMDAsInN1YiI6InJlZnJlc2gifQ.acaCsk-CJWIMLGDZdGnsthyZsJfQ8ihXLyE8mTji8PgGkpbwhs7e1O0uitMgP_pGjHq2tey1BHSwoeCL49b18WyMIB10hK-q2BXGKQkykltjTrQbg7VsdFi0h57mGfO0IqAwYd55_hzHZNnyJMh4b0iPQFDwU7iTD7x9doHhZAvzElpkWbc_NKVw5_Mw3znjntSzbuPN105zlp4Niurin-_5BnukwvoJWLEJ-ZlF6hE4wKhaMB1pWTJjMvJQJE8khTTvlUN8tGxmzoaDYoe1aCGNxmDEQnx8Y5gKzVd89sylhqi54d2nQrJ2-ElfEDsMoXpR01Ps6fNDFtLTuPTp7ixj8LvgL2nCjAg996Ga3PtdvXJAZPDYCqqvaBkZZcsiqOgqLV0vGo3VVlfrcgJXQImMYRr_Inu0FCe47A93IAWuQTs-KplM1KdGJsHSnNBV6oe6QEkROJT5qZME-8xhvBYvOXqp9Znwg39bmiBCMxk26Ce66_vw06MNgoa3D5AlXPWemfdVKPZDnj_aLVjZSs0gAfFElcVn7l9yjWJOaT2Muk26U8bJl-2BEq_DSclqKHODuYM5kkPKIdE4NFrsqsDYuGxcA25rlNETFyl0q-UXj1aoz_joy5Hdnr4mFELmjnoo4jYQuakufP9xeGPsj1skaodKl0mmoGcCD6v1F60" + "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDUwNjQ2MDAsInN1YiI6Im9wZXJhdGlvbiJ9.MpQA-9CMjA-mn-7mHyUXSuSC_-kqMqJXp_NDiKLFtbtMRbodCuY3DzH401rvy_4vb0yCELf0B5EapLVY1545sv80nxSl6FoZFxQaDWYXycoia6zHpiveR8hKlmA6_XTWHJbY2FM1HAFrdtt3yUTiF-ylkdNbPG7u7fRjTmHfsZ78gd2MNWIDkHoqWuFxIyqk8XydQpsjULf2Uacirt9FmHfkMZ-Jr_rRpcIEW0FZyLInbm6uxLfseFt87wA0TbZ0ofImjAuaW_3mYs-3H48CxP152UJ0jByPb0kHsk1QKP7YHWx1-Wce9NgNADfG5rfgMHANL85zvkv8sJmIGZIoSpMuU3CIqD2rgYnMY-L5dQN1fgfROrPMuAtlYCRK7r-IpjvMDQtRmCiNG45nGsM4DTzsa5GyDrkGssd5OBhl9gr9z9Bb5HQVYhSKIOiy72dK5dQNBklD4eGLMmo-u322zBITmE0lKaBcwYGJw2mmkYcrjDOmsDseU6Bf_zVUd9WF3FqwNkhg4D7nrfNSC_flalkxPHckU5EC_79cqoUIX2ogufBW5XgYbU4WfLloKcIpb51YTZlZfwBHlHPSyaq_guaXFaeCUXKq39_i1n0HRF_mRaxNru0cNDFT9Fm3eD7V8axFijSVAMDyQs_JR7SY483YDKUfN4l-vw-EVynImr4", + "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDc1NzAyMDAsInN1YiI6InJlZnJlc2gifQ.acaCsk-CJWIMLGDZdGnsthyZsJfQ8ihXLyE8mTji8PgGkpbwhs7e1O0uitMgP_pGjHq2tey1BHSwoeCL49b18WyMIB10hK-q2BXGKQkykltjTrQbg7VsdFi0h57mGfO0IqAwYd55_hzHZNnyJMh4b0iPQFDwU7iTD7x9doHhZAvzElpkWbc_NKVw5_Mw3znjntSzbuPN105zlp4Niurin-_5BnukwvoJWLEJ-ZlF6hE4wKhaMB1pWTJjMvJQJE8khTTvlUN8tGxmzoaDYoe1aCGNxmDEQnx8Y5gKzVd89sylhqi54d2nQrJ2-ElfEDsMoXpR01Ps6fNDFtLTuPTp7ixj8LvgL2nCjAg996Ga3PtdvXJAZPDYCqqvaBkZZcsiqOgqLV0vGo3VVlfrcgJXQImMYRr_Inu0FCe47A93IAWuQTs-KplM1KdGJsHSnNBV6oe6QEkROJT5qZME-8xhvBYvOXqp9Znwg39bmiBCMxk26Ce66_vw06MNgoa3D5AlXPWemfdVKPZDnj_aLVjZSs0gAfFElcVn7l9yjWJOaT2Muk26U8bJl-2BEq_DSclqKHODuYM5kkPKIdE4NFrsqsDYuGxcA25rlNETFyl0q-UXj1aoz_joy5Hdnr4mFELmjnoo4jYQuakufP9xeGPsj1skaodKl0mmoGcCD6v1F60" } ``` @@ -90,7 +90,7 @@ The `refresh_token` also expires at a set interval, but a longer interval. Once Token timeouts are configurable in [harperdb-config.yaml](../../deployments/configuration) with the following parameters: -* `operationsApi.authentication.operationTokenTimeout`: Defines the length of time until the operation\_token expires (default 1d). -* `operationsApi.authentication.refreshTokenTimeout`: Defines the length of time until the refresh\_token expires (default 30d). +- `operationsApi.authentication.operationTokenTimeout`: Defines the length of time until the operation_token expires (default 1d). +- `operationsApi.authentication.refreshTokenTimeout`: Defines the length of time until the refresh_token expires (default 30d). A full list of valid values for both parameters can be found [here](https://github.com/vercel/ms). diff --git a/site/versioned_docs/version-4.2/developers/security/users-and-roles.md b/site/versioned_docs/version-4.2/developers/security/users-and-roles.md index ca44ec8a..32af4b0e 100644 --- a/site/versioned_docs/version-4.2/developers/security/users-and-roles.md +++ b/site/versioned_docs/version-4.2/developers/security/users-and-roles.md @@ -19,65 +19,66 @@ Role permissions in HarperDB are broken into two categories – permissions arou **Built-In Roles** -There are three built-in roles within HarperDB. See full breakdown of operations restricted to only super\_user roles [here](./users-and-roles#role-based-operation-restrictions). +There are three built-in roles within HarperDB. See full breakdown of operations restricted to only super_user roles [here](./users-and-roles#role-based-operation-restrictions). -* `super_user` - This role provides full access to all operations and methods within a HarperDB instance, this can be considered the admin role. - * This role provides full access to all Database Definition operations and the ability to run Database Manipulation operations across the entire database schema with no restrictions. -* `cluster_user` - This role is an internal system role type that is managed internally to allow clustered instances to communicate with one another. - * This role is an internally managed role to facilitate communication between clustered instances. -* `structure_user` - This role provides specific access for creation and deletion of data. - * When defining this role type you can either assign a value of true which will allow the role to create and drop schemas & tables. Alternatively the role type can be assigned a string array. The values in this array are schemas and allows the role to only create and drop tables in the designated schemas. +- `super_user` - This role provides full access to all operations and methods within a HarperDB instance, this can be considered the admin role. + - This role provides full access to all Database Definition operations and the ability to run Database Manipulation operations across the entire database schema with no restrictions. +- `cluster_user` - This role is an internal system role type that is managed internally to allow clustered instances to communicate with one another. + - This role is an internally managed role to facilitate communication between clustered instances. +- `structure_user` - This role provides specific access for creation and deletion of data. + - When defining this role type you can either assign a value of true which will allow the role to create and drop schemas & tables. Alternatively the role type can be assigned a string array. The values in this array are schemas and allows the role to only create and drop tables in the designated schemas. **User-Defined Roles** -In addition to built-in roles, admins (i.e. users assigned to the super\_user role) can create customized roles for other users to interact with and manipulate the data within explicitly defined tables and attributes. +In addition to built-in roles, admins (i.e. users assigned to the super_user role) can create customized roles for other users to interact with and manipulate the data within explicitly defined tables and attributes. -* Unless the user-defined role is given `super_user` permissions, permissions must be defined explicitly within the request body JSON. -* Describe operations will return metadata for all schemas, tables, and attributes that a user-defined role has CRUD permissions for. +- Unless the user-defined role is given `super_user` permissions, permissions must be defined explicitly within the request body JSON. +- Describe operations will return metadata for all schemas, tables, and attributes that a user-defined role has CRUD permissions for. **Role Permissions** When creating a new, user-defined role in a HarperDB instance, you must provide a role name and the permissions to assign to that role. _Reminder, only super users can create and manage roles._ -* `role` name used to easily identify the role assigned to individual users. +- `role` name used to easily identify the role assigned to individual users. - _Roles can be altered/dropped based on the role name used in and returned from a successful `add_role` , `alter_role`, or `list_roles` operation._ -* `permissions` used to explicitly define CRUD access to existing table data. + _Roles can be altered/dropped based on the role name used in and returned from a successful `add_role` , `alter_role`, or `list_roles` operation._ + +- `permissions` used to explicitly define CRUD access to existing table data. Example JSON for `add_role` request ```json { - "operation":"add_role", - "role":"software_developer", - "permission":{ - "super_user":false, - "schema_name":{ - "tables": { - "table_name1": { - "read":true, - "insert":true, - "update":true, - "delete":false, - "attribute_permissions":[ - { - "attribute_name":"attribute1", - "read":true, - "insert":true, - "update":true - } - ] - }, - "table_name2": { - "read":true, - "insert":true, - "update":true, - "delete":false, - "attribute_permissions":[] - } - } - } - } + "operation": "add_role", + "role": "software_developer", + "permission": { + "super_user": false, + "schema_name": { + "tables": { + "table_name1": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "attribute1", + "read": true, + "insert": true, + "update": true + } + ] + }, + "table_name2": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [] + } + } + } + } } ``` @@ -85,12 +86,13 @@ Example JSON for `add_role` request There are two parts to a permissions set: -* `super_user` – boolean value indicating if role should be provided super\_user access. +- `super_user` – boolean value indicating if role should be provided super_user access. + + _If `super_user` is set to true, there should be no additional schema-specific permissions values included since the role will have access to the entire database schema. If permissions are included in the body of the operation, they will be stored within HarperDB, but ignored, as super_users have full access to the database._ - _If `super_user` is set to true, there should be no additional schema-specific permissions values included since the role will have access to the entire database schema. If permissions are included in the body of the operation, they will be stored within HarperDB, but ignored, as super\_users have full access to the database._ -* `permissions`: Schema tables that a role should have specific CRUD access to should be included in the final, schema-specific `permissions` JSON. +- `permissions`: Schema tables that a role should have specific CRUD access to should be included in the final, schema-specific `permissions` JSON. - _For user-defined roles (i.e. non-super\_user roles, blank permissions will result in the user being restricted from accessing any of the database schema._ + _For user-defined roles (i.e. non-super_user roles, blank permissions will result in the user being restricted from accessing any of the database schema._ **Table Permissions JSON** @@ -124,139 +126,142 @@ Each table that a role should be given some level of CRUD permissions to must be 1. If there are attribute-specific CRUD permissions that need to be enforced on a table, those need to be explicitly described in the `attribute_permissions` array. 1. If a non-hash attribute is given some level of CRUD access, that same access will be assigned to the table’s `hash_attribute` (also referred to as the `primary_key`), even if it is not explicitly defined in the permissions JSON. - _See table\_name1’s permission set for an example of this – even though the table’s hash attribute is not specifically defined in the attribute\_permissions array, because the role has CRUD access to ‘attribute1’, the role will have the same access to the table’s hash attribute._ -1. If attribute-level permissions are set – _i.e. attribute\_permissions.length > 0_ – any table attribute not explicitly included will be assumed to have not CRUD access (with the exception of the `hash_attribute` described in #2). + _See table_name1’s permission set for an example of this – even though the table’s hash attribute is not specifically defined in the attribute_permissions array, because the role has CRUD access to ‘attribute1’, the role will have the same access to the table’s hash attribute._ + +1. If attribute-level permissions are set – _i.e. attribute_permissions.length > 0_ – any table attribute not explicitly included will be assumed to have not CRUD access (with the exception of the `hash_attribute` described in #2). + + _See table_name1’s permission set for an example of this – in this scenario, the role will have the ability to create, insert and update ‘attribute1’ and the table’s hash attribute but no other attributes on that table._ - _See table\_name1’s permission set for an example of this – in this scenario, the role will have the ability to create, insert and update ‘attribute1’ and the table’s hash attribute but no other attributes on that table._ 1. If an `attribute_permissions` array is empty, the role’s access to a table’s attributes will be based on the table-level CRUD permissions. - _See table\_name2’s permission set for an example of this._ + _See table_name2’s permission set for an example of this._ + 1. The `__createdtime__` and `__updatedtime__` attributes that HarperDB manages internally can have read perms set but, if set, all other attribute-level permissions will be ignored. 1. Please note that DELETE permissions are not included as a part of an individual attribute-level permission set. That is because it is not possible to delete individual attributes from a row, rows must be deleted in full. - * If a role needs the ability to delete rows from a table, that permission should be set on the table-level. - * The practical approach to deleting an individual attribute of a row would be to set that attribute to null via an update statement. + - If a role needs the ability to delete rows from a table, that permission should be set on the table-level. + - The practical approach to deleting an individual attribute of a row would be to set that attribute to null via an update statement. ## `Role-Based Operation Restrictions ` -The table below includes all API operations available in HarperDB and indicates whether or not the operation is restricted to super\_user roles. - -_Keep in mind that non-super\_user roles will also be restricted within the operations they do have access to by the schema-level CRUD permissions set for the roles._ - -| Schemas and Tables | Restricted to Super\_Users | -| ------------------ | :------------------------: | -| describe\_all | | -| describe\_schema | | -| describe\_table | | -| create\_schema | X | -| drop\_schema | X | -| create\_table | X | -| drop\_table | X | -| create\_attribute | | -| drop\_attribute | X | - -| NoSQL Operations | Restricted to Super\_Users | -| ---------------------- | :------------------------: | -| insert | | -| update | | -| upsert | | -| delete | | -| search\_by\_hash | | -| search\_by\_value | | -| search\_by\_conditions | | - -| SQL Operations | Restricted to Super\_Users | -| -------------- | :------------------------: | -| select | | -| insert | | -| update | | -| delete | | - -| Bulk Operations | Restricted to Super\_Users | -| ---------------- | :------------------------: | -| csv\_data\_load | | -| csv\_file\_load | | -| csv\_url\_load | | -| import\_from\_s3 | | - -| Users and Roles | Restricted to Super\_Users | -| --------------- | :------------------------: | -| list\_roles | X | -| add\_role | X | -| alter\_role | X | -| drop\_role | X | -| list\_users | X | -| user\_info | | -| add\_user | X | -| alter\_user | X | -| drop\_user | X | - -| Clustering | Restricted to Super\_Users | -| ----------------------- | :------------------------: | -| cluster\_set\_routes | X | -| cluster\_get\_routes | X | -| cluster\_delete\_routes | X | -| add\_node | X | -| update\_node | X | -| cluster\_status | X | -| remove\_node | X | -| configure\_cluster | X | - -| Components | Restricted to Super\_Users | -| -------------------- | :------------------------: | -| get\_components | X | -| get\_component\_file | X | -| set\_component\_file | X | -| drop\_component | X | -| add\_component | X | -| package\_component | X | -| deploy\_component | X | - -| Custom Functions | Restricted to Super\_Users | -| ---------------------------------- | :------------------------: | -| custom\_functions\_status | X | -| get\_custom\_functions | X | -| get\_custom\_function | X | -| set\_custom\_function | X | -| drop\_custom\_function | X | -| add\_custom\_function\_project | X | -| drop\_custom\_function\_project | X | -| package\_custom\_function\_project | X | -| deploy\_custom\_function\_project | X | - -| Registration | Restricted to Super\_Users | -| ------------------ | :------------------------: | -| registration\_info | | -| get\_fingerprint | X | -| set\_license | X | - -| Jobs | Restricted to Super\_Users | -| ----------------------------- | :------------------------: | -| get\_job | | -| search\_jobs\_by\_start\_date | X | - -| Logs | Restricted to Super\_Users | -| --------------------------------- | :------------------------: | -| read\_log | X | -| read\_transaction\_log | X | -| delete\_transaction\_logs\_before | X | -| read\_audit\_log | X | -| delete\_audit\_logs\_before | X | - -| Utilities | Restricted to Super\_Users | -| ----------------------- | :------------------------: | -| delete\_records\_before | X | -| export\_local | X | -| export\_to\_s3 | X | -| system\_information | X | -| restart | X | -| restart\_service | X | -| get\_configuration | X | -| configure\_cluster | X | - -| Token Authentication | Restricted to Super\_Users | -| ------------------------------ | :------------------------: | -| create\_authentication\_tokens | | -| refresh\_operation\_token | | +The table below includes all API operations available in HarperDB and indicates whether or not the operation is restricted to super_user roles. + +_Keep in mind that non-super_user roles will also be restricted within the operations they do have access to by the schema-level CRUD permissions set for the roles._ + +| Schemas and Tables | Restricted to Super_Users | +| ------------------ | :-----------------------: | +| describe_all | | +| describe_schema | | +| describe_table | | +| create_schema | X | +| drop_schema | X | +| create_table | X | +| drop_table | X | +| create_attribute | | +| drop_attribute | X | + +| NoSQL Operations | Restricted to Super_Users | +| -------------------- | :-----------------------: | +| insert | | +| update | | +| upsert | | +| delete | | +| search_by_hash | | +| search_by_value | | +| search_by_conditions | | + +| SQL Operations | Restricted to Super_Users | +| -------------- | :-----------------------: | +| select | | +| insert | | +| update | | +| delete | | + +| Bulk Operations | Restricted to Super_Users | +| --------------- | :-----------------------: | +| csv_data_load | | +| csv_file_load | | +| csv_url_load | | +| import_from_s3 | | + +| Users and Roles | Restricted to Super_Users | +| --------------- | :-----------------------: | +| list_roles | X | +| add_role | X | +| alter_role | X | +| drop_role | X | +| list_users | X | +| user_info | | +| add_user | X | +| alter_user | X | +| drop_user | X | + +| Clustering | Restricted to Super_Users | +| --------------------- | :-----------------------: | +| cluster_set_routes | X | +| cluster_get_routes | X | +| cluster_delete_routes | X | +| add_node | X | +| update_node | X | +| cluster_status | X | +| remove_node | X | +| configure_cluster | X | + +| Components | Restricted to Super_Users | +| ------------------ | :-----------------------: | +| get_components | X | +| get_component_file | X | +| set_component_file | X | +| drop_component | X | +| add_component | X | +| package_component | X | +| deploy_component | X | + +| Custom Functions | Restricted to Super_Users | +| ------------------------------- | :-----------------------: | +| custom_functions_status | X | +| get_custom_functions | X | +| get_custom_function | X | +| set_custom_function | X | +| drop_custom_function | X | +| add_custom_function_project | X | +| drop_custom_function_project | X | +| package_custom_function_project | X | +| deploy_custom_function_project | X | + +| Registration | Restricted to Super_Users | +| ----------------- | :-----------------------: | +| registration_info | | +| get_fingerprint | X | +| set_license | X | + +| Jobs | Restricted to Super_Users | +| ------------------------- | :-----------------------: | +| get_job | | +| search_jobs_by_start_date | X | + +| Logs | Restricted to Super_Users | +| ------------------------------ | :-----------------------: | +| read_log | X | +| read_transaction_log | X | +| delete_transaction_logs_before | X | +| read_audit_log | X | +| delete_audit_logs_before | X | + +| Utilities | Restricted to Super_Users | +| --------------------- | :-----------------------: | +| delete_records_before | X | +| export_local | X | +| export_to_s3 | X | +| system_information | X | +| restart | X | +| restart_service | X | +| get_configuration | X | +| configure_cluster | X | + +| Token Authentication | Restricted to Super_Users | +| ---------------------------- | :-----------------------: | +| create_authentication_tokens | | +| refresh_operation_token | | ## Error: Must execute as User @@ -264,4 +269,4 @@ _Keep in mind that non-super\_user roles will also be restricted within the oper This means that you installed HarperDB as `<>`. Because HarperDB stores files natively on the operating system, we only allow the HarperDB executable to be run by a single user. This prevents permissions issues on files. -For example if you installed as user\_a, but later wanted to run as user\_b. User\_b may not have access to the hdb files HarperDB needs. This also keeps HarperDB more secure as it allows you to lock files down to a specific user and prevents other users from accessing your files. +For example if you installed as user_a, but later wanted to run as user_b. User_b may not have access to the hdb files HarperDB needs. This also keeps HarperDB more secure as it allows you to lock files down to a specific user and prevents other users from accessing your files. diff --git a/site/versioned_docs/version-4.2/developers/sql-guide/date-functions.md b/site/versioned_docs/version-4.2/developers/sql-guide/date-functions.md index f632b4ed..9ecebdb1 100644 --- a/site/versioned_docs/version-4.2/developers/sql-guide/date-functions.md +++ b/site/versioned_docs/version-4.2/developers/sql-guide/date-functions.md @@ -40,6 +40,7 @@ Referencing this variable will evaluate as the current Unix Timestamp in millise "current_timestamp_result": 1587568845765 } ``` + ### DATE([date_string]) Formats and returns the date_string argument in UTC in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. @@ -64,9 +65,8 @@ If a date_string is not provided, the function will return the current UTC date/ Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. - | Key | Shorthand | -|--------------|-----------| +| ------------ | --------- | | years | y | | quarters | Q | | months | M | @@ -77,7 +77,6 @@ Adds the defined amount of time to the date provided in UTC and returns the resu | seconds | s | | milliseconds | ms | - ``` "SELECT DATE_ADD(1587568845765, 1, 'days') AS date_add_result" AND "SELECT DATE_ADD(1587568845765, 1, 'd') AS date_add_result" both return @@ -99,13 +98,14 @@ AS date_add_result2" returns Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. Accepted interval values: -* years -* months -* weeks -* days -* hours -* minutes -* seconds + +- years +- months +- weeks +- days +- hours +- minutes +- seconds ``` "SELECT DATE_DIFF(CURRENT_TIMESTAMP, 1650643129017, 'hours') @@ -132,7 +132,7 @@ AS date_format_result" returns Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date_sub interval values- Either string value (key or shorthand) can be passed as the interval argument. | Key | Shorthand | -|--------------|-----------| +| ------------ | --------- | | years | y | | quarters | Q | | months | M | @@ -143,7 +143,6 @@ Subtracts the defined amount of time from the date provided in UTC and returns t | seconds | s | | milliseconds | ms | - ``` "SELECT DATE_SUB(1587568845765, 2, 'years') AS date_sub_result" returns { @@ -155,15 +154,15 @@ Subtracts the defined amount of time from the date provided in UTC and returns t Extracts and returns the date_part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” -| date_part | Example return value* | -|--------------|------------------------| -| year | “2020” | -| month | “3” | -| day | “26” | - | hour | “15” | -| minute | “13” | -| second | “2” | -| millisecond | “41” | +| date_part | Example return value\* | +| ----------- | ---------------------- | +| year | “2020” | +| month | “3” | +| day | “26” | +| hour | “15” | +| minute | “13” | +| second | “2” | +| millisecond | “41” | ``` "SELECT EXTRACT(1587568845765, 'year') AS extract_result" returns @@ -184,6 +183,7 @@ Returns the current Unix Timestamp in milliseconds. ``` ### GET_SERVER_TIME() + Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. ``` @@ -194,6 +194,7 @@ Returns the current date/time value based on the server’s timezone in `YYYY-MM ``` ### OFFSET_UTC(date, offset) + Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. ``` @@ -211,6 +212,7 @@ Returns the UTC date time value with the offset provided included in the return ``` ### NOW() + Returns the current Unix Timestamp in milliseconds. ``` @@ -219,4 +221,3 @@ Returns the current Unix Timestamp in milliseconds. "now_result": 1587568845765 } ``` - diff --git a/site/versioned_docs/version-4.2/developers/sql-guide/features-matrix.md b/site/versioned_docs/version-4.2/developers/sql-guide/features-matrix.md index db9a216c..e0614eec 100644 --- a/site/versioned_docs/version-4.2/developers/sql-guide/features-matrix.md +++ b/site/versioned_docs/version-4.2/developers/sql-guide/features-matrix.md @@ -6,78 +6,77 @@ title: SQL Features Matrix HarperDB provides access to most SQL functions, and we’re always expanding that list. Check below to see if we cover what you need. If not, feel free to [add a Feature Request](https://feedback.harperdb.io/). - | INSERT | | -|------------------------------------|-----| -| Values - multiple values supported | ✔ | +| ---------------------------------- | --- | +| Values - multiple values supported | ✔ | | Sub-SELECT | ✗ | -| UPDATE | | -|-----------------|-----| -| SET | ✔ | -| Sub-SELECT | ✗ | -| Conditions | ✔ | -| Date Functions* | ✔ | -| Math Functions | ✔ | +| UPDATE | | +| ---------------- | --- | +| SET | ✔ | +| Sub-SELECT | ✗ | +| Conditions | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | | DELETE | | -|------------|-----| -| FROM | ✔ | +| ---------- | --- | +| FROM | ✔ | | Sub-SELECT | ✗ | -| Conditions | ✔ | +| Conditions | ✔ | -| SELECT | | -|-----------------------|-----| -| Column SELECT | ✔ | -| Aliases | ✔ | -| Aggregator Functions | ✔ | -| Date Functions* | ✔ | -| Math Functions | ✔ | -| Constant Values | ✔ | -| Distinct | ✔ | -| Sub-SELECT | ✗ | +| SELECT | | +| -------------------- | --- | +| Column SELECT | ✔ | +| Aliases | ✔ | +| Aggregator Functions | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | +| Constant Values | ✔ | +| Distinct | ✔ | +| Sub-SELECT | ✗ | -| FROM | | -|-------------------|-----| -| Multi-table JOIN | ✔ | -| INNER JOIN | ✔ | -| LEFT OUTER JOIN | ✔ | -| LEFT INNER JOIN | ✔ | -| RIGHT OUTER JOIN | ✔ | -| RIGHT INNER JOIN | ✔ | -| FULL JOIN | ✔ | -| UNION | ✗ | -| Sub-SELECT | ✗ | -| TOP | ✔ | +| FROM | | +| ---------------- | --- | +| Multi-table JOIN | ✔ | +| INNER JOIN | ✔ | +| LEFT OUTER JOIN | ✔ | +| LEFT INNER JOIN | ✔ | +| RIGHT OUTER JOIN | ✔ | +| RIGHT INNER JOIN | ✔ | +| FULL JOIN | ✔ | +| UNION | ✗ | +| Sub-SELECT | ✗ | +| TOP | ✔ | | WHERE | | -|----------------------------|-----| -| Multi-Conditions | ✔ | -| Wildcards | ✔ | -| IN | ✔ | -| LIKE | ✔ | -| Bit-wise Operators AND, OR | ✔ | -| Bit-wise Operators NOT | ✔ | -| NULL | ✔ | -| BETWEEN | ✔ | -| EXISTS,ANY,ALL | ✔ | -| Compare columns | ✔ | -| Compare constants | ✔ | -| Date Functions* | ✔ | -| Math Functions | ✔ | -| Sub-SELECT | ✗ | +| -------------------------- | --- | +| Multi-Conditions | ✔ | +| Wildcards | ✔ | +| IN | ✔ | +| LIKE | ✔ | +| Bit-wise Operators AND, OR | ✔ | +| Bit-wise Operators NOT | ✔ | +| NULL | ✔ | +| BETWEEN | ✔ | +| EXISTS,ANY,ALL | ✔ | +| Compare columns | ✔ | +| Compare constants | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | +| Sub-SELECT | ✗ | | GROUP BY | | -|-----------------------|-----| -| Multi-Column GROUP BY | ✔ | +| --------------------- | --- | +| Multi-Column GROUP BY | ✔ | -| HAVING | | -|--------------------------------|-----| -| Aggregate function conditions | ✔ | +| HAVING | | +| ----------------------------- | --- | +| Aggregate function conditions | ✔ | | ORDER BY | | -|-----------------------|-----| -| Multi-Column ORDER BY | ✔ | -| Aliases | ✔ | -| Date Functions* | ✔ | -| Math Functions | ✔ | \ No newline at end of file +| --------------------- | --- | +| Multi-Column ORDER BY | ✔ | +| Aliases | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | diff --git a/site/versioned_docs/version-4.2/developers/sql-guide/functions.md b/site/versioned_docs/version-4.2/developers/sql-guide/functions.md index b9a10787..0360b1e8 100644 --- a/site/versioned_docs/version-4.2/developers/sql-guide/functions.md +++ b/site/versioned_docs/version-4.2/developers/sql-guide/functions.md @@ -7,147 +7,149 @@ title: HarperDB SQL Functions This SQL keywords reference contains the SQL functions available in HarperDB. ## Functions + ### Aggregate -| Keyword | Syntax | Description | -|-----------------|-------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| -| AVG | AVG(_expression_) | Returns the average of a given numeric expression. | -| COUNT | SELECT COUNT(_column_name_) FROM _schema.table_ WHERE _condition_ | Returns the number records that match the given criteria. Nulls are not counted. | -| GROUP_CONCAT | GROUP_CONCAT(_expression_) | Returns a string with concatenated values that are comma separated and that are non-null from a group. Will return null when there are non-null values. | -| MAX | SELECT MAX(_column_name_) FROM _schema.table_ WHERE _condition_ | Returns largest value in a specified column. | -| MIN | SELECT MIN(_column_name_) FROM _schema.table_ WHERE _condition_ | Returns smallest value in a specified column. | -| SUM | SUM(_column_name_) | Returns the sum of the numeric values provided. | -| ARRAY* | ARRAY(_expression_) | Returns a list of data as a field. | -| DISTINCT_ARRAY* | DISTINCT_ARRAY(_expression_) | When placed around a standard ARRAY() function, returns a distinct (deduplicated) results set. | +| Keyword | Syntax | Description | +| ---------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| AVG | AVG(_expression_) | Returns the average of a given numeric expression. | +| COUNT | SELECT COUNT(_column_name_) FROM _schema.table_ WHERE _condition_ | Returns the number records that match the given criteria. Nulls are not counted. | +| GROUP_CONCAT | GROUP*CONCAT(\_expression*) | Returns a string with concatenated values that are comma separated and that are non-null from a group. Will return null when there are non-null values. | +| MAX | SELECT MAX(_column_name_) FROM _schema.table_ WHERE _condition_ | Returns largest value in a specified column. | +| MIN | SELECT MIN(_column_name_) FROM _schema.table_ WHERE _condition_ | Returns smallest value in a specified column. | +| SUM | SUM(_column_name_) | Returns the sum of the numeric values provided. | +| ARRAY\* | ARRAY(_expression_) | Returns a list of data as a field. | +| DISTINCT_ARRAY\* | DISTINCT*ARRAY(\_expression*) | When placed around a standard ARRAY() function, returns a distinct (deduplicated) results set. | -*For more information on ARRAY() and DISTINCT_ARRAY() see [this blog](https://www.harperdb.io/post/sql-queries-to-complex-objects). +\*For more information on ARRAY() and DISTINCT_ARRAY() see [this blog](https://www.harperdb.io/post/sql-queries-to-complex-objects). ### Conversion -| Keyword | Syntax | Description | -|---------|--------------------------------------------------|------------------------------------------------------------------------| -| CAST | CAST(_expression AS datatype(length)_) | Converts a value to a specified datatype. | -| CONVERT | CONVERT(_data_type(length), expression, style_) | Converts a value from one datatype to a different, specified datatype. | - +| Keyword | Syntax | Description | +| ------- | ----------------------------------------------- | ---------------------------------------------------------------------- | +| CAST | CAST(_expression AS datatype(length)_) | Converts a value to a specified datatype. | +| CONVERT | CONVERT(_data_type(length), expression, style_) | Converts a value from one datatype to a different, specified datatype. | ### Date & Time -| Keyword | Syntax | Description | -|-------------------|-----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CURRENT_DATE | CURRENT_DATE() | Returns the current date in UTC in “YYYY-MM-DD” String format. | -| CURRENT_TIME | CURRENT_TIME() | Returns the current time in UTC in “HH:mm:ss.SSS” string format. | -| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | Referencing this variable will evaluate as the current Unix Timestamp in milliseconds. For more information, go here. | +| Keyword | Syntax | Description | +| ----------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------- | +| CURRENT_DATE | CURRENT_DATE() | Returns the current date in UTC in “YYYY-MM-DD” String format. | +| CURRENT_TIME | CURRENT_TIME() | Returns the current time in UTC in “HH:mm:ss.SSS” string format. | +| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | Referencing this variable will evaluate as the current Unix Timestamp in milliseconds. For more information, go here. | + | -| DATE | DATE([_date_string_]) | Formats and returns the date_string argument in UTC in ‘YYYY-MM-DDTHH:mm:ss.SSSZZ’ string format. If a date_string is not provided, the function will return the current UTC date/time value in the return format defined above. For more information, go here. | +| DATE | DATE([_date_string_]) | Formats and returns the date*string argument in UTC in ‘YYYY-MM-DDTHH:mm:ss.SSSZZ’ string format. If a date_string is not provided, the function will return the current UTC date/time value in the return format defined above. For more information, go here. | | -| DATE_ADD | DATE_ADD(_date, value, interval_) | Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | +| DATE_ADD | DATE_ADD(\_date, value, interval*) | Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | | -| DATE_DIFF | DATEDIFF(_date_1, date_2[, interval]_) | Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. For more information, go here. | +| DATE*DIFF | DATEDIFF(\_date_1, date_2[, interval]*) | Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. For more information, go here. | | -| DATE_FORMAT | DATE_FORMAT(_date, format_) | Formats and returns a date value in the String format provided. Find more details on accepted format values in the moment.js docs. For more information, go here. | +| DATE*FORMAT | DATE_FORMAT(\_date, format*) | Formats and returns a date value in the String format provided. Find more details on accepted format values in the moment.js docs. For more information, go here. | | -| DATE_SUB | DATE_SUB(_date, format_) | Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date_sub interval values- Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | +| DATE*SUB | DATE_SUB(\_date, format*) | Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date*sub interval values- Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | | -| DAY | DAY(_date_) | Return the day of the month for the given date. | +| DAY | DAY(\_date*) | Return the day of the month for the given date. | | -| DAYOFWEEK | DAYOFWEEK(_date_) | Returns the numeric value of the weekday of the date given(“YYYY-MM-DD”).NOTE: 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, and 6=Saturday. | -| EXTRACT | EXTRACT(_date, date_part_) | Extracts and returns the date_part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” For more information, go here. | +| DAYOFWEEK | DAYOFWEEK(_date_) | Returns the numeric value of the weekday of the date given(“YYYY-MM-DD”).NOTE: 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, and 6=Saturday. | +| EXTRACT | EXTRACT(_date, date_part_) | Extracts and returns the date*part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” For more information, go here. | | -| GETDATE | GETDATE() | Returns the current Unix Timestamp in milliseconds. | -| GET_SERVER_TIME | GET_SERVER_TIME() | Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. | -| OFFSET_UTC | OFFSET_UTC(_date, offset_) | Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. | -| NOW | NOW() | Returns the current Unix Timestamp in milliseconds. | +| GETDATE | GETDATE() | Returns the current Unix Timestamp in milliseconds. | +| GET_SERVER_TIME | GET_SERVER_TIME() | Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. | +| OFFSET_UTC | OFFSET_UTC(\_date, offset*) | Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. | +| NOW | NOW() | Returns the current Unix Timestamp in milliseconds. | | -| HOUR | HOUR(_datetime_) | Returns the hour part of a given date in range of 0 to 838. | +| HOUR | HOUR(_datetime_) | Returns the hour part of a given date in range of 0 to 838. | | -| MINUTE | MINUTE(_datetime_) | Returns the minute part of a time/datetime in range of 0 to 59. | +| MINUTE | MINUTE(_datetime_) | Returns the minute part of a time/datetime in range of 0 to 59. | | -| MONTH | MONTH(_date_) | Returns month part for a specified date in range of 1 to 12. | +| MONTH | MONTH(_date_) | Returns month part for a specified date in range of 1 to 12. | | -| SECOND | SECOND(_datetime_) | Returns the seconds part of a time/datetime in range of 0 to 59. | -| YEAR | YEAR(_date_) | Returns the year part for a specified date. | +| SECOND | SECOND(_datetime_) | Returns the seconds part of a time/datetime in range of 0 to 59. | +| YEAR | YEAR(_date_) | Returns the year part for a specified date. | | ### Logical -| Keyword | Syntax | Description | -|---------|--------------------------------------------------|--------------------------------------------------------------------------------------------| -| IF | IF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | -| IIF | IIF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | -| IFNULL | IFNULL(_expression, alt_value_) | Returns a specified value if the expression is null. | -| NULLIF | NULLIF(_expression_1, expression_2_) | Returns null if expression_1 is equal to expression_2, if not equal, returns expression_1. | +| Keyword | Syntax | Description | +| ------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------ | +| IF | IF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | +| IIF | IIF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | +| IFNULL | IFNULL(_expression, alt_value_) | Returns a specified value if the expression is null. | +| NULLIF | NULLIF(_expression_1, expression_2_) | Returns null if expression_1 is equal to expression_2, if not equal, returns expression_1. | ### Mathematical -| Keyword | Syntax | Description | -|---------|---------------------------------|-----------------------------------------------------------------------------------------------------| -| ABS | ABS(_expression_) | Returns the absolute value of a given numeric expression. | -| CEIL | CEIL(_number_) | Returns integer ceiling, the smallest integer value that is bigger than or equal to a given number. | -| EXP | EXP(_number_) | Returns e to the power of a specified number. | -| FLOOR | FLOOR(_number_) | Returns the largest integer value that is smaller than, or equal to, a given number. | -| RANDOM | RANDOM(_seed_) | Returns a pseudo random number. | -| ROUND | ROUND(_number,decimal_places_) | Rounds a given number to a specified number of decimal places. | -| SQRT | SQRT(_expression_) | Returns the square root of an expression. | - +| Keyword | Syntax | Description | +| ------- | ------------------------------ | --------------------------------------------------------------------------------------------------- | +| ABS | ABS(_expression_) | Returns the absolute value of a given numeric expression. | +| CEIL | CEIL(_number_) | Returns integer ceiling, the smallest integer value that is bigger than or equal to a given number. | +| EXP | EXP(_number_) | Returns e to the power of a specified number. | +| FLOOR | FLOOR(_number_) | Returns the largest integer value that is smaller than, or equal to, a given number. | +| RANDOM | RANDOM(_seed_) | Returns a pseudo random number. | +| ROUND | ROUND(_number,decimal_places_) | Rounds a given number to a specified number of decimal places. | +| SQRT | SQRT(_expression_) | Returns the square root of an expression. | ### String -| Keyword | Syntax | Description | -|-------------|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CONCAT | CONCAT(_string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together, resulting in a single string. | -| CONCAT_WS | CONCAT_WS(_separator, string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together with a separator, resulting in a single string. | -| INSTR | INSTR(_string_1, string_2_) | Returns the first position, as an integer, of string_2 within string_1. | -| LEN | LEN(_string_) | Returns the length of a string. | -| LOWER | LOWER(_string_) | Converts a string to lower-case. | -| REGEXP | SELECT _column_name_ FROM _schema.table_ WHERE _column_name_ REGEXP _pattern_ | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | -| REGEXP_LIKE | SELECT _column_name_ FROM _schema.table_ WHERE REGEXP_LIKE(_column_name, pattern_) | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | -| REPLACE | REPLACE(_string, old_string, new_string_) | Replaces all instances of old_string within new_string, with string. | -| SUBSTRING | SUBSTRING(_string, string_position, length_of_substring_) | Extracts a specified amount of characters from a string. | -| TRIM | TRIM([_character(s) FROM_] _string_) | Removes leading and trailing spaces, or specified character(s), from a string. | -| UPPER | UPPER(_string_) | Converts a string to upper-case. | +| Keyword | Syntax | Description | +| ----------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| CONCAT | CONCAT(_string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together, resulting in a single string. | +| CONCAT_WS | CONCAT*WS(\_separator, string_1, string_2, ...., string_n*) | Concatenates, or joins, two or more strings together with a separator, resulting in a single string. | +| INSTR | INSTR(_string_1, string_2_) | Returns the first position, as an integer, of string_2 within string_1. | +| LEN | LEN(_string_) | Returns the length of a string. | +| LOWER | LOWER(_string_) | Converts a string to lower-case. | +| REGEXP | SELECT _column_name_ FROM _schema.table_ WHERE _column_name_ REGEXP _pattern_ | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | +| REGEXP_LIKE | SELECT _column_name_ FROM _schema.table_ WHERE REGEXP*LIKE(\_column_name, pattern*) | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | +| REPLACE | REPLACE(_string, old_string, new_string_) | Replaces all instances of old_string within new_string, with string. | +| SUBSTRING | SUBSTRING(_string, string_position, length_of_substring_) | Extracts a specified amount of characters from a string. | +| TRIM | TRIM([_character(s) FROM_] _string_) | Removes leading and trailing spaces, or specified character(s), from a string. | +| UPPER | UPPER(_string_) | Converts a string to upper-case. | ## Operators + ### Logical Operators -| Keyword | Syntax | Description | -|----------|--------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------| -| BETWEEN | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ BETWEEN _value_1_ AND _value_2_ | (inclusive) Returns values(numbers, text, or dates) within a given range. | -| IN | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ IN(_value(s)_) | Used to specify multiple values in a WHERE clause. | -| LIKE | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_n_ LIKE _pattern_ | Searches for a specified pattern within a WHERE clause. | +| Keyword | Syntax | Description | +| ------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| BETWEEN | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ BETWEEN _value_1_ AND _value_2_ | (inclusive) Returns values(numbers, text, or dates) within a given range. | +| IN | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ IN(_value(s)_) | Used to specify multiple values in a WHERE clause. | +| LIKE | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_n_ LIKE _pattern_ | Searches for a specified pattern within a WHERE clause. | ## Queries + ### General -| Keyword | Syntax | Description | -|-----------|--------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------| -| DISTINCT | SELECT DISTINCT _column_name(s)_ FROM _schema.table_ | Returns only unique values, eliminating duplicate records. | -| FROM | FROM _schema.table_ | Used to list the schema(s), table(s), and any joins required for a SQL statement. | -| GROUP BY | SELECT _column_name(s)_ FROM _schema.table_ WHERE _condition_ GROUP BY _column_name(s)_ ORDER BY _column_name(s)_ | Groups rows that have the same values into summary rows. | -| HAVING | SELECT _column_name(s)_ FROM _schema.table_ WHERE _condition_ GROUP BY _column_name(s)_ HAVING _condition_ ORDER BY _column_name(s)_ | Filters data based on a group or aggregate function. | -| SELECT | SELECT _column_name(s)_ FROM _schema.table_ | Selects data from table. | -| WHERE | SELECT _column_name(s)_ FROM _schema.table_ WHERE _condition_ | Extracts records based on a defined condition. | +| Keyword | Syntax | Description | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- | +| DISTINCT | SELECT DISTINCT _column_name(s)_ FROM _schema.table_ | Returns only unique values, eliminating duplicate records. | +| FROM | FROM _schema.table_ | Used to list the schema(s), table(s), and any joins required for a SQL statement. | +| GROUP BY | SELECT _column_name(s)_ FROM _schema.table_ WHERE _condition_ GROUP BY _column_name(s)_ ORDER BY _column_name(s)_ | Groups rows that have the same values into summary rows. | +| HAVING | SELECT _column_name(s)_ FROM _schema.table_ WHERE _condition_ GROUP BY _column_name(s)_ HAVING _condition_ ORDER BY _column_name(s)_ | Filters data based on a group or aggregate function. | +| SELECT | SELECT _column_name(s)_ FROM _schema.table_ | Selects data from table. | +| WHERE | SELECT _column_name(s)_ FROM _schema.table_ WHERE _condition_ | Extracts records based on a defined condition. | ### Joins -| Keyword | Syntax | Description | -|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CROSS JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ CROSS JOIN _schema.table_2_ | Returns a paired combination of each row from _table_1_ with row from _table_2_. _Note: CROSS JOIN can return very large result sets and is generally considered bad practice._ | -| FULL OUTER | SELECT _column_name(s)_ FROM _schema.table_1_ FULL OUTER JOIN _schema.table_2_ ON _table_1.column_name_ _= table_2.column_name_ WHERE _condition_ | Returns all records when there is a match in either _table_1_ (left table) or _table_2_ (right table). | -| [INNER] JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ INNER JOIN _schema.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return only matching records from _table_1_ (left table) and _table_2_ (right table). The INNER keyword is optional and does not affect the result. | -| LEFT [OUTER] JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ LEFT OUTER JOIN _schema.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return all records from _table_1_ (left table) and matching data from _table_2_ (right table). The OUTER keyword is optional and does not affect the result. | -| RIGHT [OUTER] JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ RIGHT OUTER JOIN _schema.table_2_ ON _table_1.column_name = table_2.column_name_ | Return all records from _table_2_ (right table) and matching data from _table_1_ (left table). The OUTER keyword is optional and does not affect the result. | +| Keyword | Syntax | Description | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| CROSS JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ CROSS JOIN _schema.table_2_ | Returns a paired combination of each row from _table_1_ with row from _table_2_. _Note: CROSS JOIN can return very large result sets and is generally considered bad practice._ | +| FULL OUTER | SELECT _column_name(s)_ FROM _schema.table_1_ FULL OUTER JOIN _schema.table_2_ ON _table_1.column_name_ _= table_2.column_name_ WHERE _condition_ | Returns all records when there is a match in either _table_1_ (left table) or _table_2_ (right table). | +| [INNER] JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ INNER JOIN _schema.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return only matching records from _table_1_ (left table) and _table_2_ (right table). The INNER keyword is optional and does not affect the result. | +| LEFT [OUTER] JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ LEFT OUTER JOIN _schema.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return all records from _table_1_ (left table) and matching data from _table_2_ (right table). The OUTER keyword is optional and does not affect the result. | +| RIGHT [OUTER] JOIN | SELECT _column_name(s)_ FROM _schema.table_1_ RIGHT OUTER JOIN _schema.table_2_ ON _table_1.column_name = table_2.column_name_ | Return all records from _table_2_ (right table) and matching data from _table_1_ (left table). The OUTER keyword is optional and does not affect the result. | ### Predicates -| Keyword | Syntax | Description | -|--------------|------------------------------------------------------------------------------|----------------------------| -| IS NOT NULL | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ IS NOT NULL | Tests for non-null values. | -| IS NULL | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ IS NULL | Tests for null values. | +| Keyword | Syntax | Description | +| ----------- | --------------------------------------------------------------------------- | -------------------------- | +| IS NOT NULL | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ IS NOT NULL | Tests for non-null values. | +| IS NULL | SELECT _column_name(s)_ FROM _schema.table_ WHERE _column_name_ IS NULL | Tests for null values. | ### Statements | Keyword | Syntax | Description | -|---------|---------------------------------------------------------------------------------------------|-------------------------------------| +| ------- | ------------------------------------------------------------------------------------------- | ----------------------------------- | | DELETE | DELETE FROM _schema.table_ WHERE condition | Deletes existing data from a table. | | INSERT | INSERT INTO _schema.table(column_name(s))_ VALUES(_value(s)_) | Inserts new records into a table. | | UPDATE | UPDATE _schema.table_ SET _column_1 = value_1, column_2 = value_2, ....,_ WHERE _condition_ | Alters existing records in a table. | diff --git a/site/versioned_docs/version-4.2/developers/sql-guide/index.md b/site/versioned_docs/version-4.2/developers/sql-guide/index.md index ae274bd3..9d5246c1 100644 --- a/site/versioned_docs/version-4.2/developers/sql-guide/index.md +++ b/site/versioned_docs/version-4.2/developers/sql-guide/index.md @@ -72,9 +72,9 @@ DELETE FROM dev.dog HarperDB allows developers to join any number of tables and currently supports the following join types: -* INNER JOIN LEFT -* INNER JOIN LEFT -* OUTER JOIN +- INNER JOIN LEFT +- INNER JOIN LEFT +- OUTER JOIN Here’s a basic example joining two tables from our Get Started example- joining a dogs table with a breeds table: diff --git a/site/versioned_docs/version-4.2/developers/sql-guide/json-search.md b/site/versioned_docs/version-4.2/developers/sql-guide/json-search.md index 204f2c67..9c45fb39 100644 --- a/site/versioned_docs/version-4.2/developers/sql-guide/json-search.md +++ b/site/versioned_docs/version-4.2/developers/sql-guide/json-search.md @@ -4,11 +4,11 @@ title: SQL JSON Search # SQL JSON Search -HarperDB automatically indexes all top level attributes in a row / object written to a table. However, any attributes which hold JSON data do not have their nested attributes indexed. In order to make searching and/or transforming these JSON documents easy, HarperDB offers a special SQL function called SEARCH\_JSON. The SEARCH\_JSON function works in SELECT & WHERE clauses allowing queries to perform powerful filtering on any element of your JSON by implementing the [JSONata library](https://docs.jsonata.org/overview.html) into our SQL engine. +HarperDB automatically indexes all top level attributes in a row / object written to a table. However, any attributes which hold JSON data do not have their nested attributes indexed. In order to make searching and/or transforming these JSON documents easy, HarperDB offers a special SQL function called SEARCH_JSON. The SEARCH_JSON function works in SELECT & WHERE clauses allowing queries to perform powerful filtering on any element of your JSON by implementing the [JSONata library](https://docs.jsonata.org/overview.html) into our SQL engine. ## Syntax -SEARCH\_JSON(_expression, attribute_) +SEARCH_JSON(_expression, attribute_) Executes the supplied string _expression_ against data of the defined top level _attribute_ for each row. The expression both filters and defines output from the JSON document. @@ -20,14 +20,14 @@ Here are two records in the database: ```json [ - { - "id": 1, - "name": ["Harper", "Penny"] - }, - { - "id": 2, - "name": ["Penny"] - } + { + "id": 1, + "name": ["Harper", "Penny"] + }, + { + "id": 2, + "name": ["Penny"] + } ] ``` @@ -60,37 +60,37 @@ A sample of this data from the movie The Avengers looks like ```json [ - { - "cast_id": 46, - "character": "Tony Stark / Iron Man", - "credit_id": "52fe4495c3a368484e02b251", - "gender": "male", - "id": 3223, - "name": "Robert Downey Jr.", - "order": 0 - }, - { - "cast_id": 2, - "character": "Steve Rogers / Captain America", - "credit_id": "52fe4495c3a368484e02b19b", - "gender": "male", - "id": 16828, - "name": "Chris Evans", - "order": 1 - }, - { - "cast_id": 307, - "character": "Bruce Banner / The Hulk", - "credit_id": "5e85e8083344c60015411cfa", - "gender": "male", - "id": 103, - "name": "Mark Ruffalo", - "order": 2 - } + { + "cast_id": 46, + "character": "Tony Stark / Iron Man", + "credit_id": "52fe4495c3a368484e02b251", + "gender": "male", + "id": 3223, + "name": "Robert Downey Jr.", + "order": 0 + }, + { + "cast_id": 2, + "character": "Steve Rogers / Captain America", + "credit_id": "52fe4495c3a368484e02b19b", + "gender": "male", + "id": 16828, + "name": "Chris Evans", + "order": 1 + }, + { + "cast_id": 307, + "character": "Bruce Banner / The Hulk", + "credit_id": "5e85e8083344c60015411cfa", + "gender": "male", + "id": 103, + "name": "Mark Ruffalo", + "order": 2 + } ] ``` -Let’s break down the SEARCH\_JSON function call in the SELECT: +Let’s break down the SEARCH_JSON function call in the SELECT: ``` SEARCH_JSON( @@ -113,7 +113,7 @@ SEARCH_JSON( ) ``` -The first argument passed to SEARCH\_JSON is the expression to execute against the second argument which is the cast attribute on the credits table. This expression will execute for every row. Looking into the expression it starts with “$\[…]” this tells the expression to iterate all elements of the cast array. +The first argument passed to SEARCH_JSON is the expression to execute against the second argument which is the cast attribute on the credits table. This expression will execute for every row. Looking into the expression it starts with “$\[…]” this tells the expression to iterate all elements of the cast array. Then the expression tells the function to only return entries where the name attribute matches any of the actors defined in the array: @@ -127,22 +127,22 @@ So far, we’ve iterated the array and filtered out rows, but we also want the r ```json [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - } + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + } ] ``` -Just having the SEARCH\_JSON function in our SELECT is powerful, but given our criteria it would still return every other movie that doesn’t have our matching actors, in order to filter out the movies we do not want we also use SEARCH\_JSON in the WHERE clause. +Just having the SEARCH_JSON function in our SELECT is powerful, but given our criteria it would still return every other movie that doesn’t have our matching actors, in order to filter out the movies we do not want we also use SEARCH_JSON in the WHERE clause. This function call in the WHERE clause is similar, but we don’t need to perform the same transformation as occurred in the SELECT: @@ -168,6 +168,6 @@ SEARCH_JSON( As seen above we execute the same name filter against the cast array, the primary difference is we are wrapping the filtered results in $count(…). As it looks this returns a count of the results back which we then use against our SQL comparator of >= 2. -To see further SEARCH\_JSON examples in action view our Postman Collection that provides a [sample schema & data with query examples](../operations-api/advanced-json-sql-examples). +To see further SEARCH_JSON examples in action view our Postman Collection that provides a [sample schema & data with query examples](../operations-api/advanced-json-sql-examples). To learn more about how to build expressions check out the JSONata documentation: [https://docs.jsonata.org/overview](https://docs.jsonata.org/overview) diff --git a/site/versioned_docs/version-4.2/developers/sql-guide/reserved-word.md b/site/versioned_docs/version-4.2/developers/sql-guide/reserved-word.md index bcefa00a..7add41ff 100644 --- a/site/versioned_docs/version-4.2/developers/sql-guide/reserved-word.md +++ b/site/versioned_docs/version-4.2/developers/sql-guide/reserved-word.md @@ -4,7 +4,7 @@ title: HarperDB SQL Reserved Words # HarperDB SQL Reserved Words -This is a list of reserved words in the SQL Parser. Use of these words or symbols may result in unexpected behavior or inaccessible tables/attributes. If any of these words must be used, any SQL call referencing a schema, table, or attribute must have backticks (`…`) or brackets ([…]) around the variable. +This is a list of reserved words in the SQL Parser. Use of these words or symbols may result in unexpected behavior or inaccessible tables/attributes. If any of these words must be used, any SQL call referencing a schema, table, or attribute must have backticks (`…`) or brackets ([…]) around the variable. For Example, for a table called ASSERT in the dev schema, a SQL select on that table would look like: @@ -20,184 +20,184 @@ SELECT * from dev.[ASSERT] ### RESERVED WORD LIST -* ABSOLUTE -* ACTION -* ADD -* AGGR -* ALL -* ALTER -* AND -* ANTI -* ANY -* APPLY -* ARRAY -* AS -* ASSERT -* ASC -* ATTACH -* AUTOINCREMENT -* AUTO_INCREMENT -* AVG -* BEGIN -* BETWEEN -* BREAK -* BY -* CALL -* CASE -* CAST -* CHECK -* CLASS -* CLOSE -* COLLATE -* COLUMN -* COLUMNS -* COMMIT -* CONSTRAINT -* CONTENT -* CONTINUE -* CONVERT -* CORRESPONDING -* COUNT -* CREATE -* CROSS -* CUBE -* CURRENT_TIMESTAMP -* CURSOR -* DATABASE -* DECLARE -* DEFAULT -* DELETE -* DELETED -* DESC -* DETACH -* DISTINCT -* DOUBLEPRECISION -* DROP -* ECHO -* EDGE -* END -* ENUM -* ELSE -* EXCEPT -* EXISTS -* EXPLAIN -* FALSE -* FETCH -* FIRST -* FOREIGN -* FROM -* GO -* GRAPH -* GROUP -* GROUPING -* HAVING -* HDB_HASH -* HELP -* IF -* IDENTITY -* IS -* IN -* INDEX -* INNER -* INSERT -* INSERTED -* INTERSECT -* INTO -* JOIN -* KEY -* LAST -* LET -* LEFT -* LIKE -* LIMIT -* LOOP -* MATCHED -* MATRIX -* MAX -* MERGE -* MIN -* MINUS -* MODIFY -* NATURAL -* NEXT -* NEW -* NOCASE -* NO -* NOT -* NULL -* OFF -* ON -* ONLY -* OFFSET -* OPEN -* OPTION -* OR -* ORDER -* OUTER -* OVER -* PATH -* PARTITION -* PERCENT -* PLAN -* PRIMARY -* PRINT -* PRIOR -* QUERY -* READ -* RECORDSET -* REDUCE -* REFERENCES -* RELATIVE -* REPLACE -* REMOVE -* RENAME -* REQUIRE -* RESTORE -* RETURN -* RETURNS -* RIGHT -* ROLLBACK -* ROLLUP -* ROW -* SCHEMA -* SCHEMAS -* SEARCH -* SELECT -* SEMI -* SET -* SETS -* SHOW -* SOME -* SOURCE -* STRATEGY -* STORE -* SYSTEM -* SUM -* TABLE -* TABLES -* TARGET -* TEMP -* TEMPORARY -* TEXTSTRING -* THEN -* TIMEOUT -* TO -* TOP -* TRAN -* TRANSACTION -* TRIGGER -* TRUE -* TRUNCATE -* UNION -* UNIQUE -* UPDATE -* USE -* USING -* VALUE -* VERTEX -* VIEW -* WHEN -* WHERE -* WHILE -* WITH -* WORK +- ABSOLUTE +- ACTION +- ADD +- AGGR +- ALL +- ALTER +- AND +- ANTI +- ANY +- APPLY +- ARRAY +- AS +- ASSERT +- ASC +- ATTACH +- AUTOINCREMENT +- AUTO_INCREMENT +- AVG +- BEGIN +- BETWEEN +- BREAK +- BY +- CALL +- CASE +- CAST +- CHECK +- CLASS +- CLOSE +- COLLATE +- COLUMN +- COLUMNS +- COMMIT +- CONSTRAINT +- CONTENT +- CONTINUE +- CONVERT +- CORRESPONDING +- COUNT +- CREATE +- CROSS +- CUBE +- CURRENT_TIMESTAMP +- CURSOR +- DATABASE +- DECLARE +- DEFAULT +- DELETE +- DELETED +- DESC +- DETACH +- DISTINCT +- DOUBLEPRECISION +- DROP +- ECHO +- EDGE +- END +- ENUM +- ELSE +- EXCEPT +- EXISTS +- EXPLAIN +- FALSE +- FETCH +- FIRST +- FOREIGN +- FROM +- GO +- GRAPH +- GROUP +- GROUPING +- HAVING +- HDB_HASH +- HELP +- IF +- IDENTITY +- IS +- IN +- INDEX +- INNER +- INSERT +- INSERTED +- INTERSECT +- INTO +- JOIN +- KEY +- LAST +- LET +- LEFT +- LIKE +- LIMIT +- LOOP +- MATCHED +- MATRIX +- MAX +- MERGE +- MIN +- MINUS +- MODIFY +- NATURAL +- NEXT +- NEW +- NOCASE +- NO +- NOT +- NULL +- OFF +- ON +- ONLY +- OFFSET +- OPEN +- OPTION +- OR +- ORDER +- OUTER +- OVER +- PATH +- PARTITION +- PERCENT +- PLAN +- PRIMARY +- PRINT +- PRIOR +- QUERY +- READ +- RECORDSET +- REDUCE +- REFERENCES +- RELATIVE +- REPLACE +- REMOVE +- RENAME +- REQUIRE +- RESTORE +- RETURN +- RETURNS +- RIGHT +- ROLLBACK +- ROLLUP +- ROW +- SCHEMA +- SCHEMAS +- SEARCH +- SELECT +- SEMI +- SET +- SETS +- SHOW +- SOME +- SOURCE +- STRATEGY +- STORE +- SYSTEM +- SUM +- TABLE +- TABLES +- TARGET +- TEMP +- TEMPORARY +- TEXTSTRING +- THEN +- TIMEOUT +- TO +- TOP +- TRAN +- TRANSACTION +- TRIGGER +- TRUE +- TRUNCATE +- UNION +- UNIQUE +- UPDATE +- USE +- USING +- VALUE +- VERTEX +- VIEW +- WHEN +- WHERE +- WHILE +- WITH +- WORK diff --git a/site/versioned_docs/version-4.2/developers/sql-guide/sql-geospatial-functions.md b/site/versioned_docs/version-4.2/developers/sql-guide/sql-geospatial-functions.md index 73c9632e..b4014a28 100644 --- a/site/versioned_docs/version-4.2/developers/sql-guide/sql-geospatial-functions.md +++ b/site/versioned_docs/version-4.2/developers/sql-guide/sql-geospatial-functions.md @@ -6,13 +6,11 @@ title: SQL Geospatial Functions HarperDB geospatial features require data to be stored in a single column using the [GeoJSON standard](https://geojson.org/), a standard commonly used in geospatial technologies. Geospatial functions are available to be used in SQL statements. - - If you are new to GeoJSON you should check out the full specification here: [https://geojson.org/](https://geojson.org/). There are a few important things to point out before getting started. -1) All GeoJSON coordinates are stored in `[longitude, latitude]` format. -2) Coordinates or GeoJSON geometries must be passed as string when written directly in a SQL statement. -3) Note if you are using Postman for you testing. Due to limitations in the Postman client, you will need to escape quotes in your strings and your SQL will need to be passed on a single line. +1. All GeoJSON coordinates are stored in `[longitude, latitude]` format. +2. Coordinates or GeoJSON geometries must be passed as string when written directly in a SQL statement. +3. Note if you are using Postman for you testing. Due to limitations in the Postman client, you will need to escape quotes in your strings and your SQL will need to be passed on a single line. In the examples contained in the left-hand navigation, schema and table names may change, but all GeoJSON data will be stored in a column named geo_data. @@ -27,7 +25,7 @@ geoArea(_geoJSON_) ### Parameters | Parameter | Description | -|-----------|---------------------------------| +| --------- | ------------------------------- | | geoJSON | Required. One or more features. | #### Example 1 @@ -68,10 +66,10 @@ geoLength(_geoJSON_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| geoJSON | Required. GeoJSON to measure. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| geoJSON | Required. GeoJSON to measure. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 @@ -112,10 +110,10 @@ geoDifference(_polygon1, polygon2_) ## Parameters -| Parameter | Description | -|------------|----------------------------------------------------------------------------| -| polygon1 | Required. Polygon or MultiPolygon GeoJSON feature. | -| polygon2 | Required. Polygon or MultiPolygon GeoJSON feature to remove from polygon1. | +| Parameter | Description | +| --------- | -------------------------------------------------------------------------- | +| polygon1 | Required. Polygon or MultiPolygon GeoJSON feature. | +| polygon2 | Required. Polygon or MultiPolygon GeoJSON feature to remove from polygon1. | ### Example @@ -169,11 +167,11 @@ geoDistance(_point1, point2_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| point1 | Required. GeoJSON Point specifying the origin. | -| point2 | Required. GeoJSON Point specifying the destination. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| point1 | Required. GeoJSON Point specifying the origin. | +| point2 | Required. GeoJSON Point specifying the destination. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 @@ -204,12 +202,12 @@ geoNear(_point1, point2, distance_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| point1 | Required. GeoJSON Point specifying the origin. | -| point2 | Required. GeoJSON Point specifying the destination. | -| distance | Required. The maximum distance in units as an integer or decimal. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| point1 | Required. GeoJSON Point specifying the origin. | +| point2 | Required. GeoJSON Point specifying the destination. | +| distance | Required. The maximum distance in units as an integer or decimal. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 @@ -242,10 +240,10 @@ geoContains(_geo1, geo2_) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------| -| geo1 | Required. Polygon or MultiPolygon GeoJSON feature. | -| geo2 | Required. Polygon or MultiPolygon GeoJSON feature tested to be contained by geo1. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------- | +| geo1 | Required. Polygon or MultiPolygon GeoJSON feature. | +| geo2 | Required. Polygon or MultiPolygon GeoJSON feature tested to be contained by geo1. | ### Example 1 @@ -304,15 +302,18 @@ WHERE geoContains(geo_data, '{ Determines if two GeoJSON features are the same type and have identical X,Y coordinate values. For more information see [https://developers.arcgis.com/documentation/spatial-references/](https://developers.arcgis.com/documentation/spatial-references/). Returns a Boolean. ## Syntax + geoEqual(_geo1_, _geo2_) ## Parameters -| Parameter | Description | -|------------|----------------------------------------| -| geo1 | Required. GeoJSON geometry or feature. | -| geo2 | Required. GeoJSON geometry or feature. | + +| Parameter | Description | +| --------- | -------------------------------------- | +| geo1 | Required. GeoJSON geometry or feature. | +| geo2 | Required. GeoJSON geometry or feature. | ### Example + Find HarperDB Headquarters within all locations within the database. ``` @@ -339,18 +340,22 @@ WHERE geoEqual(geo_data, '{ ``` # geoCrosses + Determines if the geometries cross over each other. Returns boolean. ## Syntax + geoCrosses(_geo1, geo2_) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------| -| geo1 | Required. GeoJSON geometry or feature. | -| geo2 | Required. GeoJSON geometry or feature. | + +| Parameter | Description | +| --------- | -------------------------------------- | +| geo1 | Required. GeoJSON geometry or feature. | +| geo2 | Required. GeoJSON geometry or feature. | ### Example + Find all locations that cross over a highway. ``` @@ -384,16 +389,19 @@ WHERE geoCrosses( Converts a series of coordinates into a GeoJSON of the specified type. ## Syntax + geoConvert(_coordinates, geo_type_[, _properties_]) ## Parameters -| Parameter | Description | -|--------------|------------------------------------------------------------------------------------------------------------------------------------| -| coordinates | Required. One or more coordinates | -| geo_type | Required. GeoJSON geometry type. Options are ‘point’, ‘lineString’, ‘multiLineString’, ‘multiPoint’, ‘multiPolygon’, and ‘polygon’ | -| properties | Optional. Escaped JSON array with properties to be added to the GeoJSON output. | + +| Parameter | Description | +| ----------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| coordinates | Required. One or more coordinates | +| geo_type | Required. GeoJSON geometry type. Options are ‘point’, ‘lineString’, ‘multiLineString’, ‘multiPoint’, ‘multiPolygon’, and ‘polygon’ | +| properties | Optional. Escaped JSON array with properties to be added to the GeoJSON output. | ### Example + Convert a given coordinate into a GeoJSON point with specified properties. ``` diff --git a/site/versioned_docs/version-4.2/getting-started.md b/site/versioned_docs/version-4.2/getting-started.md index 24fa7e74..af4c77bb 100644 --- a/site/versioned_docs/version-4.2/getting-started.md +++ b/site/versioned_docs/version-4.2/getting-started.md @@ -21,7 +21,7 @@ Here we installed HarperDB globally (and we recommend this) to make it easy to r You can run HarperDB by running: ```javascript -harperdb +harperdb; ``` You can now use HarperDB as a standalone database. You can also create a cloud instance (see below), which is also an easy way to get started. diff --git a/site/versioned_docs/version-4.2/technical-details/_category_.json b/site/versioned_docs/version-4.2/technical-details/_category_.json index 69ce80a6..b965ef06 100644 --- a/site/versioned_docs/version-4.2/technical-details/_category_.json +++ b/site/versioned_docs/version-4.2/technical-details/_category_.json @@ -1,12 +1,10 @@ { - "label": "Technical Details", - "position": 4, - "link": { - "type": "generated-index", - "title": "Technical Details Documentation", - "description": "Reference documentation and technical specifications", - "keywords": [ - "technical-details" - ] - } -} \ No newline at end of file + "label": "Technical Details", + "position": 4, + "link": { + "type": "generated-index", + "title": "Technical Details Documentation", + "description": "Reference documentation and technical specifications", + "keywords": ["technical-details"] + } +} diff --git a/site/versioned_docs/version-4.2/technical-details/reference/analytics.md b/site/versioned_docs/version-4.2/technical-details/reference/analytics.md index 7b475176..c1975c66 100644 --- a/site/versioned_docs/version-4.2/technical-details/reference/analytics.md +++ b/site/versioned_docs/version-4.2/technical-details/reference/analytics.md @@ -8,7 +8,7 @@ HarperDB provides extensive telemetry and analytics data to help monitor the sta HarperDB collects statistics for all operations, URL endpoints, and messaging topics, aggregating information by thread, operation, resource, and methods, in real-time. These statistics are logged in the `hdb_raw_analytics` and `hdb_analytics` table in the `system` database. -There are two "levels" of analytics in the HarperDB analytics table: the first is the immediate level of raw direct logging of real-time statistics. These analytics entries are recorded once a second (when there is activity) by each thread, and include all recorded activity in the last second, along with system resource information. The records have a primary key that is the timestamp in milliseconds since epoch. This can be queried (with `superuser` permission) using the search\_by\_conditions operation (this will search for 10 seconds worth of analytics) on the `hdb_raw_analytics` table: +There are two "levels" of analytics in the HarperDB analytics table: the first is the immediate level of raw direct logging of real-time statistics. These analytics entries are recorded once a second (when there is activity) by each thread, and include all recorded activity in the last second, along with system resource information. The records have a primary key that is the timestamp in milliseconds since epoch. This can be queried (with `superuser` permission) using the search_by_conditions operation (this will search for 10 seconds worth of analytics) on the `hdb_raw_analytics` table: ``` POST http:/localhost:9925 @@ -104,14 +104,14 @@ And a summary record looks like: The following are general resource usage statistics that are tracked: -* memory - This includes RSS, heap, buffer and external data usage. -* utilization - How much of the time the worker was processing requests. -* mqtt-connections - The number of MQTT connections. +- memory - This includes RSS, heap, buffer and external data usage. +- utilization - How much of the time the worker was processing requests. +- mqtt-connections - The number of MQTT connections. The following types of information is tracked for each HTTP request: -* success - How many requests returned a successful response (20x response code). TTFB - Time to first byte in the response to the client. -* transfer - Time to finish the transfer of the data to the client. -* bytes-sent - How many bytes of data were sent to the client. +- success - How many requests returned a successful response (20x response code). TTFB - Time to first byte in the response to the client. +- transfer - Time to finish the transfer of the data to the client. +- bytes-sent - How many bytes of data were sent to the client. Requests are categorized by operation name, for the operations API, by the resource (name) with the REST API, and by command for the MQTT interface. diff --git a/site/versioned_docs/version-4.2/technical-details/reference/architecture.md b/site/versioned_docs/version-4.2/technical-details/reference/architecture.md index f2881d3c..5bbb1e47 100644 --- a/site/versioned_docs/version-4.2/technical-details/reference/architecture.md +++ b/site/versioned_docs/version-4.2/technical-details/reference/architecture.md @@ -38,5 +38,5 @@ HarperDB's architecture consists of resources, which includes tables and user de │ │ │ │ │ └────────────────┘ │ │ │ - └────────────────────────────────────────┘ + └────────────────────────────────────────┘ ``` diff --git a/site/versioned_docs/version-4.2/technical-details/reference/dynamic-schema.md b/site/versioned_docs/version-4.2/technical-details/reference/dynamic-schema.md index 33be93bb..54049a2c 100644 --- a/site/versioned_docs/version-4.2/technical-details/reference/dynamic-schema.md +++ b/site/versioned_docs/version-4.2/technical-details/reference/dynamic-schema.md @@ -16,8 +16,8 @@ HarperDB databases hold a collection of tables together in a single file that ar HarperDB tables group records together with a common data pattern. To create a table users must provide a table name and a primary key. -* **Table Name**: Used to identify the table. -* **Primary Key**: This is a required attribute that serves as the unique identifier for a record and is also known as the `hash_attribute` in HarperDB operations API. +- **Table Name**: Used to identify the table. +- **Primary Key**: This is a required attribute that serves as the unique identifier for a record and is also known as the `hash_attribute` in HarperDB operations API. ## Primary Key @@ -31,8 +31,8 @@ With tables that are using dynamic schemas, additional attributes are reflexivel HarperDB automatically creates two audit attributes used on each record if the table is created without a schema. -* `__createdtime__`: The time the record was created in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. -* `__updatedtime__`: The time the record was updated in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. +- `__createdtime__`: The time the record was created in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. +- `__updatedtime__`: The time the record was updated in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. ### Dynamic Schema Example @@ -64,7 +64,7 @@ At this point the table does not have structure beyond what we provided, so the **dev.dog** -![](/img/v4.2/reference/dynamic\_schema\_2\_create\_table.png.webp) +![](/img/v4.2/reference/dynamic_schema_2_create_table.png.webp) **Insert Record** @@ -85,7 +85,7 @@ With a single record inserted and new attributes defined, our table now looks li **dev.dog** -![](/img/v4.2/reference/dynamic\_schema\_3\_insert\_record.png.webp) +![](/img/v4.2/reference/dynamic_schema_3_insert_record.png.webp) Indexes have been automatically created for `dog_name` and `owner_name` attributes. @@ -109,7 +109,7 @@ In this case, there is no change to the schema. Our table now looks like this: **dev.dog** -![](/img/v4.2/reference/dynamic\_schema\_4\_insert\_additional\_record.png.webp) +![](/img/v4.2/reference/dynamic_schema_4_insert_additional_record.png.webp) **Update Existing Record** @@ -130,7 +130,7 @@ Now we have a new attribute called `weight_lbs`. Our table now looks like this: **dev.dog** -![](/img/v4.2/reference/dynamic\_schema\_5\_update\_existing\_record.png.webp) +![](/img/v4.2/reference/dynamic_schema_5_update_existing_record.png.webp) **Query Table with SQL** @@ -145,4 +145,4 @@ Now if we query for all records where `weight_lbs` is `null` we expect to get ba This results in the expected two records being returned. -![](/img/v4.2/reference/dynamic\_schema\_6\_query\_table\_with\_sql.png.webp) +![](/img/v4.2/reference/dynamic_schema_6_query_table_with_sql.png.webp) diff --git a/site/versioned_docs/version-4.2/technical-details/reference/globals.md b/site/versioned_docs/version-4.2/technical-details/reference/globals.md index 68623f59..b7c91d8a 100644 --- a/site/versioned_docs/version-4.2/technical-details/reference/globals.md +++ b/site/versioned_docs/version-4.2/technical-details/reference/globals.md @@ -38,7 +38,7 @@ async function getRecord() { } ``` -It is recommended that you [define a schema](../../getting-started/) for all the tables that are required to exist in your application. This will ensure that the tables exist on the `tables` object. Also note that the property names follow a CamelCase convention for use in JavaScript and in the GraphQL Schemas, but these are translated to snake\_case for the actual table names, and converted back to CamelCase when added to the `tables` object. +It is recommended that you [define a schema](../../getting-started/) for all the tables that are required to exist in your application. This will ensure that the tables exist on the `tables` object. Also note that the property names follow a CamelCase convention for use in JavaScript and in the GraphQL Schemas, but these are translated to snake_case for the actual table names, and converted back to CamelCase when added to the `tables` object. ### `databases` @@ -73,8 +73,8 @@ This provides access to the HarperDB configuration object. This comes from the [ This records the provided value as a metric into HarperDB's analytics. HarperDB efficiently records and tracks these metrics and makes them available through [analytics API](./analytics). The values are aggregated and statistical information is computed when many operations are performed. The optional parameters can be used to group statistics. For the parameters, make sure you are not grouping on too fine of a level for useful aggregation. The parameters are: -* `value` - This is a numeric value for the metric that is being recorded. This can be a value measuring time or bytes, for example. -* `metric` - This is the name of the metric. -* `path` - This is an optional path (like a URL path). For a URL like /my-resource/, you would typically include a path of "my-resource", not including the id so you can group by all the requests to "my-resource" instead of individually aggregating by each individual id. -* `method` - Optional method to group by. -* `type` - Optional type to group by. +- `value` - This is a numeric value for the metric that is being recorded. This can be a value measuring time or bytes, for example. +- `metric` - This is the name of the metric. +- `path` - This is an optional path (like a URL path). For a URL like /my-resource/, you would typically include a path of "my-resource", not including the id so you can group by all the requests to "my-resource" instead of individually aggregating by each individual id. +- `method` - Optional method to group by. +- `type` - Optional type to group by. diff --git a/site/versioned_docs/version-4.2/technical-details/reference/headers.md b/site/versioned_docs/version-4.2/technical-details/reference/headers.md index c58bb7ec..3ddc8528 100644 --- a/site/versioned_docs/version-4.2/technical-details/reference/headers.md +++ b/site/versioned_docs/version-4.2/technical-details/reference/headers.md @@ -6,7 +6,7 @@ title: HarperDB Headers All HarperDB API responses include headers that are important for interoperability and debugging purposes. The following headers are returned with all HarperDB API responses: -| Key | Example Value | Description | -|-------------------|------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| -| server-timing | db;dur=7.165 | This reports the duration of the operation, in milliseconds. This follows the standard for Server-Timing and can be consumed by network monitoring tools. | -| content-type | application/json | This reports the MIME type of the returned content, which is negotiated based on the requested content type in the Accept header. | +| Key | Example Value | Description | +| ------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| server-timing | db;dur=7.165 | This reports the duration of the operation, in milliseconds. This follows the standard for Server-Timing and can be consumed by network monitoring tools. | +| content-type | application/json | This reports the MIME type of the returned content, which is negotiated based on the requested content type in the Accept header. | diff --git a/site/versioned_docs/version-4.2/technical-details/reference/index.md b/site/versioned_docs/version-4.2/technical-details/reference/index.md index e9a6ebf9..e893988b 100644 --- a/site/versioned_docs/version-4.2/technical-details/reference/index.md +++ b/site/versioned_docs/version-4.2/technical-details/reference/index.md @@ -6,11 +6,11 @@ title: Reference This section contains technical details and reference materials for HarperDB. -* [Resource API](./resource) -* [Transactions](./transactions) -* [Storage Algorithm](./storage-algorithm) -* [Dynamic Schema](./dynamic-schema) -* [Headers](./headers) -* [Limitations](./limits) -* Content Types -* [Data Types](./data-types) +- [Resource API](./resource) +- [Transactions](./transactions) +- [Storage Algorithm](./storage-algorithm) +- [Dynamic Schema](./dynamic-schema) +- [Headers](./headers) +- [Limitations](./limits) +- Content Types +- [Data Types](./data-types) diff --git a/site/versioned_docs/version-4.2/technical-details/reference/limits.md b/site/versioned_docs/version-4.2/technical-details/reference/limits.md index ccad9d64..8ea207ba 100644 --- a/site/versioned_docs/version-4.2/technical-details/reference/limits.md +++ b/site/versioned_docs/version-4.2/technical-details/reference/limits.md @@ -30,4 +30,4 @@ Additionally, they cannot contain the first 31 non-printing characters. Spaces a **Attribute Maximum** -HarperDB limits the number of total indexed attributes across tables (including the primary key of each table) to 10,000 per database. \ No newline at end of file +HarperDB limits the number of total indexed attributes across tables (including the primary key of each table) to 10,000 per database. diff --git a/site/versioned_docs/version-4.2/technical-details/reference/resource.md b/site/versioned_docs/version-4.2/technical-details/reference/resource.md index 2da897fa..fbb54210 100644 --- a/site/versioned_docs/version-4.2/technical-details/reference/resource.md +++ b/site/versioned_docs/version-4.2/technical-details/reference/resource.md @@ -20,13 +20,13 @@ You can create classes that extend Resource to define your own data sources, typ export class MyExternalData extends Resource { get() { // fetch data from an external source, using our primary key - this.fetch(this.id) + this.fetch(this.id); } put(data) { // send the data into the external source } delete() { - // delete an entity in the external data source + // delete an entity in the external data source } subscribe(options) { // if the external data source is capable of real-time notification of changes, can subscribe @@ -52,7 +52,7 @@ export class MyTable extends tables.MyTable { super.put(data); } delete() { - super.delete(); + super.delete(); } post(data) { // providing a post handler (for HTTP POST requests) is a common way to create additional @@ -60,6 +60,7 @@ export class MyTable extends tables.MyTable { } } ``` + Make sure that if are extending and `export`ing your table with this class, that you remove the `@export` directive in the your schema, so that you aren't exporting the same table/class twice. ## Global Variables @@ -123,6 +124,7 @@ get(query) { ... } ``` + If `get` is called for a single record (for a request like `/Table/some-id`), the default action is to return `this` instance of the resource. If `get` is called on a collection (`/Table/?name=value`), the default action is to `search` and return an AsyncIterable of results. ### `search(query: Query)`: AsyncIterable @@ -169,11 +171,11 @@ The returned (promise resolves to) Subscription object is an `AsyncIterable` tha The `subscriptionRequest` object supports the following properties (all optional): -* `id` - The primary key of the record (or topic) that you want to subscribe to. If omitted, this will be a subscription to the whole table. -* `isCollection` - If this is enabled and the `id` was included, this will create a subscription to all the record updates/messages that are prefixed with the id. For example, a subscription request of `{id:'sub', isCollection: true}` would return events for any update with an id/topic of the form sub/\* (like `sub/1`). -* `startTime` - This will begin the subscription at a past point in time, returning all updates/messages since the start time (a catch-up of historical messages). This can be used to resume a subscription, getting all messages since the last subscription. -* `previousCount` - This specifies the number of previous updates/messages to deliver. For example, `previousCount: 10` would return the last ten messages. Note that `previousCount` can not be used in conjunction with `startTime`. -* `omitCurrent` - Indicates that the current (or retained) record should _not_ be immediately sent as the first update in the subscription (if no `startTime` or `previousCount` was used). By default, the current record is sent as the first update. +- `id` - The primary key of the record (or topic) that you want to subscribe to. If omitted, this will be a subscription to the whole table. +- `isCollection` - If this is enabled and the `id` was included, this will create a subscription to all the record updates/messages that are prefixed with the id. For example, a subscription request of `{id:'sub', isCollection: true}` would return events for any update with an id/topic of the form sub/\* (like `sub/1`). +- `startTime` - This will begin the subscription at a past point in time, returning all updates/messages since the start time (a catch-up of historical messages). This can be used to resume a subscription, getting all messages since the last subscription. +- `previousCount` - This specifies the number of previous updates/messages to deliver. For example, `previousCount: 10` would return the last ten messages. Note that `previousCount` can not be used in conjunction with `startTime`. +- `omitCurrent` - Indicates that the current (or retained) record should _not_ be immediately sent as the first update in the subscription (if no `startTime` or `previousCount` was used). By default, the current record is sent as the first update. ### `connect(incomingMessages?: AsyncIterable): AsyncIterable` @@ -215,23 +217,23 @@ Returns the context for this resource. The context contains information about th The `Context` object has the following (potential) properties: -* `user` - This is the user object, which includes information about the username, role, and authorizations. -* `transaction` - The current transaction If the current method was triggered by an HTTP request, the following properties are available: -* `lastModified` - This value is used to indicate the last modified or updated timestamp of any resource(s) that are accessed and will inform the response's `ETag` (or `Last-Modified`) header. This can be updated by application code if it knows that modification should cause this timestamp to be updated. +- `user` - This is the user object, which includes information about the username, role, and authorizations. +- `transaction` - The current transaction If the current method was triggered by an HTTP request, the following properties are available: +- `lastModified` - This value is used to indicate the last modified or updated timestamp of any resource(s) that are accessed and will inform the response's `ETag` (or `Last-Modified`) header. This can be updated by application code if it knows that modification should cause this timestamp to be updated. When a resource gets a request through HTTP, the request object is the context, which has the following properties: -* `url` - The local path/URL of the request (this will not include the protocol or host name, but will start at the path and includes the query string). -* `method` - The method of the HTTP request. -* `headers` - This is an object with the headers that were included in the HTTP request. You can access headers by calling `context.headers.get(headerName)`. -* `responseHeaders` - This is an object with the headers that will be included in the HTTP response. You can set headers by calling `context.responseHeaders.set(headerName, value)`. -* `pathname` - This provides the path part of the URL (no querystring). -* `host` - This provides the host name of the request (from the `Host` header). -* `ip` - This provides the ip address of the client that made the request. +- `url` - The local path/URL of the request (this will not include the protocol or host name, but will start at the path and includes the query string). +- `method` - The method of the HTTP request. +- `headers` - This is an object with the headers that were included in the HTTP request. You can access headers by calling `context.headers.get(headerName)`. +- `responseHeaders` - This is an object with the headers that will be included in the HTTP response. You can set headers by calling `context.responseHeaders.set(headerName, value)`. +- `pathname` - This provides the path part of the URL (no querystring). +- `host` - This provides the host name of the request (from the `Host` header). +- `ip` - This provides the ip address of the client that made the request. When a resource is accessed as a data source: -* `requestContext` - For resources that are acting as a data source for another resource, this provides access to the context of the resource that is making a request for data from the data source resource. +- `requestContext` - For resources that are acting as a data source for another resource, this provides access to the context of the resource that is making a request for data from the data source resource. ### `operation(operationObject: Object, authorize?: boolean): Promise` @@ -252,7 +254,7 @@ The get, put, delete, subscribe, and connect methods all have static equivalents This will retrieve a resource instance by id. For example, if you want to retrieve comments by id in the retrieval of a blog post you could do: ```javascript -const { MyTable } = tables; +const { MyTable } = tables; ... // in class: async get() { @@ -264,16 +266,19 @@ const { MyTable } = tables; ``` Type definition for `Id`: + ``` Id = string|number|array ``` ### `put(record: object, context?: Resource|Context): Promise` + ### `put(id: Id, record: object, context?: Resource|Context): Promise` This will save the provided record or data to this resource. This will fully replace the existing record. Make sure to `await` this function to ensure it finishes execution within the surrounding transaction. ### `patch(recordUpdate: object, context?: Resource|Context): Promise` + ### `patch(id: Id, recordUpdate: object, context?: Resource|Context): Promise` This will save the provided updates to the record. The `recordUpdate` object's properties will be applied to the existing record, overwriting the existing records properties, and preserving any properties in the record that are not specified in the `recordUpdate` object. Make sure to `await` this function to ensure it finishes execution within the surrounding transaction. @@ -283,6 +288,7 @@ This will save the provided updates to the record. The `recordUpdate` object's p Deletes this resource's record or data. Make sure to `await` this function to ensure it finishes execution within the surrounding transaction. ### `publish(message: object, context?: Resource|Context): Promise` + ### `publish(topic: Id, message: object, context?: Resource|Context): Promise` Publishes the given message to the record entry specified by the id in the context. Make sure to `await` this function to ensure it finishes execution within the surrounding transaction. @@ -323,6 +329,7 @@ This is called by static methods when they are responding to a URL (from HTTP re ``` ### `isCollection(resource: Resource): boolean` + This returns a boolean indicating if the provide resource instance represents a collection (can return a query result) or a single record/entity. ### Context and Transactions @@ -341,10 +348,10 @@ const { Comment } = tables; export class BlogPost extends tables.BlogPost { post(comment) { // add a comment record to the comment table, using this resource as the source for the context - Comment.put(comment, this); + Comment.put(comment, this); this.comments.push(comment.id); // add the id for the record to our array of comment ids // Both of these actions will be committed atomically as part of the same transaction - } + } } ``` @@ -354,14 +361,14 @@ Please see the [transaction documentation](./transactions) for more information The `get`/`search` methods accept a Query object that can be used to specify a query for data. The query is an object that has the following properties, which are all optional: -* `conditions`: This is an array of objects that specify the conditions to use the match records (if conditions are omitted or it is an empty array, this is a search for everything in the table). Each condition object has the following properties: - * `attribute`: Name of the property/attribute to match on. - * `value`: The value to match. - * `comparator`: This can specify how the value is compared. This defaults to "equals", but can also be "greater\_than", "greater\_than\_equal", "less\_than", "less\_than\_equal", "starts\_with", "contains", "ends\_with", "between", and "not_equal". -* `operator`: Specifies if the conditions should be applied as an `"and"` (records must match all conditions), or as an "or" (records must match at least one condition). This defaults to `"and"`. -* `limit`: This specifies the limit of the number of records that should be returned from the query. -* `offset`: This specifies the number of records that should be skipped prior to returning records in the query. This is often used with `limit` to implement "paging" of records. -* `select`: This specifies the specific properties that should be included in each record that is returned. This can be a string value, to specify that the value of the specified property should be returned for each iteration/element in the results. This can be an array, to specify a set of properties that should be included in the returned objects. The array can specify an `select.asArray = true` property and the query results will return a set of arrays of values of the specified properties instead of objects; this can be used to return more compact results. +- `conditions`: This is an array of objects that specify the conditions to use the match records (if conditions are omitted or it is an empty array, this is a search for everything in the table). Each condition object has the following properties: + - `attribute`: Name of the property/attribute to match on. + - `value`: The value to match. + - `comparator`: This can specify how the value is compared. This defaults to "equals", but can also be "greater_than", "greater_than_equal", "less_than", "less_than_equal", "starts_with", "contains", "ends_with", "between", and "not_equal". +- `operator`: Specifies if the conditions should be applied as an `"and"` (records must match all conditions), or as an "or" (records must match at least one condition). This defaults to `"and"`. +- `limit`: This specifies the limit of the number of records that should be returned from the query. +- `offset`: This specifies the number of records that should be skipped prior to returning records in the query. This is often used with `limit` to implement "paging" of records. +- `select`: This specifies the specific properties that should be included in each record that is returned. This can be a string value, to specify that the value of the specified property should be returned for each iteration/element in the results. This can be an array, to specify a set of properties that should be included in the returned objects. The array can specify an `select.asArray = true` property and the query results will return a set of arrays of values of the specified properties instead of objects; this can be used to return more compact results. The query results are returned as an `AsyncIterable`. In order to access the elements of the query results, you must use a `for await` loop (it does _not_ return an array, you can not access the results by index). @@ -377,11 +384,12 @@ let results = Product.search({ offset: 20, limit: 10, select: ['id', 'name', 'price', 'rating'], -}) +}); for await (let record of results) { // iterate through each record in the query results } ``` + `AsyncIterable`s can be returned from resource methods, and will be properly serialized in responses. When a query is performed, this will open/reserve a read transaction until the query results are iterated, either through your own `for await` loop or through serialization. Failing to iterate the results this will result in a long-lived read transaction which can degrade performance (including write performance), and may eventually be aborted. ### Interacting with the Resource Data Model @@ -404,7 +412,7 @@ export class CustomProduct extends Product { get(query) { let name = this.name; // this is the name of the current product let rating = this.rating; // this is the rating of the current product - this.rating = 3 // we can also modify the rating for the current instance + this.rating = 3; // we can also modify the rating for the current instance // (with a get this won't be saved by default, but will be used when serialized) return super.get(query); } @@ -417,8 +425,7 @@ Likewise, we can interact with resource instances in the same way when retrievin let product1 = await Product.get(1); let name = product1.name; // this is the name of the product with a primary key of 1 let rating = product1.rating; // this is the rating of the product with a primary key of 1 -product1.rating = 3 // modify the rating for this instance (this will be saved without a call to update()) - +product1.rating = 3; // modify the rating for this instance (this will be saved without a call to update()) ``` If there are additional properties on (some) products that aren't defined in the schema, we can still access them through the resource instance, but since they aren't declared, there won't be getter/setter definition for direct property access, but we can access properties with the `get(propertyName)` method and modify properties with the `set(propertyName, value)` method: @@ -426,7 +433,7 @@ If there are additional properties on (some) products that aren't defined in the ```javascript let product1 = await Product.get(1); let additionalInformation = product1.get('additionalInformation'); // get the additionalInformation property value even though it isn't defined in the schema -product1.set('newProperty', 'some value'); // we can assign any properties we want with set +product1.set('newProperty', 'some value'); // we can assign any properties we want with set ``` And likewise, we can do this in an instance method, although you will probably want to use super.get()/set() so you don't have to write extra logic to avoid recursion: @@ -435,7 +442,7 @@ And likewise, we can do this in an instance method, although you will probably w export class CustomProduct extends Product { get(query) { let additionalInformation = super.get('additionalInformation'); // get the additionalInformation property value even though it isn't defined in the schema - super.set('newProperty', 'some value'); // we can assign any properties we want with set + super.set('newProperty', 'some value'); // we can assign any properties we want with set } } ``` diff --git a/site/versioned_docs/version-4.2/technical-details/reference/transactions.md b/site/versioned_docs/version-4.2/technical-details/reference/transactions.md index 0b2e54ae..984b0a71 100644 --- a/site/versioned_docs/version-4.2/technical-details/reference/transactions.md +++ b/site/versioned_docs/version-4.2/technical-details/reference/transactions.md @@ -18,7 +18,7 @@ This executes the callback in a transaction, providing a context that can be use ```javascript import { tables } from 'harperdb'; -const { MyTable } = tables; +const { MyTable } = tables; if (isMainThread) // only on main thread setInterval(async () => { let someData = await (await fetch(... some URL ...)).json(); @@ -34,7 +34,7 @@ You can provide your own context object for the transaction to attach to. If you Once the transaction callback is completed (for non-nested transaction calls), the transaction will commit, and if the callback throws an error, the transaction will abort. However, the callback is called with the `transaction` object, which also provides the following methods and property: -* `commit(): Promise` - Commits the current transaction. The transaction will be committed once the returned promise resolves. -* `abort(): void` - Aborts the current transaction and resets it. -* `resetReadSnapshot(): void` - Resets the read snapshot for the transaction, resetting to the latest data in the database. -* `timestamp: number` - This is the timestamp associated with the current transaction. +- `commit(): Promise` - Commits the current transaction. The transaction will be committed once the returned promise resolves. +- `abort(): void` - Aborts the current transaction and resets it. +- `resetReadSnapshot(): void` - Resets the read snapshot for the transaction, resetting to the latest data in the database. +- `timestamp: number` - This is the timestamp associated with the current transaction. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/End-of-Life.md b/site/versioned_docs/version-4.2/technical-details/release-notes/End-of-Life.md index ca15f713..86853d5e 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/End-of-Life.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/End-of-Life.md @@ -7,7 +7,7 @@ title: HarperDB Software Lifecycle Schedules The lifecycle schedules below form a part of HarperDB’s Support Policies. They include Major Releases and Minor Release that have reached their end of life date in the past 3 years. | **Release** | **Release Date** | **End of Life Date** | -|-------------|------------------|----------------------| +| ----------- | ---------------- | -------------------- | | 3.2 | 6/22 | 6/25 | | 3.3 | 9/22 | 9/25 | | 4.0 | 1/23 | 1/26 | diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/index.md b/site/versioned_docs/version-4.2/technical-details/release-notes/index.md index f44555ef..63af7d85 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/index.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/index.md @@ -70,7 +70,7 @@ title: Release Notes [3.0.0 Monkey](./v3-monkey/3.0.0) -*** +--- [Meet Penny](../../technical-details/release-notes/v2-penny) Our 2nd Release Pup @@ -86,7 +86,7 @@ title: Release Notes [2.1.1 Penny](./v2-penny/2.1.1) -*** +--- [Meet Alby](../../technical-details/release-notes/v1-alby) Our 1st Release Pup diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.1.0.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.1.0.md index b42514a2..2256a825 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.1.0.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.1.0.md @@ -4,74 +4,69 @@ sidebar_position: 89899 --- ### HarperDB 1.1.0, Alby Release + 4/18/2018 **Features** -* Users & Roles: +- Users & Roles: + - Limit/Assign access to all HarperDB operations + + - Limit/Assign access to schemas, tables & attributes + + - Limit/Assign access to specific SQL operations (`INSERT`, `UPDATE`, `DELETE`, `SELECT`) - * Limit/Assign access to all HarperDB operations +- Enhanced SQL parser + - Added extensive ANSI SQL Support. + - Added Array function, which allows for converting relational data into Object/Hierarchical data + - `Distinct_Array` Function: allows for removing duplicates in the Array function. + - Enhanced SQL Validation: Improved validation around structure of SQL, validating the schema, etc.. + - 10x performance improvement on SQL statements. - * Limit/Assign access to schemas, tables & attributes +- Export Function: can now call a NoSQL/SQL search and have it export to CSV or JSON. - * Limit/Assign access to specific SQL operations (`INSERT`, `UPDATE`, `DELETE`, `SELECT`) - -* Enhanced SQL parser - - * Added extensive ANSI SQL Support. - - * Added Array function, which allows for converting relational data into Object/Hierarchical data - - * `Distinct_Array` Function: allows for removing duplicates in the Array function. - - * Enhanced SQL Validation: Improved validation around structure of SQL, validating the schema, etc.. - - * 10x performance improvement on SQL statements. - -* Export Function: can now call a NoSQL/SQL search and have it export to CSV or JSON. +- Added upgrade function to CLI -* Added upgrade function to CLI +- Added ability to perform bulk update from CSV -* Added ability to perform bulk update from CSV +- Created landing page for HarperDB. -* Created landing page for HarperDB. +- Added CORS support to HarperDB -* Added CORS support to HarperDB - **Fixes** -* Fixed memory leak in CSV bulk loads +- Fixed memory leak in CSV bulk loads -* Corrected error when attempting to perform a `SQL DELETE` +- Corrected error when attempting to perform a `SQL DELETE` -* Added further validation to NoSQL `UPDATE` to validate schema & table exist +- Added further validation to NoSQL `UPDATE` to validate schema & table exist -* Fixed install issue occurring when part of the install path does not exist, the install would silently fail. +- Fixed install issue occurring when part of the install path does not exist, the install would silently fail. -* Fixed issues with replicated data when one of the replicas is down +- Fixed issues with replicated data when one of the replicas is down -* Removed logging of initial user’s credentials during install +- Removed logging of initial user’s credentials during install -* Can now use reserved words as aliases in SQL +- Can now use reserved words as aliases in SQL -* Removed user(s) password in results when calling `list_users` +- Removed user(s) password in results when calling `list_users` -* Corrected forwarding of operations to other nodes in a cluster +- Corrected forwarding of operations to other nodes in a cluster -* Corrected lag in schema meta-data passing to other nodes in a cluster +- Corrected lag in schema meta-data passing to other nodes in a cluster -* Drop table & schema now move the table & schema or table to the trash folder under the Database folder for later permanent deletion. +- Drop table & schema now move the table & schema or table to the trash folder under the Database folder for later permanent deletion. -* Bulk inserts no longer halt the entire operation if n records already exist, instead the return includes the hashes of records that have been skipped. +- Bulk inserts no longer halt the entire operation if n records already exist, instead the return includes the hashes of records that have been skipped. -* Added ability to accept EULA from command line +- Added ability to accept EULA from command line -* Corrected `search_by_value` not searching on the correct attribute +- Corrected `search_by_value` not searching on the correct attribute -* Added ability to increase the timeout of a request by adding `SERVER_TIMEOUT_MS` to config/settings.js +- Added ability to increase the timeout of a request by adding `SERVER_TIMEOUT_MS` to config/settings.js -* Add error handling resulting from SQL calculations. +- Add error handling resulting from SQL calculations. -* Standardized error responses as JSON. +- Standardized error responses as JSON. -* Corrected internal process generation to not allow more processes than machine has cores. \ No newline at end of file +- Corrected internal process generation to not allow more processes than machine has cores. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.2.0.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.2.0.md index 095bf239..a504a7ad 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.2.0.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.2.0.md @@ -4,39 +4,39 @@ sidebar_position: 89799 --- ### HarperDB 1.2.0, Alby Release + 7/10/2018 **Features** -* Time to Live: Conserve the resources of your edge device by setting data on devices to live for a specific period of time. -* Geo: HarperDB has implemented turf.js into its SQL parser to enable geo based analytics. -* Jobs: CSV Data loads, Exports & Time to Live now all run as back ground jobs. -* Exports: Perform queries that export into JSON or CSV and save to disk or S3. - +- Time to Live: Conserve the resources of your edge device by setting data on devices to live for a specific period of time. +- Geo: HarperDB has implemented turf.js into its SQL parser to enable geo based analytics. +- Jobs: CSV Data loads, Exports & Time to Live now all run as back ground jobs. +- Exports: Perform queries that export into JSON or CSV and save to disk or S3. **Fixes** -* Fixed issue where CSV data loads incorrectly report number of records loaded. -* Added validation to stop `BETWEEN` operations in SQL. -* Updated logging to not include internal variables in the logs. -* Cleaned up `add_role` response to not include internal variables. -* Removed old and unused dependencies. -* Build out further unit tests and integration tests. -* Fixed https to handle certificates properly. -* Improved stability of clustering & replication. -* Corrected issue where Objects and Arrays were not casting properly in `SQL SELECT` response. -* Fixed issue where Blob text was not being returned from `SQL SELECT`s. -* Fixed error being returned when querying on table with no data, now correctly returns empty array. -* Improved performance in SQL when searching on exact values. -* Fixed error when ./harperdb stop is called. -* Fixed logging issue causing instability in installer. -* Fixed `read_log` operation to accept date time. -* Added permissions checking to `export_to_s3`. -* Added ability to run SQL on `SELECT` without a `FROM`. -* Fixed issue where updating a user’s password was not encrypting properly. -* Fixed `user_guide.html` to point to readme on git repo. -* Created option to have HarperDB run as a foreground process. -* Updated `user_info` to return the correct role for a user. -* Fixed issue where HarperDB would not stop if the database root was deleted. -* Corrected error message on insert if an invalid schema is provided. -* Added permissions checks for user & role operations. \ No newline at end of file +- Fixed issue where CSV data loads incorrectly report number of records loaded. +- Added validation to stop `BETWEEN` operations in SQL. +- Updated logging to not include internal variables in the logs. +- Cleaned up `add_role` response to not include internal variables. +- Removed old and unused dependencies. +- Build out further unit tests and integration tests. +- Fixed https to handle certificates properly. +- Improved stability of clustering & replication. +- Corrected issue where Objects and Arrays were not casting properly in `SQL SELECT` response. +- Fixed issue where Blob text was not being returned from `SQL SELECT`s. +- Fixed error being returned when querying on table with no data, now correctly returns empty array. +- Improved performance in SQL when searching on exact values. +- Fixed error when ./harperdb stop is called. +- Fixed logging issue causing instability in installer. +- Fixed `read_log` operation to accept date time. +- Added permissions checking to `export_to_s3`. +- Added ability to run SQL on `SELECT` without a `FROM`. +- Fixed issue where updating a user’s password was not encrypting properly. +- Fixed `user_guide.html` to point to readme on git repo. +- Created option to have HarperDB run as a foreground process. +- Updated `user_info` to return the correct role for a user. +- Fixed issue where HarperDB would not stop if the database root was deleted. +- Corrected error message on insert if an invalid schema is provided. +- Added permissions checks for user & role operations. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.3.0.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.3.0.md index ad196159..e3a5215f 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.3.0.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.3.0.md @@ -4,24 +4,24 @@ sidebar_position: 89699 --- ### HarperDB 1.3.0, Alby Release + 11/2/2018 **Features** -* Upgrade: Upgrade to newest version via command line. -* SQL Support: Added `IS NULL` for SQL parser. -* Added attribute validation to search operations. - +- Upgrade: Upgrade to newest version via command line. +- SQL Support: Added `IS NULL` for SQL parser. +- Added attribute validation to search operations. **Fixes** -* Fixed `SELECT` calculations, i.e. `SELECT` 2+2. -* Fixed select OR not returning expected results. -* No longer allowing reserved words for schema and table names. -* Corrected process interruptions from improper SQL statements. -* Improved message handling between spawned processes that replace killed processes. -* Enhanced error handling for updates to tables that do not exist. -* Fixed error handling for NoSQL responses when `get_attributes` is provided with invalid attributes. -* Fixed issue with new columns not being updated properly in update statements. -* Now validating roles, tables and attributes when creating or updating roles. -* Fixed an issue where in some cases `undefined` was being returned after dropping a role +- Fixed `SELECT` calculations, i.e. `SELECT` 2+2. +- Fixed select OR not returning expected results. +- No longer allowing reserved words for schema and table names. +- Corrected process interruptions from improper SQL statements. +- Improved message handling between spawned processes that replace killed processes. +- Enhanced error handling for updates to tables that do not exist. +- Fixed error handling for NoSQL responses when `get_attributes` is provided with invalid attributes. +- Fixed issue with new columns not being updated properly in update statements. +- Now validating roles, tables and attributes when creating or updating roles. +- Fixed an issue where in some cases `undefined` was being returned after dropping a role diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.3.1.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.3.1.md index 77e3ffe4..56927389 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.3.1.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/1.3.1.md @@ -4,26 +4,26 @@ sidebar_position: 89698 --- ### HarperDB 1.3.1, Alby Release + 2/26/2019 **Features** -* Clustering connection direction appointment -* Foundations for threading/multi processing -* UUID autogen for hash attributes that were not provided -* Added cluster status operation - +- Clustering connection direction appointment +- Foundations for threading/multi processing +- UUID autogen for hash attributes that were not provided +- Added cluster status operation **Bug Fixes and Enhancements** -* More logging -* Clustering communication enhancements -* Clustering queue ordering by timestamps -* Cluster re connection enhancements -* Number of system core(s) detection -* Node LTS (10.15) compatibility -* Update/Alter users enhancements -* General performance enhancements -* Warning is logged if different versions of harperdb are connected via clustering -* Fixed need to restart after user creation/alteration -* Fixed SQL error that occurred on selecting from an empty table \ No newline at end of file +- More logging +- Clustering communication enhancements +- Clustering queue ordering by timestamps +- Cluster re connection enhancements +- Number of system core(s) detection +- Node LTS (10.15) compatibility +- Update/Alter users enhancements +- General performance enhancements +- Warning is logged if different versions of harperdb are connected via clustering +- Fixed need to restart after user creation/alteration +- Fixed SQL error that occurred on selecting from an empty table diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/_category_.json b/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/_category_.json index e33195ec..9eded684 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/_category_.json +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v1-alby/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Alby (Version 1)", - "position": -1 -} \ No newline at end of file + "label": "HarperDB Alby (Version 1)", + "position": -1 +} diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.1.1.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.1.1.md index e1314a5f..c59337d7 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.1.1.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.1.1.md @@ -4,24 +4,25 @@ sidebar_position: 79898 --- ### HarperDB 2.1.1, Penny Release + 05/22/2020 **Highlights** -* CORE-1007 Added the ability to perform `SQL INSERT` & `UPDATE` with function calls & expressions on values. -* CORE-1023 Fixed minor bug in final SQL step incorrectly trying to translate ordinals to alias in `ORDER BY` statement. -* CORE-1020 Fixed bug allowing 'null' and 'undefined' string values to be passed in as valid hash values. -* CORE-1006 Added SQL functionality that enables `JOIN` statements across different schemas. -* CORE-1005 Implemented JSONata library to handle our JSON document search functionality in SQL, creating the `SEARCH_JSON` function. -* CORE-1009 Updated schema validation to allow all printable ASCII characters to be used in schema/table/attribute names, except, forward slashes and backticks. Same rules apply now for hash attribute values. -* CORE-1003 Fixed handling of ORDER BY statements with function aliases. -* CORE-1004 Fixed bug related to `SELECT*` on `JOIN` queries with table columns with the same name. -* CORE-996 Fixed an issue where the `transact_to_cluster` flag is lost for CSV URL loads, fixed an issue where new attributes created in CSV bulk load do not sync to the cluster. -* CORE-994 Added new operation `system_information`. This operation returns info & metrics for the OS, time, memory, cpu, disk, network. -* CORE-993 Added new custom date functions for AlaSQL & UTC updates. -* CORE-991 Changed jobs to spawn a new process which will run the intended job without impacting a main HarperDB process. -* CORE-992 HTTPS enabled by default. -* CORE-990 Updated `describe_table` to add the record count for the table for LMDB data storage. -* CORE-989 Killed the socket cluster processes prior to HarperDB processes to eliminate a false uptime. -* CORE-975 Updated time values set by SQL Date Functions to be in epoch format. -* CORE-974 Added date functions to `SQL SELECT` column alias functionality. \ No newline at end of file +- CORE-1007 Added the ability to perform `SQL INSERT` & `UPDATE` with function calls & expressions on values. +- CORE-1023 Fixed minor bug in final SQL step incorrectly trying to translate ordinals to alias in `ORDER BY` statement. +- CORE-1020 Fixed bug allowing 'null' and 'undefined' string values to be passed in as valid hash values. +- CORE-1006 Added SQL functionality that enables `JOIN` statements across different schemas. +- CORE-1005 Implemented JSONata library to handle our JSON document search functionality in SQL, creating the `SEARCH_JSON` function. +- CORE-1009 Updated schema validation to allow all printable ASCII characters to be used in schema/table/attribute names, except, forward slashes and backticks. Same rules apply now for hash attribute values. +- CORE-1003 Fixed handling of ORDER BY statements with function aliases. +- CORE-1004 Fixed bug related to `SELECT*` on `JOIN` queries with table columns with the same name. +- CORE-996 Fixed an issue where the `transact_to_cluster` flag is lost for CSV URL loads, fixed an issue where new attributes created in CSV bulk load do not sync to the cluster. +- CORE-994 Added new operation `system_information`. This operation returns info & metrics for the OS, time, memory, cpu, disk, network. +- CORE-993 Added new custom date functions for AlaSQL & UTC updates. +- CORE-991 Changed jobs to spawn a new process which will run the intended job without impacting a main HarperDB process. +- CORE-992 HTTPS enabled by default. +- CORE-990 Updated `describe_table` to add the record count for the table for LMDB data storage. +- CORE-989 Killed the socket cluster processes prior to HarperDB processes to eliminate a false uptime. +- CORE-975 Updated time values set by SQL Date Functions to be in epoch format. +- CORE-974 Added date functions to `SQL SELECT` column alias functionality. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.2.0.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.2.0.md index 267168cd..a669ca8b 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.2.0.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.2.0.md @@ -4,40 +4,41 @@ sidebar_position: 79799 --- ### HarperDB 2.2.0, Penny Release + 08/24/2020 **Features/Updates** -* CORE-997 Updated the data format for CSV data loads being sync'd across a cluster to take up less resources -* CORE-1018 Adds SQL functionality for `BETWEEN` statements -* CORE-1032 Updates permissions to allow regular users (i.e. non-super users) to call the `get_job` operation -* CORE-1036 On create/drop table we auto create/drop the related transactions environments for the schema.table -* CORE-1042 Built raw functions to write to a tables transaction log for insert/update/delete operations -* CORE-1057 Implemented write transaction into lmdb create/update/delete functions -* CORE-1048 Adds `SEARCH` wildcard handling for role permissions standards -* CORE-1059 Added config setting to disable transaction logging for an instance -* CORE-1076 Adds permissions filter to describe operations -* CORE-1043 Change clustering catchup to use the new transaction log -* CORE-1052 Removed word "master" from source -* CORE-1061 Added new operation called `delete_transactions_before` this will tail a transaction log for a specific schema / table -* CORE-1040 On HarperDB startup make sure all tables have a transaction environment -* CORE-1055 Added 2 new setting to change the server headersTimeout & keepAliveTimeout from the config file -* CORE-1044 Created new operation `read_transaction_log` which will allow a user to get transactions for a table by `timestamp`, `username`, or `hash_value` -* CORE-1043 Change clustering catchup to use the new transaction log -* CORE-1089 Added new attribute to `system_information` for table/transaction log data size in bytes & transaction log record count -* CORE-1101 Fix to store empty strings rather than considering them null & fix to be able to search on empty strings in SQL/NoSQL. -* CORE-1054 Updates permissions object to remove delete attribute permission and update table attribute permission key to `attribute_permissions` -* CORE-1092 Do not allow the `__createdtime__` to be updated -* CORE-1085 Updates create schema/table & drop schema/table/attribute operations permissions to require super user role and adds integration tests to validate -* CORE-1071 Updates response messages and status codes from `describe_schema` and `describe_table` operations to provide standard language/status code when a schema item is not found -* CORE-1049 Updates response message for SQL update op with no matching rows -* CORE-1096 Added tracking of the origin in the transaction log. This origin object stores the node name, timestamp of the transaction from the originating node & the user. +- CORE-997 Updated the data format for CSV data loads being sync'd across a cluster to take up less resources +- CORE-1018 Adds SQL functionality for `BETWEEN` statements +- CORE-1032 Updates permissions to allow regular users (i.e. non-super users) to call the `get_job` operation +- CORE-1036 On create/drop table we auto create/drop the related transactions environments for the schema.table +- CORE-1042 Built raw functions to write to a tables transaction log for insert/update/delete operations +- CORE-1057 Implemented write transaction into lmdb create/update/delete functions +- CORE-1048 Adds `SEARCH` wildcard handling for role permissions standards +- CORE-1059 Added config setting to disable transaction logging for an instance +- CORE-1076 Adds permissions filter to describe operations +- CORE-1043 Change clustering catchup to use the new transaction log +- CORE-1052 Removed word "master" from source +- CORE-1061 Added new operation called `delete_transactions_before` this will tail a transaction log for a specific schema / table +- CORE-1040 On HarperDB startup make sure all tables have a transaction environment +- CORE-1055 Added 2 new setting to change the server headersTimeout & keepAliveTimeout from the config file +- CORE-1044 Created new operation `read_transaction_log` which will allow a user to get transactions for a table by `timestamp`, `username`, or `hash_value` +- CORE-1043 Change clustering catchup to use the new transaction log +- CORE-1089 Added new attribute to `system_information` for table/transaction log data size in bytes & transaction log record count +- CORE-1101 Fix to store empty strings rather than considering them null & fix to be able to search on empty strings in SQL/NoSQL. +- CORE-1054 Updates permissions object to remove delete attribute permission and update table attribute permission key to `attribute_permissions` +- CORE-1092 Do not allow the `__createdtime__` to be updated +- CORE-1085 Updates create schema/table & drop schema/table/attribute operations permissions to require super user role and adds integration tests to validate +- CORE-1071 Updates response messages and status codes from `describe_schema` and `describe_table` operations to provide standard language/status code when a schema item is not found +- CORE-1049 Updates response message for SQL update op with no matching rows +- CORE-1096 Added tracking of the origin in the transaction log. This origin object stores the node name, timestamp of the transaction from the originating node & the user. **Bug Fixes** -* CORE-1028 Fixes bug for simple `SQL SELECT` queries not returning aliases and incorrectly returning hash values when not requested in query -* CORE-1037 Fixed an issue where numbers with leading zero i.e. 00123 are converted to numbers rather than being honored as strings. -* CORE-1063 Updates permission error response shape to consolidate issues into individual objects per schema/table combo -* CORE-1098 Fixed an issue where transaction environments were remaining in the global cache after being dropped. -* CORE-1086 Fixed issue where responses from insert/update were incorrect with skipped records. -* CORE-1079 Fixes SQL bugs around invalid schema/table and special characters in `WHERE` clause \ No newline at end of file +- CORE-1028 Fixes bug for simple `SQL SELECT` queries not returning aliases and incorrectly returning hash values when not requested in query +- CORE-1037 Fixed an issue where numbers with leading zero i.e. 00123 are converted to numbers rather than being honored as strings. +- CORE-1063 Updates permission error response shape to consolidate issues into individual objects per schema/table combo +- CORE-1098 Fixed an issue where transaction environments were remaining in the global cache after being dropped. +- CORE-1086 Fixed issue where responses from insert/update were incorrect with skipped records. +- CORE-1079 Fixes SQL bugs around invalid schema/table and special characters in `WHERE` clause diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.2.2.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.2.2.md index 827c63db..fca00967 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.2.2.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.2.2.md @@ -4,13 +4,14 @@ sidebar_position: 79797 --- ### HarperDB 2.2.2, Penny Release + 10/27/2020 -* CORE-1154 Allowed transaction logging to be disabled even if clustering is enabled. -* CORE-1153 Fixed issue where `delete_files_before` was writing to transaction log. -* CORE-1152 Fixed issue where no more than 4 HarperDB forks would be created. -* CORE-1112 Adds handling for system timestamp attributes in permissions. -* CORE-1131 Adds better handling for checking perms on operations with action value in JSON. -* CORE-1113 Fixes validation bug checking for super user/cluster user permissions and other permissions. -* CORE-1135 Adds validation for valid keys in role API operations. -* CORE-1073 Adds new `import_from_s3` operation to API. +- CORE-1154 Allowed transaction logging to be disabled even if clustering is enabled. +- CORE-1153 Fixed issue where `delete_files_before` was writing to transaction log. +- CORE-1152 Fixed issue where no more than 4 HarperDB forks would be created. +- CORE-1112 Adds handling for system timestamp attributes in permissions. +- CORE-1131 Adds better handling for checking perms on operations with action value in JSON. +- CORE-1113 Fixes validation bug checking for super user/cluster user permissions and other permissions. +- CORE-1135 Adds validation for valid keys in role API operations. +- CORE-1073 Adds new `import_from_s3` operation to API. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.2.3.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.2.3.md index eca953e2..06b89d4e 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.2.3.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.2.3.md @@ -4,6 +4,7 @@ sidebar_position: 79796 --- ### HarperDB 2.2.3, Penny Release + 11/16/2020 -* CORE-1158 Performance improvements to core delete function and configuration of `delete_files_before` to run in batches with a pause into between. \ No newline at end of file +- CORE-1158 Performance improvements to core delete function and configuration of `delete_files_before` to run in batches with a pause into between. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.3.0.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.3.0.md index 2b248490..a027eedb 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.3.0.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.3.0.md @@ -4,19 +4,20 @@ sidebar_position: 79699 --- ### HarperDB 2.3.0, Penny Release + 12/03/2020 **Features/Updates** -* CORE-1191, CORE-1190, CORE-1125, CORE-1157, CORE-1126, CORE-1140, CORE-1134, CORE-1123, CORE-1124, CORE-1122 Added JWT Authentication option (See documentation for more information) -* CORE-1128, CORE-1143, CORE-1140, CORE-1129 Added `upsert` operation -* CORE-1187 Added `get_configuration` operation which allows admins to view their configuration settings. -* CORE-1175 Added new internal LMDB function to copy an environment for use in future features. -* CORE-1166 Updated packages to address security vulnerabilities. +- CORE-1191, CORE-1190, CORE-1125, CORE-1157, CORE-1126, CORE-1140, CORE-1134, CORE-1123, CORE-1124, CORE-1122 Added JWT Authentication option (See documentation for more information) +- CORE-1128, CORE-1143, CORE-1140, CORE-1129 Added `upsert` operation +- CORE-1187 Added `get_configuration` operation which allows admins to view their configuration settings. +- CORE-1175 Added new internal LMDB function to copy an environment for use in future features. +- CORE-1166 Updated packages to address security vulnerabilities. **Bug Fixes** -* CORE-1195 Modified `drop_attribute` to drop after data cleanse completes. -* CORE-1149 Fix SQL bug regarding self joins and updates alasql to 0.6.5 release. -* CORE-1168 Fix inconsistent invalid schema/table errors. -* CORE-1162 Fix bug which caused `delete_files_before` to cause tables to grow in size due to an open cursor issue. \ No newline at end of file +- CORE-1195 Modified `drop_attribute` to drop after data cleanse completes. +- CORE-1149 Fix SQL bug regarding self joins and updates alasql to 0.6.5 release. +- CORE-1168 Fix inconsistent invalid schema/table errors. +- CORE-1162 Fix bug which caused `delete_files_before` to cause tables to grow in size due to an open cursor issue. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.3.1.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.3.1.md index 51291a01..03df0186 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.3.1.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/2.3.1.md @@ -4,9 +4,10 @@ sidebar_position: 79698 --- ### HarperDB 2.3.1, Penny Release + 1/29/2021 **Bug Fixes** -* CORE-1218 A bug in HarperDB 2.3.0 was identified related to manually calling the `create_attribute` operation. This bug caused secondary indexes to be overwritten by the most recently inserted or updated value for the index, thereby causing a search operation filtered with that index to only return the most recently inserted/updated row. Note, this issue does not affect attributes that are reflexively/automatically created. It only affects attributes created using `create_attribute`. To resolve this issue in 2.3.0 or earlier, drop and recreate your table using reflexive attribute creation. In 2.3.1, drop and recreate your table and use either reflexive attribute creation or `create_attribute`. -* CORE-1219 Increased maximum table attributes from 1000 to 10000 \ No newline at end of file +- CORE-1218 A bug in HarperDB 2.3.0 was identified related to manually calling the `create_attribute` operation. This bug caused secondary indexes to be overwritten by the most recently inserted or updated value for the index, thereby causing a search operation filtered with that index to only return the most recently inserted/updated row. Note, this issue does not affect attributes that are reflexively/automatically created. It only affects attributes created using `create_attribute`. To resolve this issue in 2.3.0 or earlier, drop and recreate your table using reflexive attribute creation. In 2.3.1, drop and recreate your table and use either reflexive attribute creation or `create_attribute`. +- CORE-1219 Increased maximum table attributes from 1000 to 10000 diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/_category_.json b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/_category_.json index 285eecf7..28f86bc1 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/_category_.json +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v2-penny/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Penny (Version 2)", - "position": -2 -} \ No newline at end of file + "label": "HarperDB Penny (Version 2)", + "position": -2 +} diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.0.0.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.0.0.md index 2907ee6c..10319747 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.0.0.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.0.0.md @@ -4,28 +4,29 @@ sidebar_position: 69999 --- ### HarperDB 3.0, Monkey Release + 5/18/2021 **Features/Updates** -* CORE-1217, CORE-1226, CORE-1232 Create new `search_by_conditions` operation. -* CORE-1304 Upgrade to Node 12.22.1. -* CORE-1235 Adds new upgrade/install functionality. -* CORE-1206, CORE-1248, CORE-1252 Implement `lmdb-store` library for optimized performance. -* CORE-1062 Added alias operation for `delete_files_before`, named `delete_records_before`. -* CORE-1243 Change `HTTPS_ON` settings value to false by default. -* CORE-1189 Implement fastify web server, resulting in improved performance. -* CORE-1221 Update user API to use role name instead of role id. -* CORE-1225 Updated dependencies to eliminate npm security warnings. -* CORE-1241 Adds 3.0 update directive and refactors/fixes update functionality. +- CORE-1217, CORE-1226, CORE-1232 Create new `search_by_conditions` operation. +- CORE-1304 Upgrade to Node 12.22.1. +- CORE-1235 Adds new upgrade/install functionality. +- CORE-1206, CORE-1248, CORE-1252 Implement `lmdb-store` library for optimized performance. +- CORE-1062 Added alias operation for `delete_files_before`, named `delete_records_before`. +- CORE-1243 Change `HTTPS_ON` settings value to false by default. +- CORE-1189 Implement fastify web server, resulting in improved performance. +- CORE-1221 Update user API to use role name instead of role id. +- CORE-1225 Updated dependencies to eliminate npm security warnings. +- CORE-1241 Adds 3.0 update directive and refactors/fixes update functionality. **Bug Fixes** -* CORE-1299 Remove all references to the `PROJECT_DIR` setting. This setting is problematic when using node version managers and upgrading the version of node and then installing a new instance of HarperDB. -* CORE-1288 Fix bug with drop table/schema that was causing 'env required' error log. -* CORE-1285 Update warning log when trying to create an attribute that already exists. -* CORE-1254 Added logic to manage data collisions in clustering. -* CORE-1212 Add pre-check to `drop_user` that returns error if user doesn't exist. -* CORE-1114 Update response code and message from `add_user` when user already exists. -* CORE-1111 Update response from `create_attribute` to match the create schema/table response. -* CORE-1205 Fixed bug that prevented schema/table from being dropped if name was a number or had a wildcard value in it. Updated validation for insert, upsert and update. \ No newline at end of file +- CORE-1299 Remove all references to the `PROJECT_DIR` setting. This setting is problematic when using node version managers and upgrading the version of node and then installing a new instance of HarperDB. +- CORE-1288 Fix bug with drop table/schema that was causing 'env required' error log. +- CORE-1285 Update warning log when trying to create an attribute that already exists. +- CORE-1254 Added logic to manage data collisions in clustering. +- CORE-1212 Add pre-check to `drop_user` that returns error if user doesn't exist. +- CORE-1114 Update response code and message from `add_user` when user already exists. +- CORE-1111 Update response from `create_attribute` to match the create schema/table response. +- CORE-1205 Fixed bug that prevented schema/table from being dropped if name was a number or had a wildcard value in it. Updated validation for insert, upsert and update. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.0.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.0.md index 148690f6..f14acb8e 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.0.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.0.md @@ -4,20 +4,21 @@ sidebar_position: 69899 --- ### HarperDB 3.1.0, Monkey Release + 8/24/2021 **Features/Updates** -* CORE-1320, CORE-1321, CORE-1323, CORE-1324 Version 1.0 of HarperDB Custom Functions -* CORE-1275, CORE-1276, CORE-1278, CORE-1279, CORE-1280, CORE-1282, CORE-1283, CORE-1305, CORE-1314 IPC server for communication between HarperDB processes, including HarperDB, HarperDB Clustering, and HarperDB Functions -* CORE-1352, CORE-1355, CORE-1356, CORE-1358 Implement pm2 for HarperDB process management -* CORE-1292, CORE-1308, CORE-1312, CORE-1334, CORE-1338 Updated installation process to start HarperDB immediately on install and to accept all config settings via environment variable or command line arguments -* CORE-1310 Updated licensing functionality -* CORE-1301 Updated validation for performance improvement -* CORE-1359 Add `hdb-response-time` header which returns the HarperDB response time in milliseconds -* CORE-1330, CORE-1309 New config settings: `LOG_TO_FILE`, `LOG_TO_STDSTREAMS`, `IPC_SERVER_PORT`, `RUN_IN_FOREGROUND`, `CUSTOM_FUNCTIONS`, `CUSTOM_FUNCTIONS_PORT`, `CUSTOM_FUNCTIONS_DIRECTORY`, `MAX_CUSTOM_FUNCTION_PROCESSES` +- CORE-1320, CORE-1321, CORE-1323, CORE-1324 Version 1.0 of HarperDB Custom Functions +- CORE-1275, CORE-1276, CORE-1278, CORE-1279, CORE-1280, CORE-1282, CORE-1283, CORE-1305, CORE-1314 IPC server for communication between HarperDB processes, including HarperDB, HarperDB Clustering, and HarperDB Functions +- CORE-1352, CORE-1355, CORE-1356, CORE-1358 Implement pm2 for HarperDB process management +- CORE-1292, CORE-1308, CORE-1312, CORE-1334, CORE-1338 Updated installation process to start HarperDB immediately on install and to accept all config settings via environment variable or command line arguments +- CORE-1310 Updated licensing functionality +- CORE-1301 Updated validation for performance improvement +- CORE-1359 Add `hdb-response-time` header which returns the HarperDB response time in milliseconds +- CORE-1330, CORE-1309 New config settings: `LOG_TO_FILE`, `LOG_TO_STDSTREAMS`, `IPC_SERVER_PORT`, `RUN_IN_FOREGROUND`, `CUSTOM_FUNCTIONS`, `CUSTOM_FUNCTIONS_PORT`, `CUSTOM_FUNCTIONS_DIRECTORY`, `MAX_CUSTOM_FUNCTION_PROCESSES` **Bug Fixes** -* CORE-1315 Corrected issue in HarperDB restart scenario -* CORE-1370 Update some of the validation error handlers so that they don't log full stack \ No newline at end of file +- CORE-1315 Corrected issue in HarperDB restart scenario +- CORE-1370 Update some of the validation error handlers so that they don't log full stack diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.1.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.1.md index 0adbeb21..8f90dc10 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.1.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.1.md @@ -4,15 +4,16 @@ sidebar_position: 69898 --- ### HarperDB 3.1.1, Monkey Release + 9/23/2021 **Features/Updates** -* CORE-1393 Added utility function to add settings from env/cmd vars to the settings file on every run/restart -* CORE-1395 Create a setting which will allow to enable the local Studio to be served from an instance of HarperDB -* CORE-1397 Update the stock 404 response to not return the request URL -* General updates to optimize Docker container +- CORE-1393 Added utility function to add settings from env/cmd vars to the settings file on every run/restart +- CORE-1395 Create a setting which will allow to enable the local Studio to be served from an instance of HarperDB +- CORE-1397 Update the stock 404 response to not return the request URL +- General updates to optimize Docker container **Bug Fixes** -* CORE-1399 Added fixes for complex SQL alias issues \ No newline at end of file +- CORE-1399 Added fixes for complex SQL alias issues diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.2.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.2.md index f1c192b6..706e5956 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.2.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.2.md @@ -4,12 +4,13 @@ sidebar_position: 69897 --- ### HarperDB 3.1.2, Monkey Release + 10/21/2021 **Features/Updates** -* Updated the installation ASCII art to reflect the new HarperDB logo +- Updated the installation ASCII art to reflect the new HarperDB logo **Bug Fixes** -* CORE-1408 Corrects issue where `drop_attribute` was not properly setting the LMDB version number causing tables to behave unexpectedly \ No newline at end of file +- CORE-1408 Corrects issue where `drop_attribute` was not properly setting the LMDB version number causing tables to behave unexpectedly diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.3.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.3.md index 2d484f8d..1a7d3301 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.3.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.3.md @@ -4,8 +4,9 @@ sidebar_position: 69896 --- ### HarperDB 3.1.3, Monkey Release + 1/14/2022 **Bug Fixes** -* CORE-1446 Fix for scans on indexes larger than 1 million entries causing queries to never return \ No newline at end of file +- CORE-1446 Fix for scans on indexes larger than 1 million entries causing queries to never return diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.4.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.4.md index ae0074fd..3fa86ead 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.4.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.4.md @@ -4,8 +4,9 @@ sidebar_position: 69895 --- ### HarperDB 3.1.4, Monkey Release + 2/24/2022 **Features/Updates** -* CORE-1460 Added new setting `STORAGE_WRITE_ASYNC`. If this setting is true, LMDB will have faster write performance at the expense of not being crash safe. The default for this setting is false, which results in HarperDB being crash safe. \ No newline at end of file +- CORE-1460 Added new setting `STORAGE_WRITE_ASYNC`. If this setting is true, LMDB will have faster write performance at the expense of not being crash safe. The default for this setting is false, which results in HarperDB being crash safe. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.5.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.5.md index eff4b5b0..23661928 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.5.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.1.5.md @@ -4,8 +4,9 @@ sidebar_position: 69894 --- ### HarperDB 3.1.5, Monkey Release + 3/4/2022 **Features/Updates** -* CORE-1498 Fixed incorrect autocasting of string that start with "0." that tries to convert to number but instead returns NaN. \ No newline at end of file +- CORE-1498 Fixed incorrect autocasting of string that start with "0." that tries to convert to number but instead returns NaN. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.2.0.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.2.0.md index 003575d8..fa215082 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.2.0.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.2.0.md @@ -4,10 +4,11 @@ sidebar_position: 69799 --- ### HarperDB 3.2.0, Monkey Release + 3/25/2022 **Features/Updates** -* CORE-1391 Bug fix related to orphaned HarperDB background processes. -* CORE-1509 Updated node version check, updated Node.js version, updated project dependencies. -* CORE-1518 Remove final call from logger. \ No newline at end of file +- CORE-1391 Bug fix related to orphaned HarperDB background processes. +- CORE-1509 Updated node version check, updated Node.js version, updated project dependencies. +- CORE-1518 Remove final call from logger. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.2.1.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.2.1.md index dc511a70..4cc983a4 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.2.1.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.2.1.md @@ -4,8 +4,9 @@ sidebar_position: 69798 --- ### HarperDB 3.2.1, Monkey Release + 6/1/2022 **Features/Updates** -* CORE-1573 Added logic to track the pid of the foreground process if running in foreground. Then on stop, use that pid to kill the process. Logic was also added to kill the pm2 daemon when stop is called. \ No newline at end of file +- CORE-1573 Added logic to track the pid of the foreground process if running in foreground. Then on stop, use that pid to kill the process. Logic was also added to kill the pm2 daemon when stop is called. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.3.0.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.3.0.md index 3e3ca784..236704dd 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.3.0.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/3.3.0.md @@ -5,8 +5,8 @@ sidebar_position: 69699 ### HarperDB 3.3.0 - Monkey -* CORE-1595 Added new role type `structure_user`, this enables non-superusers to be able to create/drop schema/table/attribute. -* CORE-1501 Improved performance for drop_table. -* CORE-1599 Added two new operations for custom functions `install_node_modules` & `audit_node_modules`. -* CORE-1598 Added `skip_node_modules` flag to `package_custom_function_project` operation. This flag allows for not bundling project dependencies and deploying a smaller project to other nodes. Use this flag in tandem with `install_node_modules`. -* CORE-1707 Binaries are now included for Linux on AMD64, Linux on ARM64, and macOS. GCC, Make, Python are no longer required when installing on these platforms. +- CORE-1595 Added new role type `structure_user`, this enables non-superusers to be able to create/drop schema/table/attribute. +- CORE-1501 Improved performance for drop_table. +- CORE-1599 Added two new operations for custom functions `install_node_modules` & `audit_node_modules`. +- CORE-1598 Added `skip_node_modules` flag to `package_custom_function_project` operation. This flag allows for not bundling project dependencies and deploying a smaller project to other nodes. Use this flag in tandem with `install_node_modules`. +- CORE-1707 Binaries are now included for Linux on AMD64, Linux on ARM64, and macOS. GCC, Make, Python are no longer required when installing on these platforms. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/_category_.json b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/_category_.json index 0103ac36..71bea62a 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/_category_.json +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v3-monkey/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Monkey (Version 3)", - "position": -3 -} \ No newline at end of file + "label": "HarperDB Monkey (Version 3)", + "position": -3 +} diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.0.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.0.md index d2aa32b2..b94ea2f8 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.0.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.0.md @@ -4,121 +4,128 @@ sidebar_position: 59999 --- ### HarperDB 4.0.0, Tucker Release + 11/2/2022 **Networking & Data Replication (Clustering)** -The HarperDB clustering internals have been rewritten and the underlying technology for Clustering has been completely replaced with [NATS](https://nats.io/), an enterprise grade connective technology responsible for addressing, discovery and exchanging of messages that drive the common patterns in distributed systems. -* CORE-1464, CORE-1470, : Remove SocketCluster dependencies and all code related to them. -* CORE-1465, CORE-1485, CORE-1537, CORE-1538, CORE-1558, CORE-1583, CORE_1665, CORE-1710, CORE-1801, CORE-1865 :Add nats-`server` code as dependency, on install of HarperDB download nats-`server` is possible else fallback to building from source code. -* CORE-1593, CORE-1761: Add `nats.js` as project dependency. -* CORE-1466: Build NATS configs on `harperdb run` based on HarperDB YAML configuration. -* CORE-1467, CORE-1508: Launch and manage NATS servers with PM2. -* CORE-1468, CORE-1507: Create a process which reads the work queue stream and processes transactions. -* CORE-1481, CORE-1529, CORE-1698, CORE-1502, CORE-1696: On upgrade to 4.0, update pre-existing clustering configurations, create table transaction streams, create work queue stream, update `hdb_nodes` table, create clustering folder structure, and rebuild self-signed certs. -* CORE-1494, CORE-1521, CORE-1755: Build out internals to interface with NATS. -* CORE-1504: Update existing hooks to save transactions to work with NATS. -* CORE-1514, CORE-1515, CORE-1516, CORE-1527, CORE-1532: Update `add_node`, `update_node`, and `remove_node` operations to no longer need host and port in payload. These operations now manage dynamically sourcing of table level transaction streams between nodes and work queues. -* CORE-1522: Create `NATSReplyService` process which handles the receiving NATS based requests from remote instances and sending back appropriate responses. -* CORE-1471, CORE-1568, CORE-1563, CORE-1534, CORE-1569: Update `cluster_status` operation. -* CORE-1611: Update pre-existing transaction log operations to be audit log operations. -* CORE-1541, CORE-1612, CORE-1613: Create translation log operations which interface with streams. -* CORE-1668: Update NATS serialization / deserialization to use MessagePack. -* CORE-1673: Add `system_info` param to `hdb_nodes` table and update on `add_node` and `cluster_status`. -* CORE-1477, CORE-1493, CORE-1557, CORE-1596, CORE-1577: Both a full HarperDB restart & just clustering restart call the NATS server with a reload directive to maintain full uptime while servers refresh. -* CORE-1474:HarperDB install adds clustering folder structure. -* CORE-1530: Post `drop_table` HarperDB purges the related transaction stream. -* CORE-1567: Set NATS config to always use TLS. -* CORE-1543: Removed the `transact_to_cluster` attribute from the bulk load operations. Now bulk loads always replicate. -* CORE-1533, CORE-1556, CORE-1561, CORE-1562, CORE-1564: New operation `configure_cluster`, this operation enables bulk publishing and subscription of multiple tables to multiple instances of HarperDB. -* CORE-1535: Create work queue stream on install of HarperDB. This stream receives transactions from remote instances of HarperDB which are then ingested in order. -* CORE-1551: Create transaction streams on the remote node if they do not exist when performing `add_node` or `update_node`. -* CORE-1594, CORE-1605, CORE-1749, CORE-1767, CORE-1770: Optimize the work queue stream and its consumer to be more performant and validate exact once delivery. -* CORE-1621, CORE-1692, CORE-1570, CORE-1693: NATS stream names are MD5 hashed to avoid characters that HarperDB allows, but NATS may not. -* CORE-1762: Add a new optional attribute to `add_node` and `update_node` named `opt_start_time`. This attribute sets a starting time to start synchronizing transactions. -* CORE-1785: Optimizations and bug fixes in regards to sourcing data from remote instances on HarperDB. -* CORE-1588: Created new operation `set_cluster_routes` to enable setting routes for instances of HarperDB to mesh together. -* CORE-1589: Created new operation `get_cluster_routes` to allow for retrieval of routes used to connect the instance of HarperDB to the mesh. -* CORE-1590: Created new operation `delete_cluster_routes` to allow for removal of routes used to connect the instance of HarperDB to the mesh. -* CORE-1667: Fix old environment variable `CLUSTERING_PORT` not mapping to new hub server port. -* CORE-1609: Allow `remove_node` to be called when the other node cannot be reached. -* CORE-1815: Add transaction lock to `add_node` and `update_node` to avoid concurrent nats source update bug. -* CORE-1848: Update stream configs if the node name has been changed in the YAML configuration. -* CORE-1873: Update `add_node` and `update_node` so that it auto-creates schema/table on both local and remote node respectively +The HarperDB clustering internals have been rewritten and the underlying technology for Clustering has been completely replaced with [NATS](https://nats.io/), an enterprise grade connective technology responsible for addressing, discovery and exchanging of messages that drive the common patterns in distributed systems. +- CORE-1464, CORE-1470, : Remove SocketCluster dependencies and all code related to them. +- CORE-1465, CORE-1485, CORE-1537, CORE-1538, CORE-1558, CORE-1583, CORE_1665, CORE-1710, CORE-1801, CORE-1865 :Add nats-`server` code as dependency, on install of HarperDB download nats-`server` is possible else fallback to building from source code. +- CORE-1593, CORE-1761: Add `nats.js` as project dependency. +- CORE-1466: Build NATS configs on `harperdb run` based on HarperDB YAML configuration. +- CORE-1467, CORE-1508: Launch and manage NATS servers with PM2. +- CORE-1468, CORE-1507: Create a process which reads the work queue stream and processes transactions. +- CORE-1481, CORE-1529, CORE-1698, CORE-1502, CORE-1696: On upgrade to 4.0, update pre-existing clustering configurations, create table transaction streams, create work queue stream, update `hdb_nodes` table, create clustering folder structure, and rebuild self-signed certs. +- CORE-1494, CORE-1521, CORE-1755: Build out internals to interface with NATS. +- CORE-1504: Update existing hooks to save transactions to work with NATS. +- CORE-1514, CORE-1515, CORE-1516, CORE-1527, CORE-1532: Update `add_node`, `update_node`, and `remove_node` operations to no longer need host and port in payload. These operations now manage dynamically sourcing of table level transaction streams between nodes and work queues. +- CORE-1522: Create `NATSReplyService` process which handles the receiving NATS based requests from remote instances and sending back appropriate responses. +- CORE-1471, CORE-1568, CORE-1563, CORE-1534, CORE-1569: Update `cluster_status` operation. +- CORE-1611: Update pre-existing transaction log operations to be audit log operations. +- CORE-1541, CORE-1612, CORE-1613: Create translation log operations which interface with streams. +- CORE-1668: Update NATS serialization / deserialization to use MessagePack. +- CORE-1673: Add `system_info` param to `hdb_nodes` table and update on `add_node` and `cluster_status`. +- CORE-1477, CORE-1493, CORE-1557, CORE-1596, CORE-1577: Both a full HarperDB restart & just clustering restart call the NATS server with a reload directive to maintain full uptime while servers refresh. +- CORE-1474:HarperDB install adds clustering folder structure. +- CORE-1530: Post `drop_table` HarperDB purges the related transaction stream. +- CORE-1567: Set NATS config to always use TLS. +- CORE-1543: Removed the `transact_to_cluster` attribute from the bulk load operations. Now bulk loads always replicate. +- CORE-1533, CORE-1556, CORE-1561, CORE-1562, CORE-1564: New operation `configure_cluster`, this operation enables bulk publishing and subscription of multiple tables to multiple instances of HarperDB. +- CORE-1535: Create work queue stream on install of HarperDB. This stream receives transactions from remote instances of HarperDB which are then ingested in order. +- CORE-1551: Create transaction streams on the remote node if they do not exist when performing `add_node` or `update_node`. +- CORE-1594, CORE-1605, CORE-1749, CORE-1767, CORE-1770: Optimize the work queue stream and its consumer to be more performant and validate exact once delivery. +- CORE-1621, CORE-1692, CORE-1570, CORE-1693: NATS stream names are MD5 hashed to avoid characters that HarperDB allows, but NATS may not. +- CORE-1762: Add a new optional attribute to `add_node` and `update_node` named `opt_start_time`. This attribute sets a starting time to start synchronizing transactions. +- CORE-1785: Optimizations and bug fixes in regards to sourcing data from remote instances on HarperDB. +- CORE-1588: Created new operation `set_cluster_routes` to enable setting routes for instances of HarperDB to mesh together. +- CORE-1589: Created new operation `get_cluster_routes` to allow for retrieval of routes used to connect the instance of HarperDB to the mesh. +- CORE-1590: Created new operation `delete_cluster_routes` to allow for removal of routes used to connect the instance of HarperDB to the mesh. +- CORE-1667: Fix old environment variable `CLUSTERING_PORT` not mapping to new hub server port. +- CORE-1609: Allow `remove_node` to be called when the other node cannot be reached. +- CORE-1815: Add transaction lock to `add_node` and `update_node` to avoid concurrent nats source update bug. +- CORE-1848: Update stream configs if the node name has been changed in the YAML configuration. +- CORE-1873: Update `add_node` and `update_node` so that it auto-creates schema/table on both local and remote node respectively **Data Storage** We have made improvements to how we store, index, and retrieve data. -* CORE-1619: Enabled new concurrent flushing technology for improved write performance. -* CORE-1701: Optimize search performance for `search_by_conditions` when executing multiple AND conditions. -* CORE-1652: Encode the values of secondary indices more efficiently for faster access. -* CORE-1670: Store updated timestamp in `lmdb.js`' version property. -* CORE-1651: Enabled multiple value indexing of array values which allows for the ability to search on specific elements in an array more efficiently. -* CORE-1649, CORE-1659: Large text values (larger than 255 bytes) are no longer stored in separate blob index. Now they are segmented and delimited in the same index to increase search performance. -* Complex objects and object arrays are no longer stored in a separate index to preserve storage and increase write throughput. -* CORE-1650, CORE-1724, CORE-1738: Improved internals around interpreting attribute values. -* CORE-1657: Deferred property decoding allows large objects to be stored, but individual attributes can be accessed (like with get_attributes) without incurring the cost of decoding the entire object. -* CORE-1658: Enable in-memory caching of records for even faster access to frequently accessed data. -* CORE-1693: Wrap updates in async transactions to ensure ACID-compliant updates. -* CORE-1653: Upgrade to 4.0 rebuilds tables to reflect changes made to index improvements. -* CORE-1753: Removed old `node-lmdb` dependency. -* CORE-1787: Freeze objects returned from queries. -* CORE-1821: Read the `WRITE_ASYNC` setting which enables LMDB nosync. + +- CORE-1619: Enabled new concurrent flushing technology for improved write performance. +- CORE-1701: Optimize search performance for `search_by_conditions` when executing multiple AND conditions. +- CORE-1652: Encode the values of secondary indices more efficiently for faster access. +- CORE-1670: Store updated timestamp in `lmdb.js`' version property. +- CORE-1651: Enabled multiple value indexing of array values which allows for the ability to search on specific elements in an array more efficiently. +- CORE-1649, CORE-1659: Large text values (larger than 255 bytes) are no longer stored in separate blob index. Now they are segmented and delimited in the same index to increase search performance. +- Complex objects and object arrays are no longer stored in a separate index to preserve storage and increase write throughput. +- CORE-1650, CORE-1724, CORE-1738: Improved internals around interpreting attribute values. +- CORE-1657: Deferred property decoding allows large objects to be stored, but individual attributes can be accessed (like with get_attributes) without incurring the cost of decoding the entire object. +- CORE-1658: Enable in-memory caching of records for even faster access to frequently accessed data. +- CORE-1693: Wrap updates in async transactions to ensure ACID-compliant updates. +- CORE-1653: Upgrade to 4.0 rebuilds tables to reflect changes made to index improvements. +- CORE-1753: Removed old `node-lmdb` dependency. +- CORE-1787: Freeze objects returned from queries. +- CORE-1821: Read the `WRITE_ASYNC` setting which enables LMDB nosync. **Logging** HarperDB has increased logging specificity by breaking out logs based on components logging. There are specific log files each for HarperDB Core, Custom Functions, Hub Server, Leaf Server, and more. -* CORE-1497: Remove `pino` and `winston` dependencies. -* CORE-1426: All logging is output via `stdout` and `stderr`, our default logging is then picked up by PM2 which handles writing out to file. -* CORE-1431: Improved `read_log` operation validation. -* CORE-1433, CORE-1463: Added log rotation. -* CORE-1553, CORE-1555, CORE-1552, CORE-1554, CORE-1704: Performance gain by only serializing objects and arrays if the log is for the level defined in configuration. -* CORE-1436: Upgrade to 4.0 updates internals for logging changes. -* CORE-1428, CORE-1440, CORE-1442, CORE-1434, CORE-1435, CORE-1439, CORE-1482, CORE-1751, CORE-1752: Bug fixes, performance improvements and improved unit tests. -* CORE-1691: Convert non-PM2 managed log file writes to use Node.js `fs.appendFileSync` function. + +- CORE-1497: Remove `pino` and `winston` dependencies. +- CORE-1426: All logging is output via `stdout` and `stderr`, our default logging is then picked up by PM2 which handles writing out to file. +- CORE-1431: Improved `read_log` operation validation. +- CORE-1433, CORE-1463: Added log rotation. +- CORE-1553, CORE-1555, CORE-1552, CORE-1554, CORE-1704: Performance gain by only serializing objects and arrays if the log is for the level defined in configuration. +- CORE-1436: Upgrade to 4.0 updates internals for logging changes. +- CORE-1428, CORE-1440, CORE-1442, CORE-1434, CORE-1435, CORE-1439, CORE-1482, CORE-1751, CORE-1752: Bug fixes, performance improvements and improved unit tests. +- CORE-1691: Convert non-PM2 managed log file writes to use Node.js `fs.appendFileSync` function. **Configuration** HarperDB has updated its configuration from a properties file to YAML. -* CORE-1448, CORE-1449, CORE-1519, CORE-1587: Upgrade automatically converts the pre-existing settings file to YAML. -* CORE-1445, CORE-1534, CORE-1444, CORE-1858: Build out new logic to create, update, and interpret the YAML configuration file. -* Installer has updated prompts to reflect YAML settings. -* CORE-1447: Create an alias for the `configure_cluster` operation as `set_configuration`. -* CORE-1461, CORE-1462, CORE-1483: Unit test improvements. -* CORE-1492: Improvements to get_configuration and set_configuration operations. -* CORE-1503: Modify HarperDB configuration for more granular certificate definition. -* CORE-1591: Update `routes` IP param to `host` and to `leaf` config in `harperdb.conf` -* CORE-1519: Fix issue when switching between old and new versions of HarperDB we are getting the config parameter is undefined error on npm install. + +- CORE-1448, CORE-1449, CORE-1519, CORE-1587: Upgrade automatically converts the pre-existing settings file to YAML. +- CORE-1445, CORE-1534, CORE-1444, CORE-1858: Build out new logic to create, update, and interpret the YAML configuration file. +- Installer has updated prompts to reflect YAML settings. +- CORE-1447: Create an alias for the `configure_cluster` operation as `set_configuration`. +- CORE-1461, CORE-1462, CORE-1483: Unit test improvements. +- CORE-1492: Improvements to get_configuration and set_configuration operations. +- CORE-1503: Modify HarperDB configuration for more granular certificate definition. +- CORE-1591: Update `routes` IP param to `host` and to `leaf` config in `harperdb.conf` +- CORE-1519: Fix issue when switching between old and new versions of HarperDB we are getting the config parameter is undefined error on npm install. **Broad NodeJS and Platform Support** -* CORE-1624: HarperDB can now run on multiple versions of NodeJS, from v14 to v19. We primarily test on v18, so that is the preferred version. + +- CORE-1624: HarperDB can now run on multiple versions of NodeJS, from v14 to v19. We primarily test on v18, so that is the preferred version. **Windows 10 and 11** -* CORE-1088: HarperDB now runs natively on Windows 10 and 11 without the need to run in a container or installed in WSL. Windows is only intended for evaluation and development purposes, not for production work loads. + +- CORE-1088: HarperDB now runs natively on Windows 10 and 11 without the need to run in a container or installed in WSL. Windows is only intended for evaluation and development purposes, not for production work loads. **Extra Changes and Bug Fixes** -* CORE-1520: Refactor installer to remove all waterfall code and update to use Promises. -* CORE-1573: Stop the PM2 daemon and any logging processes when stopping hdb. -* CORE-1586: When HarperDB is running in foreground stop any additional logging processes from being spawned. -* CORE-1626: Update docker file to accommodate new `harperdb.conf` file. -* CORE-1592, CORE-1526, CORE-1660, CORE-1646, CORE-1640, CORE-1689, CORE-1711, CORE-1601, CORE-1726, CORE-1728, CORE-1736, CORE-1735, CORE-1745, CORE-1729, CORE-1748, CORE-1644, CORE-1750, CORE-1757, CORE-1727, CORE-1740, CORE-1730, CORE-1777, CORE-1778, CORE-1782, CORE-1775, CORE-1771, CORE-1774, CORE-1759, CORE-1772, CORE-1861, CORE-1862, CORE-1863, CORE-1870, CORE-1869:Changes for CI/CD pipeline and integration tests. -* CORE-1661: Fixed issue where old boot properties file caused an error when attempting to install 4.0.0. -* CORE-1697, CORE-1814, CORE-1855: Upgrade fastify dependency to new major version 4. -* CORE-1629: Jobs are now running as processes managed by the PM2 daemon. -* CORE-1733: Update LICENSE to reflect our EULA on our site. -* CORE-1606: Enable Custom Functions by default. -* CORE-1714: Include pre-built binaries for most common platforms (darwin-arm64, darwin-x64, linux-arm64, linux-x64, win32-x64). -* CORE-1628: Fix issue where setting license through environment variable not working. -* CORE-1602, CORE-1760, CORE-1838, CORE-1839, CORE-1847, CORE-1773: HarperDB Docker container improvements. -* CORE-1706: Add support for encoding HTTP responses with MessagePack. -* CORE-1709: Improve the way lmdb.js dependencies are installed. -* CORE-1758: Remove/update unnecessary HTTP headers. -* CORE-1756: On `npm install` and `harperdb install` change the node version check from an error to a warning if the installed Node.js version does not match our preferred version. -* CORE-1791: Optimizations to authenticated user caching. -* CORE-1794: Update README to discuss Windows support & Node.js versions -* CORE-1837: Fix issue where Custom Function directory was not being created on install. -* CORE-1742: Add more validation to audit log - check schema/table exists and log is enabled. -* CORE-1768: Fix issue where when running in foreground HarperDB process is not stopping on `harperdb stop`. -* CORE-1864: Fix to semver checks on upgrade. -* CORE-1850: Fix issue where a `cluster_user` type role could not be altered. + +- CORE-1520: Refactor installer to remove all waterfall code and update to use Promises. +- CORE-1573: Stop the PM2 daemon and any logging processes when stopping hdb. +- CORE-1586: When HarperDB is running in foreground stop any additional logging processes from being spawned. +- CORE-1626: Update docker file to accommodate new `harperdb.conf` file. +- CORE-1592, CORE-1526, CORE-1660, CORE-1646, CORE-1640, CORE-1689, CORE-1711, CORE-1601, CORE-1726, CORE-1728, CORE-1736, CORE-1735, CORE-1745, CORE-1729, CORE-1748, CORE-1644, CORE-1750, CORE-1757, CORE-1727, CORE-1740, CORE-1730, CORE-1777, CORE-1778, CORE-1782, CORE-1775, CORE-1771, CORE-1774, CORE-1759, CORE-1772, CORE-1861, CORE-1862, CORE-1863, CORE-1870, CORE-1869:Changes for CI/CD pipeline and integration tests. +- CORE-1661: Fixed issue where old boot properties file caused an error when attempting to install 4.0.0. +- CORE-1697, CORE-1814, CORE-1855: Upgrade fastify dependency to new major version 4. +- CORE-1629: Jobs are now running as processes managed by the PM2 daemon. +- CORE-1733: Update LICENSE to reflect our EULA on our site. +- CORE-1606: Enable Custom Functions by default. +- CORE-1714: Include pre-built binaries for most common platforms (darwin-arm64, darwin-x64, linux-arm64, linux-x64, win32-x64). +- CORE-1628: Fix issue where setting license through environment variable not working. +- CORE-1602, CORE-1760, CORE-1838, CORE-1839, CORE-1847, CORE-1773: HarperDB Docker container improvements. +- CORE-1706: Add support for encoding HTTP responses with MessagePack. +- CORE-1709: Improve the way lmdb.js dependencies are installed. +- CORE-1758: Remove/update unnecessary HTTP headers. +- CORE-1756: On `npm install` and `harperdb install` change the node version check from an error to a warning if the installed Node.js version does not match our preferred version. +- CORE-1791: Optimizations to authenticated user caching. +- CORE-1794: Update README to discuss Windows support & Node.js versions +- CORE-1837: Fix issue where Custom Function directory was not being created on install. +- CORE-1742: Add more validation to audit log - check schema/table exists and log is enabled. +- CORE-1768: Fix issue where when running in foreground HarperDB process is not stopping on `harperdb stop`. +- CORE-1864: Fix to semver checks on upgrade. +- CORE-1850: Fix issue where a `cluster_user` type role could not be altered. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.1.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.1.md index 9e148e63..2a85f511 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.1.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.1.md @@ -4,9 +4,10 @@ sidebar_position: 59998 --- ### HarperDB 4.0.1, Tucker Release + 01/20/2023 **Bug Fixes** -* CORE-1992 Local studio was not loading because the path got mangled in the build. -* CORE-2001 Fixed deploy_custom_function_project after node update broke it. +- CORE-1992 Local studio was not loading because the path got mangled in the build. +- CORE-2001 Fixed deploy_custom_function_project after node update broke it. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.2.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.2.md index b65d1427..bedbd970 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.2.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.2.md @@ -4,9 +4,10 @@ sidebar_position: 59997 --- ### HarperDB 4.0.2, Tucker Release + 01/24/2023 **Bug Fixes** -* CORE-2003 Fix bug where if machine had one core thread config would default to zero. -* Update to lmdb 2.7.3 and msgpackr 1.7.0 +- CORE-2003 Fix bug where if machine had one core thread config would default to zero. +- Update to lmdb 2.7.3 and msgpackr 1.7.0 diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.3.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.3.md index 67aaae56..ad1cbf8a 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.3.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.3.md @@ -4,8 +4,9 @@ sidebar_position: 59996 --- ### HarperDB 4.0.3, Tucker Release + 01/26/2023 **Bug Fixes** -* CORE-2007 Add update nodes 4.0.0 launch script to build script to fix clustering upgrade. +- CORE-2007 Add update nodes 4.0.0 launch script to build script to fix clustering upgrade. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.4.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.4.md index 2a30c9d1..3f052465 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.4.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.4.md @@ -4,8 +4,9 @@ sidebar_position: 59995 --- ### HarperDB 4.0.4, Tucker Release + 01/27/2023 **Bug Fixes** -* CORE-2009 Fixed bug where add node was not being called when upgrading clustering. \ No newline at end of file +- CORE-2009 Fixed bug where add node was not being called when upgrading clustering. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.5.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.5.md index dc66721f..1696d6d4 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.5.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.5.md @@ -4,11 +4,11 @@ sidebar_position: 59994 --- ### HarperDB 4.0.5, Tucker Release + 02/15/2023 **Bug Fixes** -* CORE-2029 Improved the upgrade process for handling existing user TLS certificates and correctly configuring TLS settings. Added a prompt to upgrade to determine if new certificates should be created or existing certificates should be kept/used. -* Fix the way NATS connections are honored in a local environment. -* Do not define the certificate authority path to NATS if it is not defined in the HarperDB config. - +- CORE-2029 Improved the upgrade process for handling existing user TLS certificates and correctly configuring TLS settings. Added a prompt to upgrade to determine if new certificates should be created or existing certificates should be kept/used. +- Fix the way NATS connections are honored in a local environment. +- Do not define the certificate authority path to NATS if it is not defined in the HarperDB config. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.6.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.6.md index bf97d148..1cdc1bd7 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.6.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.6.md @@ -4,8 +4,9 @@ sidebar_position: 59993 --- ### HarperDB 4.0.6, Tucker Release + 03/09/2023 **Bug Fixes** -* Fixed a data serialization error that occurs when a large number of different record structures are persisted in a single table. +- Fixed a data serialization error that occurs when a large number of different record structures are persisted in a single table. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.7.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.7.md index 7d48666a..c4d1fbbf 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.7.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.0.7.md @@ -4,8 +4,9 @@ sidebar_position: 59992 --- ### HarperDB 4.0.7, Tucker Release + 03/10/2023 **Bug Fixes** -* Update lmdb.js dependency \ No newline at end of file +- Update lmdb.js dependency diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.1.0.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.1.0.md index 49c45741..416cda0d 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.1.0.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.1.0.md @@ -25,39 +25,39 @@ Updates to S3 import and export mean that these operations now require the bucke Due to the AWS SDK v2 reaching end of life support we have updated to v3. This has caused some breaking changes in our operations `import_from_s3` and `export_to_s3`: -* A new attribute `region` will need to be supplied -* The `bucket` attribute can no longer have trailing slashes. Slashes will now need to be in the `key`. +- A new attribute `region` will need to be supplied +- The `bucket` attribute can no longer have trailing slashes. Slashes will now need to be in the `key`. Starting HarperDB without any command (just `harperdb`) now runs HarperDB like a standard process, in the foreground. This means you can use standard unix tooling for interacting with the process and is conducive for running HarperDB with systemd or any other process management tool. If you wish to have HarperDB launch itself in separate background process (and immediately terminate the shell process), you can do so by running `harperdb start`. Internal Tickets completed: -* CORE-609 - Ensure that attribute names are always added to global schema as Strings -* CORE-1549 - Remove fastify-static code from Custom Functions server which auto serves content from "static" folder -* CORE-1655 - Iterator based queries -* CORE-1764 - Fix issue where describe\_all operation returns an empty object for non super-users if schema(s) do not yet have table(s) -* CORE-1854 - Switch to using worker threads instead of processes for handling concurrency -* CORE-1877 - Extend the csv\_url\_load operation to allow for additional headers to be passed to the remote server when the csv is being downloaded -* CORE-1893 - Add last updated timestamp to describe operations -* CORE-1896 - Fix issue where Select \* from system.hdb\_info returns wrong HDB version number after Instance Upgrade -* CORE-1904 - Fix issue when executing GEOJSON query in SQL -* CORE-1905 - Add HarperDB YAML configuration setting which defines the storage location of NATS streams -* CORE-1906 - Add HarperDB YAML configuration setting defining the storage location of tables. -* CORE-1655 - Streaming binary format serialization -* CORE-1943 - Add configuration option to set mount point for audit tables -* CORE-1921 - Update NATS transaction lifecycle to handle message deduplication in work queue streams. -* CORE-1963 - Update logging for better readability, reduced duplication, and request context information. -* CORE-1968 - In server\nats\natsIngestService.js remove the js\_msg.working(); line to improve performance. -* CORE-1976 - Fix error when calling describe\_table operation with no schema or table defined in payload. -* CORE-1983 - Fix issue where create\_attribute operation does not validate request for required attributes -* CORE-2015 - Remove PM2 logs that get logged in console when starting HDB -* CORE-2048 - systemd script for 4.1 -* CORE-2052 - Include thread information in system\_information for visibility of threads -* CORE-2061 - Add a better error msg when clustering is enabled without a cluster user set -* CORE-2068 - Create new log rotate logic since pm2 log-rotate no longer used -* CORE-2072 - Update to Node 18.15.0 -* CORE-2090 - Upgrade Testing from v4.0.x and v3.x to v4.1. -* CORE-2091 - Run the performance tests -* CORE-2092 - Allow for automatic patch version updates of certain packages -* CORE-2109 - Add verify option to clustering TLS configuration -* CORE-2111 - Update AWS SDK to v3 +- CORE-609 - Ensure that attribute names are always added to global schema as Strings +- CORE-1549 - Remove fastify-static code from Custom Functions server which auto serves content from "static" folder +- CORE-1655 - Iterator based queries +- CORE-1764 - Fix issue where describe_all operation returns an empty object for non super-users if schema(s) do not yet have table(s) +- CORE-1854 - Switch to using worker threads instead of processes for handling concurrency +- CORE-1877 - Extend the csv_url_load operation to allow for additional headers to be passed to the remote server when the csv is being downloaded +- CORE-1893 - Add last updated timestamp to describe operations +- CORE-1896 - Fix issue where Select \* from system.hdb_info returns wrong HDB version number after Instance Upgrade +- CORE-1904 - Fix issue when executing GEOJSON query in SQL +- CORE-1905 - Add HarperDB YAML configuration setting which defines the storage location of NATS streams +- CORE-1906 - Add HarperDB YAML configuration setting defining the storage location of tables. +- CORE-1655 - Streaming binary format serialization +- CORE-1943 - Add configuration option to set mount point for audit tables +- CORE-1921 - Update NATS transaction lifecycle to handle message deduplication in work queue streams. +- CORE-1963 - Update logging for better readability, reduced duplication, and request context information. +- CORE-1968 - In server\nats\natsIngestService.js remove the js_msg.working(); line to improve performance. +- CORE-1976 - Fix error when calling describe_table operation with no schema or table defined in payload. +- CORE-1983 - Fix issue where create_attribute operation does not validate request for required attributes +- CORE-2015 - Remove PM2 logs that get logged in console when starting HDB +- CORE-2048 - systemd script for 4.1 +- CORE-2052 - Include thread information in system_information for visibility of threads +- CORE-2061 - Add a better error msg when clustering is enabled without a cluster user set +- CORE-2068 - Create new log rotate logic since pm2 log-rotate no longer used +- CORE-2072 - Update to Node 18.15.0 +- CORE-2090 - Upgrade Testing from v4.0.x and v3.x to v4.1. +- CORE-2091 - Run the performance tests +- CORE-2092 - Allow for automatic patch version updates of certain packages +- CORE-2109 - Add verify option to clustering TLS configuration +- CORE-2111 - Update AWS SDK to v3 diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.1.1.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.1.1.md index 537ef71c..54163b63 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.1.1.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.1.1.md @@ -7,9 +7,9 @@ sidebar_position: 59898 06/16/2023 -* HarperDB uses improved logic for determining default heap limits and thread counts. When running in a restricted container and on NodeJS 18.15+, HarperDB will use the constrained memory limit to determine heap limits for each thread. In more memory constrained servers with many CPU cores, a reduced default thread count will be used to ensure that excessive memory is not used by many workers. You may still define your own thread count (with `http`/`threads`) in the [configuration](../../../deployments/configuration). -* An option has been added for [disabling the republishing NATS messages](../../../deployments/configuration), which can provide improved replication performance in a fully connected network. -* Improvements to our OpenShift container. -* Dependency security updates. -* **Bug Fixes** -* Fixed a bug in reporting database metrics in the `system_information` operation. +- HarperDB uses improved logic for determining default heap limits and thread counts. When running in a restricted container and on NodeJS 18.15+, HarperDB will use the constrained memory limit to determine heap limits for each thread. In more memory constrained servers with many CPU cores, a reduced default thread count will be used to ensure that excessive memory is not used by many workers. You may still define your own thread count (with `http`/`threads`) in the [configuration](../../../deployments/configuration). +- An option has been added for [disabling the republishing NATS messages](../../../deployments/configuration), which can provide improved replication performance in a fully connected network. +- Improvements to our OpenShift container. +- Dependency security updates. +- **Bug Fixes** +- Fixed a bug in reporting database metrics in the `system_information` operation. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.1.2.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.1.2.md index 2a62db64..fc5e16f4 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.1.2.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.1.2.md @@ -4,10 +4,10 @@ sidebar_position: 59897 --- ### HarperDB 4.1.2, Tucker Release -06/16/2023 -* HarperDB has updated binary dependencies to support older glibc versions back 2.17. -* A new CLI command was added to get the current status of whether HarperDB is running and the cluster status. This is available with `harperdb status`. -* Improvements to our OpenShift container. -* Dependency security updates. +06/16/2023 +- HarperDB has updated binary dependencies to support older glibc versions back 2.17. +- A new CLI command was added to get the current status of whether HarperDB is running and the cluster status. This is available with `harperdb status`. +- Improvements to our OpenShift container. +- Dependency security updates. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.0.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.0.md index a57a9781..e13d1cbe 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.0.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.0.md @@ -65,24 +65,24 @@ There have been significant changes to `harperdb-config.yaml`, however none of t `harperdb-config.yaml` has had some configuration values added, removed, renamed and defaults changed. Please refer to [harperdb-config.yaml](../../../deployments/configuration) for the most current configuration parameters. -* The `http` element has been expanded. - * `compressionThreshold` was added. - * All `customFunction` configuration now lives here, except for the `tls` section. -* `threads` has moved out of the `http` element and now is its own top level element. -* `authentication` section was moved out of the `operationsApi` section and is now its own top level element/section. -* `analytics.aggregatePeriod` was added. -* Default logging level was changed to `warn`. -* Default clustering log level was changed to `info`. -* `clustering.republishMessages` now defaults to `false`. -* `operationsApi.foreground` was removed. To start HarperDB in the foreground, from the CLI run `harperdb`. -* Made `operationsApi` configuration optional. Any config not defined here will default to the `http` section. -* Added a `securePort` parameter to `operationsApi` and `http` used for setting the https port. -* Added a new top level `tls` section. -* Removed `customFunctions.enabled`, `customFunctions.network.https`, `operationsApi.network.https` and `operationsApi.nodeEnv`. -* Added an element called `componentRoot` which replaces `customFunctions.root`. -* Updated custom pathing to use `databases` instead of `schemas`. -* Added `logging.auditAuthEvents.logFailed` and `logging.auditAuthEvents.logSuccessful` for enabling logging of auth events. -* A new `mqtt` section was added. +- The `http` element has been expanded. + - `compressionThreshold` was added. + - All `customFunction` configuration now lives here, except for the `tls` section. +- `threads` has moved out of the `http` element and now is its own top level element. +- `authentication` section was moved out of the `operationsApi` section and is now its own top level element/section. +- `analytics.aggregatePeriod` was added. +- Default logging level was changed to `warn`. +- Default clustering log level was changed to `info`. +- `clustering.republishMessages` now defaults to `false`. +- `operationsApi.foreground` was removed. To start HarperDB in the foreground, from the CLI run `harperdb`. +- Made `operationsApi` configuration optional. Any config not defined here will default to the `http` section. +- Added a `securePort` parameter to `operationsApi` and `http` used for setting the https port. +- Added a new top level `tls` section. +- Removed `customFunctions.enabled`, `customFunctions.network.https`, `operationsApi.network.https` and `operationsApi.nodeEnv`. +- Added an element called `componentRoot` which replaces `customFunctions.root`. +- Updated custom pathing to use `databases` instead of `schemas`. +- Added `logging.auditAuthEvents.logFailed` and `logging.auditAuthEvents.logSuccessful` for enabling logging of auth events. +- A new `mqtt` section was added. ### Socket Management diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.1.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.1.md index 38617ca9..c792a637 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.1.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.1.md @@ -4,10 +4,11 @@ sidebar_position: 59798 --- ### HarperDB 4.2.1, Tucker Release + 11/3/2023 -* Downgrade NATS 2.10.3 back to 2.10.1 due to regression in connection handling. -* Handle package names with underscores. -* Improved validation of queries and comparators -* Avoid double replication on transactions with multiple commits -* Added file metadata on get_component_file +- Downgrade NATS 2.10.3 back to 2.10.1 due to regression in connection handling. +- Handle package names with underscores. +- Improved validation of queries and comparators +- Avoid double replication on transactions with multiple commits +- Added file metadata on get_component_file diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.2.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.2.md index 15768374..9cfa957e 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.2.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.2.md @@ -4,12 +4,13 @@ sidebar_position: 59797 --- ### HarperDB 4.2.2, Tucker Release + 11/8/2023 -* Increase timeouts for NATS connections. -* Fix for database snapshots for backups (and for clone node). -* Fix application of permissions for default tables exposed through REST. -* Log replication failures with record information. -* Fix application of authorization/permissions for MQTT commands. -* Fix copying of local components in clone node. -* Fix calculation of overlapping start time in clone node. \ No newline at end of file +- Increase timeouts for NATS connections. +- Fix for database snapshots for backups (and for clone node). +- Fix application of permissions for default tables exposed through REST. +- Log replication failures with record information. +- Fix application of authorization/permissions for MQTT commands. +- Fix copying of local components in clone node. +- Fix calculation of overlapping start time in clone node. diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.3.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.3.md index dab25c3d..edecd686 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.3.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.3.md @@ -4,10 +4,11 @@ sidebar_position: 59796 --- ### HarperDB 4.2.3, Tucker Release + 11/15/2023 -* When setting setting securePort, disable unsecure port setting on same port -* Fix `harperdb status` when pid file is missing -* Fix/include missing icons/fonts from local studio -* Fix crash that can occur when concurrently accessing records > 16KB -* Apply a lower heap limit to better ensure that memory leaks are quickly caught/mitigated \ No newline at end of file +- When setting setting securePort, disable unsecure port setting on same port +- Fix `harperdb status` when pid file is missing +- Fix/include missing icons/fonts from local studio +- Fix crash that can occur when concurrently accessing records > 16KB +- Apply a lower heap limit to better ensure that memory leaks are quickly caught/mitigated diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.4.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.4.md index 87ee241d..14d268b5 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.4.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.4.md @@ -4,7 +4,8 @@ sidebar_position: 59795 --- ### HarperDB 4.2.4, Tucker Release + 11/16/2023 -* Prevent coercion of strings to numbers in SQL queries (in WHERE clause) -* Address fastify deprecation warning about accessing config \ No newline at end of file +- Prevent coercion of strings to numbers in SQL queries (in WHERE clause) +- Address fastify deprecation warning about accessing config diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.5.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.5.md index 1172c4b3..1b6bf143 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.5.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.5.md @@ -4,9 +4,10 @@ sidebar_position: 59794 --- ### HarperDB 4.2.5, Tucker Release + 11/22/2023 -* Disable compression on server-sent events to ensure messages are immediately sent (not queued for later deliver) -* Update geoNear function to tolerate null values -* lmdb-js fix to ensure prefetched keys are pinned in memory until retrieved -* Add header to indicate start of a new authenticated session (for studio to identify authenticated sessions) +- Disable compression on server-sent events to ensure messages are immediately sent (not queued for later deliver) +- Update geoNear function to tolerate null values +- lmdb-js fix to ensure prefetched keys are pinned in memory until retrieved +- Add header to indicate start of a new authenticated session (for studio to identify authenticated sessions) diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.6.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.6.md index d0a1f177..50abde53 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.6.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.6.md @@ -4,7 +4,8 @@ sidebar_position: 59793 --- ### HarperDB 4.2.6, Tucker Release + 11/29/2023 -* Update various geo SQL functions to tolerate invalid values -* Properly report component installation/load errors in `get_components` (for studio to load components after an installation failure) \ No newline at end of file +- Update various geo SQL functions to tolerate invalid values +- Properly report component installation/load errors in `get_components` (for studio to load components after an installation failure) diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.7.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.7.md index 78bfcaa7..5d75e134 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.7.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.7.md @@ -4,8 +4,9 @@ sidebar_position: 59792 --- ### HarperDB 4.2.7 + 12/6/2023 -* Add support for cloning over the top of an existing HarperDB instance -* Add health checks for NATS consumer with ability to restart consumer loops for better resiliency -* Revert Fastify autoload module due to a regression that had caused EcmaScript modules for Fastify route modules to fail to load on Windows \ No newline at end of file +- Add support for cloning over the top of an existing HarperDB instance +- Add health checks for NATS consumer with ability to restart consumer loops for better resiliency +- Revert Fastify autoload module due to a regression that had caused EcmaScript modules for Fastify route modules to fail to load on Windows diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.8.md b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.8.md index fbe94b69..21127797 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.8.md +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/4.2.8.md @@ -4,11 +4,12 @@ sidebar_position: 59791 --- ### HarperDB 4.2.8 + 12/19/2023 -* Added support CLI command line arguments for clone node -* Added support for cloning a node without enabling clustering -* Clear NATS client cache on closed event -* Fix check for attribute permissions so that an empty attribute permissions array is treated as a table level permission definition -* Improve speed of cross-node health checks -* Fix for using `database` in describe operations +- Added support CLI command line arguments for clone node +- Added support for cloning a node without enabling clustering +- Clear NATS client cache on closed event +- Fix check for attribute permissions so that an empty attribute permissions array is treated as a table level permission definition +- Improve speed of cross-node health checks +- Fix for using `database` in describe operations diff --git a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/_category_.json b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/_category_.json index 9a7bca50..d20b2f9a 100644 --- a/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/_category_.json +++ b/site/versioned_docs/version-4.2/technical-details/release-notes/v4-tucker/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Tucker (Version 4)", - "position": -4 -} \ No newline at end of file + "label": "HarperDB Tucker (Version 4)", + "position": -4 +} diff --git a/site/versioned_docs/version-4.3/administration/_category_.json b/site/versioned_docs/version-4.3/administration/_category_.json index 828e0998..59c33ea4 100644 --- a/site/versioned_docs/version-4.3/administration/_category_.json +++ b/site/versioned_docs/version-4.3/administration/_category_.json @@ -1,12 +1,10 @@ { - "label": "Administration", - "position": 2, - "link": { - "type": "generated-index", - "title": "Administration Documentation", - "description": "Guides for managing and administering HarperDB instances", - "keywords": [ - "administration" - ] - } -} \ No newline at end of file + "label": "Administration", + "position": 2, + "link": { + "type": "generated-index", + "title": "Administration Documentation", + "description": "Guides for managing and administering HarperDB instances", + "keywords": ["administration"] + } +} diff --git a/site/versioned_docs/version-4.3/administration/administration.md b/site/versioned_docs/version-4.3/administration/administration.md index 462c089a..f6bc7180 100644 --- a/site/versioned_docs/version-4.3/administration/administration.md +++ b/site/versioned_docs/version-4.3/administration/administration.md @@ -10,9 +10,9 @@ HarperDB is designed for minimal administrative effort, and with managed service As a distributed database, data protection and recovery can benefit from different data protection strategies than a traditional single-server database. But multiple aspects of data protection and recovery should be considered: -* Availability: As a distributed database HarperDB is intrinsically built for high-availability and a cluster will continue to run even with complete server(s) failure. This is the first and primary defense for protecting against any downtime or data loss. HarperDB provides fast horizontal scaling functionality with node cloning, which facilitates ease of establishing high availability clusters. -* [Audit log](./logging/audit-logging): HarperDB defaults to tracking data changes so malicious data changes can be found, attributed, and reverted. This provides security-level defense against data loss, allowing for fine-grained isolation and reversion of individual data without the large-scale reversion/loss of data associated with point-in-time recovery approaches. -* Snapshots: When used as a source-of-truth database for crucial data, we recommend using snapshot tools to regularly snapshot databases as a final backup/defense against data loss (this should only be used as a last resort in recovery). HarperDB has a [`get_backup`](../developers/operations-api/databases-and-tables#get-backup) operation, which provides direct support for making and retrieving database snapshots. An HTTP request can be used to get a snapshot. Alternatively, volume snapshot tools can be used to snapshot data at the OS/VM level. HarperDB can also provide scripts for replaying transaction logs from snapshots to facilitate point-in-time recovery when necessary (often customization may be preferred in certain recovery situations to minimize data loss). +- Availability: As a distributed database HarperDB is intrinsically built for high-availability and a cluster will continue to run even with complete server(s) failure. This is the first and primary defense for protecting against any downtime or data loss. HarperDB provides fast horizontal scaling functionality with node cloning, which facilitates ease of establishing high availability clusters. +- [Audit log](./logging/audit-logging): HarperDB defaults to tracking data changes so malicious data changes can be found, attributed, and reverted. This provides security-level defense against data loss, allowing for fine-grained isolation and reversion of individual data without the large-scale reversion/loss of data associated with point-in-time recovery approaches. +- Snapshots: When used as a source-of-truth database for crucial data, we recommend using snapshot tools to regularly snapshot databases as a final backup/defense against data loss (this should only be used as a last resort in recovery). HarperDB has a [`get_backup`](../developers/operations-api/databases-and-tables#get-backup) operation, which provides direct support for making and retrieving database snapshots. An HTTP request can be used to get a snapshot. Alternatively, volume snapshot tools can be used to snapshot data at the OS/VM level. HarperDB can also provide scripts for replaying transaction logs from snapshots to facilitate point-in-time recovery when necessary (often customization may be preferred in certain recovery situations to minimize data loss). ### Horizontal Scaling with Node Cloning @@ -21,10 +21,11 @@ HarperDB provides rapid horizontal scaling capabilities through [node cloning fu ### Monitoring HarperDB provides robust capabilities for analytics and observability to facilitate effective and informative monitoring: -* Analytics provides statistics on usage, request counts, load, memory usage with historical tracking. The analytics data can be [accessed through querying](../technical-details/reference/analytics). -* A large variety of real-time statistics about load, system information, database metrics, thread usage can be retrieved through the [`system_information` API](../developers/operations-api/utilities). -* Information about the current cluster configuration and status can be found in the [cluster APIs](../developers/operations-api/clustering). -* Analytics and system information can easily be exported to Prometheus with our [Prometheus exporter component](https://github.com/HarperDB-Add-Ons/prometheus_exporter), making it easy visualize and monitor HarperDB with Graphana. + +- Analytics provides statistics on usage, request counts, load, memory usage with historical tracking. The analytics data can be [accessed through querying](../technical-details/reference/analytics). +- A large variety of real-time statistics about load, system information, database metrics, thread usage can be retrieved through the [`system_information` API](../developers/operations-api/utilities). +- Information about the current cluster configuration and status can be found in the [cluster APIs](../developers/operations-api/clustering). +- Analytics and system information can easily be exported to Prometheus with our [Prometheus exporter component](https://github.com/HarperDB-Add-Ons/prometheus_exporter), making it easy visualize and monitor HarperDB with Graphana. ### Replication Transaction Logging diff --git a/site/versioned_docs/version-4.3/administration/cloning.md b/site/versioned_docs/version-4.3/administration/cloning.md index 8d8351a7..f6a7db21 100644 --- a/site/versioned_docs/version-4.3/administration/cloning.md +++ b/site/versioned_docs/version-4.3/administration/cloning.md @@ -4,10 +4,10 @@ title: Clone Node # Clone Node -Clone node is a configurable node script that when pointed to another instance of HarperDB will create a clone of that -instance's config, databases and setup replication. If it is run in a location where there is no existing HarperDB install, +Clone node is a configurable node script that when pointed to another instance of HarperDB will create a clone of that +instance's config, databases and setup replication. If it is run in a location where there is no existing HarperDB install, it will, along with cloning, install HarperDB. If it is run in a location where there is another HarperDB instance, it will -only clone config, databases and replication that do not already exist. +only clone config, databases and replication that do not already exist. Clone node is triggered when HarperDB is installed or started with certain environment or command line (CLI) variables set (see below). @@ -18,34 +18,36 @@ To start clone run `harperdb` in the CLI with either of the following variables #### Environment variables -* `HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). -* `HDB_LEADER_USERNAME` - The leader node admin username. -* `HDB_LEADER_PASSWORD` - The leader node admin password. -* `HDB_LEADER_CLUSTERING_HOST` - _(optional)_ The leader clustering host. This value will be added to the clustering routes on the clone node. If this value is not set, replication will not be set up between the leader and clone. +- `HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). +- `HDB_LEADER_USERNAME` - The leader node admin username. +- `HDB_LEADER_PASSWORD` - The leader node admin password. +- `HDB_LEADER_CLUSTERING_HOST` - _(optional)_ The leader clustering host. This value will be added to the clustering routes on the clone node. If this value is not set, replication will not be set up between the leader and clone. For example: + ``` HDB_LEADER_URL=https://node-1.my-domain.com:9925 HDB_LEADER_CLUSTERING_HOST=node-1.my-domain.com HDB_LEADER_USERNAME=... HDB_LEADER_PASSWORD=... harperdb ``` #### Command line variables -* `--HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). -* `--HDB_LEADER_USERNAME` - The leader node admin username. -* `--HDB_LEADER_PASSWORD` - The leader node admin password. -* `--HDB_LEADER_CLUSTERING_HOST` - _(optional)_ The leader clustering host. This value will be added to the clustering routes on the clone node. If this value is not set, replication will not be set up between the leader and clone. +- `--HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). +- `--HDB_LEADER_USERNAME` - The leader node admin username. +- `--HDB_LEADER_PASSWORD` - The leader node admin password. +- `--HDB_LEADER_CLUSTERING_HOST` - _(optional)_ The leader clustering host. This value will be added to the clustering routes on the clone node. If this value is not set, replication will not be set up between the leader and clone. For example: + ``` harperdb --HDB_LEADER_URL https://node-1.my-domain.com:9925 --HDB_LEADER_CLUSTERING_HOST node-1.my-domain.com --HDB_LEADER_USERNAME ... --HDB_LEADER_PASSWORD ... ``` -Each time clone is run it will set a value `cloned: true` in `harperdb-config.yaml`. This value will prevent clone from -running again. If you want to run clone again set this value to `false`. If HarperDB is started with the clone variables +Each time clone is run it will set a value `cloned: true` in `harperdb-config.yaml`. This value will prevent clone from +running again. If you want to run clone again set this value to `false`. If HarperDB is started with the clone variables still present and `cloned` is true, HarperDB will just start as normal. -Clone node does not require any additional configuration apart from the variables referenced above. -However, if you wish to set any configuration during clone this can be done by passing the config as environment/CLI +Clone node does not require any additional configuration apart from the variables referenced above. +However, if you wish to set any configuration during clone this can be done by passing the config as environment/CLI variables or cloning overtop of an existing harperdb-config.yaml file. More can be found in the HarperDB config documentation [here](../deployments/configuration). @@ -57,10 +59,10 @@ _Note: because node name must be unique, clone will auto-generate one unless one To set any specific (optional) clone config, including the exclusion of any database, components or replication, there is a file called `clone-node-config.yaml` that can be used. -The file must be located in the `ROOTPATH` directory of your clone (the `hdb` directory where you clone will be installed. +The file must be located in the `ROOTPATH` directory of your clone (the `hdb` directory where you clone will be installed. If the directory does not exist, create one and add the file to it). -The config available in `clone-node-config.yaml` is: +The config available in `clone-node-config.yaml` is: ```yaml databaseConfig: @@ -76,18 +78,18 @@ clusteringConfig: publishToLeaderNode: true subscribeToLeaderNode: true excludeDatabases: - - database: null + - database: null excludeTables: - - database: null - table: null + - database: null + table: null ``` -_Note: only include the configuration that you are using. If no clone config file is provided nothing will be excluded, +_Note: only include the configuration that you are using. If no clone config file is provided nothing will be excluded, unless it already exists on the clone._ `databaseConfig` - Set any databases or tables that you wish to exclude from cloning. -`componentConfig` - Set any components that you do not want cloned. Clone node will not clone the component code, +`componentConfig` - Set any components that you do not want cloned. Clone node will not clone the component code, it will only clone the component reference that exists in the leader harperdb-config file. `clusteringConfig` - Set the replication setup to establish with the other nodes (default is `true` & `true`) and @@ -95,9 +97,9 @@ set any databases or tables that you wish to exclude from clustering. ### Cloning configuration -Clone node will not clone any configuration that is classed as unique to the leader node. This includes `clustering.nodeName`, -`rootPath` and any other path related values, for example `storage.path`, `logging.root`, `componentsRoot`, -any authentication certificate/key paths. +Clone node will not clone any configuration that is classed as unique to the leader node. This includes `clustering.nodeName`, +`rootPath` and any other path related values, for example `storage.path`, `logging.root`, `componentsRoot`, +any authentication certificate/key paths. **Clustering Routes** @@ -106,42 +108,43 @@ host name of the clone operating system. To manually set a host use the variable `HDB_CLONE_CLUSTERING_HOST`. -To disable the setting of the route set `HDB_SET_CLUSTERING_HOST` to `false`. +To disable the setting of the route set `HDB_SET_CLUSTERING_HOST` to `false`. ### Cloning system database -HarperDB uses a database called `system` to store operational information. Clone node will only clone the user and role +HarperDB uses a database called `system` to store operational information. Clone node will only clone the user and role tables from this database. It will also set up replication on this table, which means that any existing and future user and roles that are added will be replicated throughout the cluster. -Cloning the user and role tables means that once clone node is complete, the clone will share the same login credentials with +Cloning the user and role tables means that once clone node is complete, the clone will share the same login credentials with the leader. ### Fully connected clone -A fully connected topology is when all nodes are replicating (publish and subscribing) with all other nodes. -A fully connected clone maintains this topology with addition of the new node. When a clone is created, -replication is added between the leader and the clone and any nodes the leader is replicating with. For example, +A fully connected topology is when all nodes are replicating (publish and subscribing) with all other nodes. +A fully connected clone maintains this topology with addition of the new node. When a clone is created, +replication is added between the leader and the clone and any nodes the leader is replicating with. For example, if the leader is replicating with node-a and node-b, the clone will replicate with the leader, node-a and node-b. To run clone node with the fully connected option simply pass the environment variable `HDB_FULLY_CONNECTED=true` or CLI variable `--HDB_FULLY_CONNECTED true`. ### Cloning overtop of an existing HarperDB instance -Clone node will not overwrite any existing config, database or replication. It will write/clone any config database or replication -that does not exist on the node it is running on. +Clone node will not overwrite any existing config, database or replication. It will write/clone any config database or replication +that does not exist on the node it is running on. -An example of how this can be useful is if you want to set HarperDB config before the clone is created. To do this you -would create a harperdb-config.yaml file in your local `hdb` root directory with the config you wish to set. Then +An example of how this can be useful is if you want to set HarperDB config before the clone is created. To do this you +would create a harperdb-config.yaml file in your local `hdb` root directory with the config you wish to set. Then when clone is run it will append the missing config to the file and install HarperDB with the desired config. -Another useful example could be retroactively adding another database to an existing instance. Running clone on -an existing instance could create a full clone of another database and set up replication between the database on the +Another useful example could be retroactively adding another database to an existing instance. Running clone on +an existing instance could create a full clone of another database and set up replication between the database on the leader and the clone. ### Cloning steps Clone node will execute the following steps when ran: + 1. Look for an existing HarperDB install. It does this by using the default (or user provided) `ROOTPATH`. 1. If an existing instance is found it will check for a `harperdb-config.yaml` file and search for the `cloned` value. If the value exists and is `true` clone will skip the clone logic and start HarperDB. 1. Clone harperdb-config.yaml values that don't already exist (excluding values unique to the leader node). diff --git a/site/versioned_docs/version-4.3/administration/compact.md b/site/versioned_docs/version-4.3/administration/compact.md index ca2aaf57..00c27307 100644 --- a/site/versioned_docs/version-4.3/administration/compact.md +++ b/site/versioned_docs/version-4.3/administration/compact.md @@ -4,14 +4,14 @@ title: Compact a database # Compact a database -Database files can grow quickly as you use them, sometimes impeding performance. +Database files can grow quickly as you use them, sometimes impeding performance. HarperDB has multiple compact features that can be used to reduce database file size and potentially improve performance. The compact process does not compress your data, it instead makes your database file smaller by eliminating free-space and fragmentation. There are two options that HarperDB offers for compacting a Database. -_Note: Some of the storage configuration (such as compression) cannot be updated on existing databases, -this is where the following options are useful. They will create a new compressed copy of the database with any updated configuration._ +_Note: Some of the storage configuration (such as compression) cannot be updated on existing databases, +this is where the following options are useful. They will create a new compressed copy of the database with any updated configuration._ More information on the storage configuration options can be [found here](../deployments/configuration#storage) @@ -19,7 +19,7 @@ More information on the storage configuration options can be [found here](../dep It is recommended that, to prevent any record loss, HarperDB is not running when performing this operation. -This will copy a HarperDB database with compaction. If you wish to use this new database in place of the original, +This will copy a HarperDB database with compaction. If you wish to use this new database in place of the original, you will need to move/rename it to the path of the original database. This command should be run in the [CLI](../deployments/harperdb-cli) @@ -27,16 +27,18 @@ This command should be run in the [CLI](../deployments/harperdb-cli) ```bash harperdb copy-db ``` + For example, to copy the default database: + ```bash harperdb copy-db data /home/user/hdb/database/copy.mdb ``` ### Compact on start -Compact on start is a more automated option that will compact __all__ databases when HarperDB is started. HarperDB will -not start until compact is complete. Under the hood it loops through all non-system databases, -creates a backup of each one and calls copy-db. After the copy/compaction is complete it will move the new database +Compact on start is a more automated option that will compact **all** databases when HarperDB is started. HarperDB will +not start until compact is complete. Under the hood it loops through all non-system databases, +creates a backup of each one and calls copy-db. After the copy/compaction is complete it will move the new database to where the original one is located and remove any backups. Compact on start is initiated by config in harperdb-config.yaml @@ -62,4 +64,4 @@ Using CLI variables ```bash STORAGE_COMPACTONSTART=true STORAGE_COMPACTONSTARTKEEPBACKUP=true -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/create-account.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/create-account.md index 3b0f9a56..c78c4ef3 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/create-account.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/create-account.md @@ -3,24 +3,25 @@ title: Create a Studio Account --- # Create a Studio Account + Start at the [HarperDB Studio sign up page](https://studio.harperdb.io/sign-up). -1) Provide the following information: - * First Name - * Last Name - * Email Address - * Subdomain - - *Part of the URL that will be used to identify your HarperDB Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com).* - * Coupon Code (optional) -2) Review the Privacy Policy and Terms of Service. -3) Click the sign up for free button. -4) You will be taken to a new screen to add an account password. Enter your password. - *Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character.* -5) Click the add account password button. +1. Provide the following information: + - First Name + - Last Name + - Email Address + - Subdomain -You will receive a Studio welcome email confirming your registration. + _Part of the URL that will be used to identify your HarperDB Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com)._ + - Coupon Code (optional) +2. Review the Privacy Policy and Terms of Service. +3. Click the sign up for free button. +4. You will be taken to a new screen to add an account password. Enter your password. + _Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character._ +5. Click the add account password button. + +You will receive a Studio welcome email confirming your registration. -Note: Your email address will be used as your username and cannot be changed. \ No newline at end of file +Note: Your email address will be used as your username and cannot be changed. diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/enable-mixed-content.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/enable-mixed-content.md index 7a3c8524..5a198b91 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/enable-mixed-content.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/enable-mixed-content.md @@ -6,6 +6,4 @@ title: Enable Mixed Content Enabling mixed content is required in cases where you would like to connect the HarperDB Studio to HarperDB Instances via HTTP. This should not be used for production systems, but may be convenient for development and testing purposes. Doing so will allow your browser to reach HTTP traffic, which is considered insecure, through an HTTPS site like the Studio. - - A comprehensive guide is provided by Adobe [here](https://experienceleague.adobe.com/docs/target/using/experiences/vec/troubleshoot-composer/mixed-content.html). diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/index.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/index.md index 13dd6bd1..77c090d2 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/index.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/index.md @@ -3,6 +3,7 @@ title: HarperDB Studio --- # HarperDB Studio + HarperDB Studio is the web-based GUI for HarperDB. Studio enables you to administer, navigate, and monitor all of your HarperDB instances in a simple, user-friendly interface without any knowledge of the underlying HarperDB API. It’s free to sign up, get started today! [Sign up for free!](https://studio.harperdb.io/sign-up) @@ -10,8 +11,11 @@ HarperDB Studio is the web-based GUI for HarperDB. Studio enables you to adminis HarperDB now includes a simplified local Studio that is packaged with all HarperDB installations and served directly from the instance. It can be enabled in the [configuration file](../../deployments/configuration#localstudio). This section is dedicated to the hosted Studio accessed at [studio.harperdb.io](https://studio.harperdb.io). --- + ## How does Studio Work? + While HarperDB Studio is web based and hosted by us, all database interactions are performed on the HarperDB instance the studio is connected to. The HarperDB Studio loads in your browser, at which point you login to your HarperDB instances. Credentials are stored in your browser cache and are not transmitted back to HarperDB. All database interactions are made via the HarperDB Operations API directly from your browser to your instance. ## What type of instances can I manage? -HarperDB Studio enables users to manage both HarperDB Cloud instances and privately hosted instances all from a single UI. All HarperDB instances feature identical behavior whether they are hosted by us or by you. \ No newline at end of file + +HarperDB Studio enables users to manage both HarperDB Cloud instances and privately hosted instances all from a single UI. All HarperDB instances feature identical behavior whether they are hosted by us or by you. diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/instance-configuration.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/instance-configuration.md index 18ccec17..afab5107 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/instance-configuration.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/instance-configuration.md @@ -6,71 +6,63 @@ title: Instance Configuration HarperDB instance configuration can be viewed and managed directly through the HarperDB Studio. HarperDB Cloud instances can be resized in two different ways via this page, either by modifying machine RAM or by increasing drive storage. Enterprise instances can have their licenses modified by modifying licensed RAM. - - All instance configuration is handled through the **config** page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click config in the instance control bar. +4. Click config in the instance control bar. -*Note, the **config** page will only be available to super users and certain items are restricted to Studio organization owners.* +_Note, the **config** page will only be available to super users and certain items are restricted to Studio organization owners._ ## Instance Overview The **instance overview** panel displays the following instance specifications: -* Instance URL +- Instance URL -* Applications URL +- Applications URL -* Instance Node Name (for clustering) +- Instance Node Name (for clustering) -* Instance API Auth Header (this user) - - *The Basic authentication header used for the logged in HarperDB database user* +- Instance API Auth Header (this user) -* Created Date (HarperDB Cloud only) + _The Basic authentication header used for the logged in HarperDB database user_ -* Region (HarperDB Cloud only) - - *The geographic region where the instance is hosted.* +- Created Date (HarperDB Cloud only) -* Total Price +- Region (HarperDB Cloud only) -* RAM + _The geographic region where the instance is hosted._ -* Storage (HarperDB Cloud only) +- Total Price -* Disk IOPS (HarperDB Cloud only) +- RAM -## Update Instance RAM +- Storage (HarperDB Cloud only) -HarperDB Cloud instance size and Enterprise instance licenses can be modified with the following instructions. This option is only available to Studio organization owners. +- Disk IOPS (HarperDB Cloud only) +## Update Instance RAM +HarperDB Cloud instance size and Enterprise instance licenses can be modified with the following instructions. This option is only available to Studio organization owners. Note: For HarperDB Cloud instances, upgrading RAM may add additional CPUs to your instance as well. Click here to see how many CPUs are provisioned for each instance size. -1) In the **update ram** panel at the bottom left: +1. In the **update ram** panel at the bottom left: + - Select the new instance size. + - If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. + - If you do have a credit card associated, you will be presented with the updated billing information. + - Click **Upgrade**. - * Select the new instance size. - - * If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. - - * If you do have a credit card associated, you will be presented with the updated billing information. - - * Click **Upgrade**. - -2) The instance will shut down and begin reprovisioning/relicensing itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. +2. The instance will shut down and begin reprovisioning/relicensing itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. -3) Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. +3. Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. -*Note, if HarperDB Cloud instance reprovisioning takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new).* +_Note, if HarperDB Cloud instance reprovisioning takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new)._ ## Update Instance Storage @@ -78,48 +70,43 @@ The HarperDB Cloud instance storage size can be increased with the following ins Note: Instance storage can only be upgraded once every 6 hours. -1) In the **update storage** panel at the bottom left: - - * Select the new instance storage size. +1. In the **update storage** panel at the bottom left: + - Select the new instance storage size. - * If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. + - If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. - * If you do have a credit card associated, you will be presented with the updated billing information. + - If you do have a credit card associated, you will be presented with the updated billing information. - * Click **Upgrade**. + - Click **Upgrade**. -2) The instance will shut down and begin reprovisioning itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. +2. The instance will shut down and begin reprovisioning itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. -3) Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. +3. Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. -*Note, if this process takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new).* +_Note, if this process takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new)._ ## Remove Instance The HarperDB instance can be deleted/removed from the Studio with the following instructions. Once this operation is started it cannot be undone. This option is only available to Studio organization owners. -1) In the **remove instance** panel at the bottom left: - * Enter the instance name in the text box. - - * The Studio will present you with a warning. - - * Click **Remove**. - -2) The instance will begin deleting immediately. - +1. In the **remove instance** panel at the bottom left: + - Enter the instance name in the text box. + - The Studio will present you with a warning. + - Click **Remove**. + +2. The instance will begin deleting immediately. + ## Restart Instance The HarperDB Cloud instance can be restarted with the following instructions. -1) In the **restart instance** panel at the bottom right: - * Enter the instance name in the text box. - - * The Studio will present you with a warning. - - * Click **Restart**. - -2) The instance will begin restarting immediately. +1. In the **restart instance** panel at the bottom right: + - Enter the instance name in the text box. + - The Studio will present you with a warning. + - Click **Restart**. + +2. The instance will begin restarting immediately. ## Instance Config (Read Only) -A JSON preview of the instance config is available for reference at the bottom of the page. This is a read only visual and is not editable via the Studio. To make changes to the instance config, review the [configuration file documentation](../../deployments/configuration#using-the-configuration-file-and-naming-conventions). \ No newline at end of file +A JSON preview of the instance config is available for reference at the bottom of the page. This is a read only visual and is not editable via the Studio. To make changes to the instance config, review the [configuration file documentation](../../deployments/configuration#using-the-configuration-file-and-naming-conventions). diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/instances.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/instances.md index 86633e1c..428babaf 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/instances.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/instances.md @@ -6,9 +6,9 @@ title: Instances The HarperDB Studio allows you to administer all of your HarperDB instances in one place. HarperDB currently offers the following instance types: -* **HarperDB Cloud Instance** Managed installations of HarperDB, what we call [HarperDB Cloud](../../deployments/harperdb-cloud/). -* **5G Wavelength Instance** Managed installations of HarperDB running on the Verizon network through AWS Wavelength, what we call [5G Wavelength Instances](../../deployments/harperdb-cloud/verizon-5g-wavelength-instances). _Note, these instances are only accessible via the Verizon network._ -* **Enterprise Instance** Any HarperDB installation that is managed by you. These include instances hosted within your cloud provider accounts (for example, from the AWS or Digital Ocean Marketplaces), privately hosted instances, or instances installed locally. +- **HarperDB Cloud Instance** Managed installations of HarperDB, what we call [HarperDB Cloud](../../deployments/harperdb-cloud/). +- **5G Wavelength Instance** Managed installations of HarperDB running on the Verizon network through AWS Wavelength, what we call [5G Wavelength Instances](../../deployments/harperdb-cloud/verizon-5g-wavelength-instances). _Note, these instances are only accessible via the Verizon network._ +- **Enterprise Instance** Any HarperDB installation that is managed by you. These include instances hosted within your cloud provider accounts (for example, from the AWS or Digital Ocean Marketplaces), privately hosted instances, or instances installed locally. All interactions between the Studio and your instances take place directly from your browser. HarperDB stores metadata about your instances, which enables the Studio to display these instances when you log in. Beyond that, all traffic is routed from your browser to the HarperDB instances using the standard [HarperDB API](../../developers/operations-api/). @@ -26,61 +26,73 @@ A summary view of all instances within an organization can be viewed by clicking 1. Fill out Instance Info. 1. Enter Instance Name - _This will be used to build your instance URL. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com). The Instance URL will be previewed below._ + _This will be used to build your instance URL. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com). The Instance URL will be previewed below._ + 1. Enter Instance Username - _This is the username of the initial HarperDB instance super user._ + _This is the username of the initial HarperDB instance super user._ + 1. Enter Instance Password - _This is the password of the initial HarperDB instance super user._ + _This is the password of the initial HarperDB instance super user._ + 1. Click **Instance Details** to move to the next page. 1. Select Instance Specs 1. Select Instance RAM - _HarperDB Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance._ [_More on instance specs_](../../deployments/harperdb-cloud/instance-size-hardware-specs)_._ + _HarperDB Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance._ [_More on instance specs_](../../deployments/harperdb-cloud/instance-size-hardware-specs)_._ + 1. Select Storage Size - _Each instance has a mounted storage volume where your HarperDB data will reside. Storage is provisioned based on space and IOPS._ [_More on IOPS Impact on Performance_](../../deployments/harperdb-cloud/iops-impact)_._ + _Each instance has a mounted storage volume where your HarperDB data will reside. Storage is provisioned based on space and IOPS._ [_More on IOPS Impact on Performance_](../../deployments/harperdb-cloud/iops-impact)_._ + 1. Select Instance Region - _The geographic area where your instance will be provisioned._ + _The geographic area where your instance will be provisioned._ + 1. Click **Confirm Instance Details** to move to the next page. 1. Review your Instance Details, if there is an error, use the back button to correct it. 1. Review the [Privacy Policy](https://harperdb.io/legal/privacy-policy/) and [Terms of Service](https://harperdb.io/legal/harperdb-cloud-terms-of-service/), if you agree, click the **I agree** radio button to confirm. 1. Click **Add Instance**. 1. Your HarperDB Cloud instance will be provisioned in the background. Provisioning typically takes 5-15 minutes. You will receive an email notification when your instance is ready. - ## Register Enterprise Instance -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization for the instance to be created under. -3) Click the **Create New HarperDB Cloud Instance + Register Enterprise Instance** card. -4) Select **Register Enterprise Instance**. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +2. Click the appropriate organization for the instance to be created under. +3. Click the **Create New HarperDB Cloud Instance + Register Enterprise Instance** card. +4. Select **Register Enterprise Instance**. 1. Fill out Instance Info. 1. Enter Instance Name - _This is used for descriptive purposes only._ + _This is used for descriptive purposes only._ + 1. Enter Instance Username - _The username of a HarperDB super user that is already configured in your HarperDB installation._ + _The username of a HarperDB super user that is already configured in your HarperDB installation._ + 1. Enter Instance Password - _The password of a HarperDB super user that is already configured in your HarperDB installation._ + _The password of a HarperDB super user that is already configured in your HarperDB installation._ + 1. Enter Host - _The host to access the HarperDB instance. For example, `harperdb.myhost.com` or `localhost`._ + _The host to access the HarperDB instance. For example, `harperdb.myhost.com` or `localhost`._ + 1. Enter Port - _The port to access the HarperDB instance. HarperDB defaults `9925` for HTTP and `31283` for HTTPS._ + _The port to access the HarperDB instance. HarperDB defaults `9925` for HTTP and `31283` for HTTPS._ + 1. Select SSL - _If your instance is running over SSL, select the SSL checkbox. If not, you will need to enable mixed content in your browser to allow the HTTPS Studio to access the HTTP instance. If there are issues connecting to the instance, the Studio will display a red error message._ + _If your instance is running over SSL, select the SSL checkbox. If not, you will need to enable mixed content in your browser to allow the HTTPS Studio to access the HTTP instance. If there are issues connecting to the instance, the Studio will display a red error message._ + 1. Click **Instance Details** to move to the next page. 1. Select Instance Specs 1. Select Instance RAM - _HarperDB instances are billed based on Instance RAM. Selecting additional RAM will enable the ability for faster and more complex queries._ + _HarperDB instances are billed based on Instance RAM. Selecting additional RAM will enable the ability for faster and more complex queries._ + 1. Click **Confirm Instance Details** to move to the next page. 1. Review your Instance Details, if there is an error, use the back button to correct it. 1. Review the [Privacy Policy](https://harperdb.io/legal/privacy-policy/) and [Terms of Service](https://harperdb.io/legal/harperdb-cloud-terms-of-service/), if you agree, click the **I agree** radio button to confirm. @@ -91,8 +103,8 @@ A summary view of all instances within an organization can be viewed by clicking Instance deletion has two different behaviors depending on the instance type. -* **HarperDB Cloud Instance** This instance will be permanently deleted, including all data. This process is irreversible and cannot be undone. -* **Enterprise Instance** The instance will be removed from the HarperDB Studio only. This does not uninstall HarperDB from your system and your data will remain intact. +- **HarperDB Cloud Instance** This instance will be permanently deleted, including all data. This process is irreversible and cannot be undone. +- **Enterprise Instance** The instance will be removed from the HarperDB Studio only. This does not uninstall HarperDB from your system and your data will remain intact. An instance can be deleted as follows: @@ -101,7 +113,8 @@ An instance can be deleted as follows: 1. Identify the proper instance card and click the trash can icon. 1. Enter the instance name into the text box. - _This is done for confirmation purposes to ensure you do not accidentally delete an instance._ + _This is done for confirmation purposes to ensure you do not accidentally delete an instance._ + 1. Click the **Do It** button. ## Upgrade an Instance @@ -124,8 +137,10 @@ To log in to an instance: 1. Identify the proper instance card, it will have an unlocked icon and a status reading PLEASE LOG IN, and click the center of the card. 1. Enter the database username. - _The username of a HarperDB user that is already configured in your HarperDB instance._ + _The username of a HarperDB user that is already configured in your HarperDB instance._ + 1. Enter the database password. - _The password of a HarperDB user that is already configured in your HarperDB instance._ + _The password of a HarperDB user that is already configured in your HarperDB instance._ + 1. Click **Log In**. diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/login-password-reset.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/login-password-reset.md index 46254627..163a6dee 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/login-password-reset.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/login-password-reset.md @@ -8,35 +8,35 @@ title: Login and Password Reset To log into your existing HarperDB Studio account: -1) Navigate to the [HarperDB Studio](https://studio.harperdb.io/). -2) Enter your email address. -3) Enter your password. -4) Click **sign in**. +1. Navigate to the [HarperDB Studio](https://studio.harperdb.io/). +2. Enter your email address. +3. Enter your password. +4. Click **sign in**. ## Reset a Forgotten Password To reset a forgotten password: -1) Navigate to the HarperDB Studio password reset page. -2) Enter your email address. -3) Click **send password reset email**. -4) If the account exists, you will receive an email with a temporary password. -5) Navigate back to the HarperDB Studio login page. -6) Enter your email address. -7) Enter your temporary password. -8) Click **sign in**. -9) You will be taken to a new screen to reset your account password. Enter your new password. -*Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character.* -10) Click the **add account password** button. +1. Navigate to the HarperDB Studio password reset page. +2. Enter your email address. +3. Click **send password reset email**. +4. If the account exists, you will receive an email with a temporary password. +5. Navigate back to the HarperDB Studio login page. +6. Enter your email address. +7. Enter your temporary password. +8. Click **sign in**. +9. You will be taken to a new screen to reset your account password. Enter your new password. + _Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character._ +10. Click the **add account password** button. ## Change Your Password If you are already logged into the Studio, you can change your password though the user interface. -1) Navigate to the HarperDB Studio profile page. -2) In the **password** section, enter: +1. Navigate to the HarperDB Studio profile page. +2. In the **password** section, enter: + - Current password. + - New password. + - New password again _(for verification)_. - * Current password. - * New password. - * New password again *(for verification)*. -4) Click the **Update Password** button. \ No newline at end of file +3. Click the **Update Password** button. diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-applications.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-applications.md index e690bdc9..80507035 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-applications.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-applications.md @@ -8,25 +8,26 @@ title: Manage Applications All Applications configuration and development is handled through the **applications** page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the HarperDB Studio Organizations page. +1. Navigate to the HarperDB Studio Organizations page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **applications** in the instance control bar. +4. Click **applications** in the instance control bar. -*Note, the **applications** page will only be available to super users.* +_Note, the **applications** page will only be available to super users._ ## Manage Applications -The Applications editor is not required for development and deployment, though it is a useful tool to maintain and manage your HarperDB Applications. The editor provides the ability to create new applications or import/deploy remote application packages. +The Applications editor is not required for development and deployment, though it is a useful tool to maintain and manage your HarperDB Applications. The editor provides the ability to create new applications or import/deploy remote application packages. The left bar is the applications file navigator, allowing you to select files to edit and add/remove files and folders. By default, this view is empty because there are no existing applications. To get started, either create a new application or import/deploy a remote application. The right side of the screen is the file editor. Here you can make edit individual files of your application directly in the HarperDB Studio. ## Things to Keep in Mind + To learn more about developing HarperDB Applications, make sure to read through the [Applications](../../developers/applications/) documentation. When working with Applications in the HarperDB Studio, by default the editor will restart the HarperDB Applications server every time a file is saved. Note, this behavior can be turned off by toggling the `auto` toggle at the top right of the applications page. If you are constantly editing your application, it may result in errors causing the application not to run. These errors will not be visible on the application page, however they will be available in the HarperDB logs, which can be found on the [status page](./instance-metrics). @@ -34,28 +35,28 @@ When working with Applications in the HarperDB Studio, by default the editor wil The Applications editor stores unsaved changes in cache. This means that occasionally your editor will show a discrepancy from the code that is stored and running on your HarperDB instance. You can identify if the code in your Studio differs if the "save" and "revert" buttons are active. To revert the cached version in your editor to the version of the file stored on your HarperDB instance click the "revert" button. ## Accessing Your Application Endpoints + Accessing your application endpoints varies with which type of endpoint you're creating. All endpoints, regardless of type, will be accessed via the [HarperDB HTTP port found in the HarperDB configuration file](../../deployments/configuration#http). The default port is `9926`, but you can verify what your instances is set to by navigating to the [instance config page](./instance-configuration) and examining the read only JSON version of your instance's config file looking specifically for either the `http: port: 9926` or `http: securePort: 9926` configs. If `port` is set, you will access your endpoints via `http` and if `securePort` is set, you will access your endpoints via `https`. Below is a breakdown of how to access each type of endpoint. In these examples, we will use a locally hosted instance with `securePort` set to `9926`: `https://localhost:9926`. - **Standard REST Endpoints**\ -Standard REST endpoints are defined via the `@export` directive to tables in your schema definition. You can read more about these in the [Adding an Endpoint section of the Applications documentation](../../developers/applications/#adding-an-endpoint). Here, if we are looking to access a record with ID `1` from table `Dog` on our instance, [per the REST documentation](../../developers/rest), we could send a `GET` (or since this is a GET, we could post the URL in our browser) to `https://localhost:9926/Dog/1`. + Standard REST endpoints are defined via the `@export` directive to tables in your schema definition. You can read more about these in the [Adding an Endpoint section of the Applications documentation](../../developers/applications/#adding-an-endpoint). Here, if we are looking to access a record with ID `1` from table `Dog` on our instance, [per the REST documentation](../../developers/rest), we could send a `GET` (or since this is a GET, we could post the URL in our browser) to `https://localhost:9926/Dog/1`. - **Augmented REST Endpoints**\ -HarperDB Applications enable you to write [Custom Functionality with JavaScript](../../developers/applications/#custom-functionality-with-javascript) for your resources. Accessing these endpoints is identical to accessing the standard REST endpoints above, though you may have defined custom behavior in each function. Taking the example from the [Applications documentation](../../developers/applications/#custom-functionality-with-javascript), if we are looking to access the `DogWithHumanAge` example, we could send the GET to `https://localhost:9926/DogWithHumanAge/1`. + HarperDB Applications enable you to write [Custom Functionality with JavaScript](../../developers/applications/#custom-functionality-with-javascript) for your resources. Accessing these endpoints is identical to accessing the standard REST endpoints above, though you may have defined custom behavior in each function. Taking the example from the [Applications documentation](../../developers/applications/#custom-functionality-with-javascript), if we are looking to access the `DogWithHumanAge` example, we could send the GET to `https://localhost:9926/DogWithHumanAge/1`. - **Fastify Routes**\ -If you need more functionality than the REST applications can provide, you can define your own custom endpoints using [Fastify Routes](../../developers/applications/#define-fastify-routes). The paths to these routes are defined via the application `config.yaml` file. You can read more about how you can customize the configuration options in the [Define Fastify Routes documentation](../../developers/applications/define-routes). By default, routes are accessed via the following pattern: `[Instance URL]:[HTTP Port]/[Project Name]/[Route URL]`. Using the example from the [HarperDB Application Template](https://github.com/HarperDB/application-template/blob/main/routes/index.js), where we've named our project `application-template`, we would access the `getAll` route at `https://localhost/application-template/getAll`. - + If you need more functionality than the REST applications can provide, you can define your own custom endpoints using [Fastify Routes](../../developers/applications/#define-fastify-routes). The paths to these routes are defined via the application `config.yaml` file. You can read more about how you can customize the configuration options in the [Define Fastify Routes documentation](../../developers/applications/define-routes). By default, routes are accessed via the following pattern: `[Instance URL]:[HTTP Port]/[Project Name]/[Route URL]`. Using the example from the [HarperDB Application Template](https://github.com/HarperDB/application-template/blob/main/routes/index.js), where we've named our project `application-template`, we would access the `getAll` route at `https://localhost/application-template/getAll`. ## Creating a New Application -1) From the application page, click the "+ app" button at the top right. -2) Click "+ Create A New Application Using The Default Template". -3) Enter a name for your project, note project names must contain only alphanumeric characters, dashes and underscores. -4) Click OK. -5) Your project will be available in the applications file navigator on the left. Click a file to select a file to edit. +1. From the application page, click the "+ app" button at the top right. +2. Click "+ Create A New Application Using The Default Template". +3. Enter a name for your project, note project names must contain only alphanumeric characters, dashes and underscores. +4. Click OK. +5. Your project will be available in the applications file navigator on the left. Click a file to select a file to edit. ## Editing an Application -1) From the applications page, click the file you would like to edit from the file navigator on the left. -2) Edit the file with any changes you'd like. -3) Click "save" at the top right. Note, as mentioned above, when you save a file, the HarperDB Applications server will be restarted immediately. \ No newline at end of file +1. From the applications page, click the file you would like to edit from the file navigator on the left. +2. Edit the file with any changes you'd like. +3. Click "save" at the top right. Note, as mentioned above, when you save a file, the HarperDB Applications server will be restarted immediately. diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-charts.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-charts.md index 453bfbae..672cb776 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-charts.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-charts.md @@ -18,25 +18,31 @@ Charts are generated based on SQL queries, therefore to build a new chart you fi 1. Click **query** in the instance control bar. 1. Enter the SQL query you would like to generate a chart from. - _For example, using the dog demo data from the API Docs, we can get the average dog age per owner with the following query: `SELECT AVG(age) as avg_age, owner_name FROM dev.dog GROUP BY owner_name`._ + _For example, using the dog demo data from the API Docs, we can get the average dog age per owner with the following query: `SELECT AVG(age) as avg_age, owner_name FROM dev.dog GROUP BY owner_name`._ + 1. Click **Execute**. 1. Click **create chart** at the top right of the results table. 1. Configure your chart. 1. Choose chart type. - _HarperDB Studio offers many standard charting options like line, bar, etc._ + _HarperDB Studio offers many standard charting options like line, bar, etc._ + 1. Choose a data column. - _This column will be used to plot the data point. Typically, this is the values being calculated in the `SELECT` statement. Depending on the chart type, you can select multiple data columns to display on a single chart._ + _This column will be used to plot the data point. Typically, this is the values being calculated in the `SELECT` statement. Depending on the chart type, you can select multiple data columns to display on a single chart._ + 1. Depending on the chart type, you will need to select a grouping. - _This could be labeled as x-axis, label, etc. This will be used to group the data, typically this is what you used in your **GROUP BY** clause._ + _This could be labeled as x-axis, label, etc. This will be used to group the data, typically this is what you used in your **GROUP BY** clause._ + 1. Enter a chart name. - _Used for identification purposes and will be displayed at the top of the chart._ + _Used for identification purposes and will be displayed at the top of the chart._ + 1. Choose visible to all org users toggle. - _Leaving this option off will limit chart visibility to just your HarperDB Studio user. Toggling it on will enable all users with this Organization to view this chart._ + _Leaving this option off will limit chart visibility to just your HarperDB Studio user. Toggling it on will enable all users with this Organization to view this chart._ + 1. Click **Add Chart**. 1. The chart will now be visible on the **charts** page. diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-databases-browse-data.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-databases-browse-data.md index da302f70..f6a28f8e 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-databases-browse-data.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-databases-browse-data.md @@ -6,10 +6,10 @@ title: Manage Databases / Browse Data Manage instance databases/tables and browse data in tabular format with the following instructions: -1) Navigate to the HarperDB Studio Organizations page. -2) Click the appropriate organization that the instance belongs to. -3) Select your desired instance. -4) Click **browse** in the instance control bar. +1. Navigate to the HarperDB Studio Organizations page. +2. Click the appropriate organization that the instance belongs to. +3. Select your desired instance. +4. Click **browse** in the instance control bar. Once on the instance browse page you can view data, manage databases and tables, add new data, and more. @@ -17,95 +17,90 @@ Once on the instance browse page you can view data, manage databases and tables, #### Create a Database -1) Click the plus icon at the top right of the databases section. -2) Enter the database name. -3) Click the green check mark. - +1. Click the plus icon at the top right of the databases section. +2. Enter the database name. +3. Click the green check mark. #### Delete a Database Deleting a database is permanent and irreversible. Deleting a database removes all tables and data within it. -1) Click the minus icon at the top right of the databases section. -2) Identify the appropriate database to delete and click the red minus sign in the same row. -3) Click the red check mark to confirm deletion. - +1. Click the minus icon at the top right of the databases section. +2. Identify the appropriate database to delete and click the red minus sign in the same row. +3. Click the red check mark to confirm deletion. #### Create a Table -1) Select the desired database from the databases section. -2) Click the plus icon at the top right of the tables section. -3) Enter the table name. -4) Enter the primary key. - - *The primary key is also often referred to as the hash attribute in the studio, and it defines the unique identifier for each row in your table.* -5) Click the green check mark. +1. Select the desired database from the databases section. +2. Click the plus icon at the top right of the tables section. +3. Enter the table name. +4. Enter the primary key. + _The primary key is also often referred to as the hash attribute in the studio, and it defines the unique identifier for each row in your table._ + +5. Click the green check mark. #### Delete a Table + Deleting a table is permanent and irreversible. Deleting a table removes all data within it. -1) Select the desired database from the databases section. -2) Click the minus icon at the top right of the tables section. -3) Identify the appropriate table to delete and click the red minus sign in the same row. -4) Click the red check mark to confirm deletion. +1. Select the desired database from the databases section. +2. Click the minus icon at the top right of the tables section. +3. Identify the appropriate table to delete and click the red minus sign in the same row. +4. Click the red check mark to confirm deletion. ## Manage Table Data The following section assumes you have selected the appropriate table from the database/table browser. - - #### Filter Table Data -1) Click the magnifying glass icon at the top right of the table browser. -2) This expands the search filters. -3) The results will be filtered appropriately. - +1. Click the magnifying glass icon at the top right of the table browser. +2. This expands the search filters. +3. The results will be filtered appropriately. #### Load CSV Data -1) Click the data icon at the top right of the table browser. You will be directed to the CSV upload page where you can choose to import a CSV by URL or upload a CSV file. -2) To import a CSV by URL: - 1) Enter the URL in the **CSV file URL** textbox. - 2) Click **Import From URL**. - 3) The CSV will load, and you will be redirected back to browse table data. -3) To upload a CSV file: - 1) Click **Click or Drag to select a .csv file** (or drag your CSV file from your file browser). - 2) Navigate to your desired CSV file and select it. - 3) Click **Insert X Records**, where X is the number of records in your CSV. - 4) The CSV will load, and you will be redirected back to browse table data. - +1. Click the data icon at the top right of the table browser. You will be directed to the CSV upload page where you can choose to import a CSV by URL or upload a CSV file. +2. To import a CSV by URL: + 1. Enter the URL in the **CSV file URL** textbox. + 2. Click **Import From URL**. + 3. The CSV will load, and you will be redirected back to browse table data. +3. To upload a CSV file: + 1. Click **Click or Drag to select a .csv file** (or drag your CSV file from your file browser). + 2. Navigate to your desired CSV file and select it. + 3. Click **Insert X Records**, where X is the number of records in your CSV. + 4. The CSV will load, and you will be redirected back to browse table data. #### Add a Record -1) Click the plus icon at the top right of the table browser. -2) The Studio will pre-populate existing table attributes in JSON format. +1. Click the plus icon at the top right of the table browser. +2. The Studio will pre-populate existing table attributes in JSON format. - *The primary key is not included, but you can add it in and set it to your desired value. Auto-maintained fields are not included and cannot be manually set. You may enter a JSON array to insert multiple records in a single transaction.* -3) Enter values to be added to the record. + _The primary key is not included, but you can add it in and set it to your desired value. Auto-maintained fields are not included and cannot be manually set. You may enter a JSON array to insert multiple records in a single transaction._ - *You may add new attributes to the JSON; they will be reflexively added to the table.* -4) Click the **Add New** button. +3. Enter values to be added to the record. + _You may add new attributes to the JSON; they will be reflexively added to the table._ -#### Edit a Record +4. Click the **Add New** button. -1) Click the record/row you would like to edit. -2) Modify the desired values. +#### Edit a Record - *You may add new attributes to the JSON; they will be reflexively added to the table.* +1. Click the record/row you would like to edit. +2. Modify the desired values. -3) Click the **save icon**. + _You may add new attributes to the JSON; they will be reflexively added to the table._ +3. Click the **save icon**. #### Delete a Record Deleting a record is permanent and irreversible. If transaction logging is turned on, the delete transaction will be recorded as well as the data that was deleted. -1) Click the record/row you would like to delete. -2) Click the **delete icon**. -3) Confirm deletion by clicking the **check icon**. +1. Click the record/row you would like to delete. +2. Click the **delete icon**. +3. Confirm deletion by clicking the **check icon**. ## Browse Table Data @@ -115,18 +110,14 @@ The following section assumes you have selected the appropriate table from the d The first page of table data is automatically loaded on table selection. Paging controls are at the bottom of the table. Here you can: -* Page left and right using the arrows. -* Type in the desired page. -* Change the page size (the amount of records displayed in the table). - +- Page left and right using the arrows. +- Type in the desired page. +- Change the page size (the amount of records displayed in the table). #### Refresh Table Data Click the refresh icon at the top right of the table browser. - - #### Automatically Refresh Table Data Toggle the auto switch at the top right of the table browser. The table data will now automatically refresh every 15 seconds. Filters and pages will remain set for refreshed data. - diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-instance-roles.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-instance-roles.md index f0aa72bb..45030cca 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-instance-roles.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-instance-roles.md @@ -8,69 +8,70 @@ HarperDB users and roles can be managed directly through the HarperDB Studio. It Instance role configuration is handled through the **roles** page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the HarperDB Studio Organizations page. +1. Navigate to the HarperDB Studio Organizations page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **roles** in the instance control bar. +4. Click **roles** in the instance control bar. -*Note, the **roles** page will only be available to super users.* +_Note, the **roles** page will only be available to super users._ +The _roles management_ screen consists of the following panels: +- **super users** -The *roles management* screen consists of the following panels: + Displays all super user roles for this instance. -* **super users** +- **cluster users** - Displays all super user roles for this instance. -* **cluster users** + Displays all cluster user roles for this instance. - Displays all cluster user roles for this instance. -* **standard roles** +- **standard roles** - Displays all standard roles for this instance. -* **role permission editing** + Displays all standard roles for this instance. - Once a role is selected for editing, permissions will be displayed here in JSON format. +- **role permission editing** -*Note, when new tables are added that are not configured, the Studio will generate configuration values with permissions defaulting to `false`.* + Once a role is selected for editing, permissions will be displayed here in JSON format. + +_Note, when new tables are added that are not configured, the Studio will generate configuration values with permissions defaulting to `false`._ ## Role Management #### Create a Role -1) Click the plus icon at the top right of the appropriate role section. +1. Click the plus icon at the top right of the appropriate role section. -2) Enter the role name. +2. Enter the role name. -3) Click the green check mark. +3. Click the green check mark. -4) Optionally toggle the **manage databases/tables** switch to specify the `structure_user` config. +4. Optionally toggle the **manage databases/tables** switch to specify the `structure_user` config. -5) Configure the role permissions in the role permission editing panel. +5. Configure the role permissions in the role permission editing panel. - *Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel.* + _Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel._ -6) Click **Update Role Permissions**. +6. Click **Update Role Permissions**. #### Modify a Role -1) Click the appropriate role from the appropriate role section. +1. Click the appropriate role from the appropriate role section. -2) Modify the role permissions in the role permission editing panel. +2. Modify the role permissions in the role permission editing panel. - *Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel.* + _Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel._ -3) Click **Update Role Permissions**. +3. Click **Update Role Permissions**. #### Delete a Role Deleting a role is permanent and irreversible. A role cannot be remove if users are associated with it. -1) Click the minus icon at the top right of the roles section. +1. Click the minus icon at the top right of the roles section. -2) Identify the appropriate role to delete and click the red minus sign in the same row. +2. Identify the appropriate role to delete and click the red minus sign in the same row. -3) Click the red check mark to confirm deletion. \ No newline at end of file +3. Click the red check mark to confirm deletion. diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-instance-users.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-instance-users.md index 29cf3659..369bd492 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-instance-users.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-instance-users.md @@ -8,54 +8,46 @@ HarperDB users and roles can be managed directly through the HarperDB Studio. It Instance user configuration is handled through the **users** page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **users** in the instance control bar. +4. Click **users** in the instance control bar. -*Note, the **users** page will only be available to super users.* +_Note, the **users** page will only be available to super users._ ## Add a User HarperDB instance users can be added with the following instructions. -1) In the **add user** panel on the left enter: - - * New user username. - - * New user password. - - * Select a role. - - *Learn more about role management here: [Manage Instance Roles](./manage-instance-roles).* - -2) Click **Add User**. - +1. In the **add user** panel on the left enter: + - New user username. + - New user password. + - Select a role. + + _Learn more about role management here: [Manage Instance Roles](./manage-instance-roles)._ + +2. Click **Add User**. + ## Edit a User HarperDB instance users can be modified with the following instructions. -1) In the **existing users** panel, click the row of the user you would like to edit. +1. In the **existing users** panel, click the row of the user you would like to edit. + +2. To change a user’s password: + 1. In the **Change user password** section, enter the new password. + 2. Click **Update Password**. -2) To change a user’s password: +3. To change a user’s role: + 1. In the **Change user role** section, select the new role. + 2. Click **Update Role**. - 1) In the **Change user password** section, enter the new password. - - 2) Click **Update Password**. - -3) To change a user’s role: +4. To delete a user: + 1. In the **Delete User** section, type the username into the textbox. - 1) In the **Change user role** section, select the new role. - - 2) Click **Update Role**. - -4) To delete a user: + _This is done for confirmation purposes._ - 1) In the **Delete User** section, type the username into the textbox. - - *This is done for confirmation purposes.* - - 2) Click **Delete User**. \ No newline at end of file + 2. Click **Delete User**. diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-replication.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-replication.md index bf6b463e..2a238a09 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-replication.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/manage-replication.md @@ -6,65 +6,66 @@ title: Manage Replication HarperDB instance clustering and replication can be configured directly through the HarperDB Studio. It is recommended to read through the [clustering documentation](../../developers/clustering/) first to gain a strong understanding of HarperDB clustering behavior. - - All clustering configuration is handled through the **replication** page of the HarperDB Studio, accessed with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **replication** in the instance control bar. +4. Click **replication** in the instance control bar. Note, the **replication** page will only be available to super users. --- + ## Initial Configuration HarperDB instances do not have clustering configured by default. The HarperDB Studio will walk you through the initial configuration. Upon entering the **replication** screen for the first time you will need to complete the following configuration. Configurations are set in the **enable clustering** panel on the left while actions are described in the middle of the screen. It is worth reviewing the [Creating a Cluster User](../../developers/clustering/creating-a-cluster-user) document before proceeding. -1) Enter Cluster User username. (Defaults to `cluster_user`). -2) Enter Cluster Password. -3) Review and/or Set Cluster Node Name. -4) Click **Enable Clustering**. - +1. Enter Cluster User username. (Defaults to `cluster_user`). +2. Enter Cluster Password. +3. Review and/or Set Cluster Node Name. +4. Click **Enable Clustering**. + At this point the Studio will restart your HarperDB Instance, required for the configuration changes to take effect. --- ## Manage Clustering + Once initial clustering configuration is completed you a presented with a clustering management screen with the following properties: -* **connected instances** +- **connected instances** + + Displays all instances within the Studio Organization that this instance manages a connection with. - Displays all instances within the Studio Organization that this instance manages a connection with. +- **unconnected instances** -* **unconnected instances** + Displays all instances within the Studio Organization that this instance does not manage a connection with. - Displays all instances within the Studio Organization that this instance does not manage a connection with. +- **unregistered instances** -* **unregistered instances** + Displays all instances outside the Studio Organization that this instance manages a connection with. - Displays all instances outside the Studio Organization that this instance manages a connection with. +- **manage clustering** -* **manage clustering** + Once instances are connected, this will display clustering management options for all connected instances and all databases and tables. - Once instances are connected, this will display clustering management options for all connected instances and all databases and tables. --- ## Connect an Instance HarperDB Instances can be clustered together with the following instructions. -1) Ensure clustering has been configured on both instances and a cluster user with identical credentials exists on both. +1. Ensure clustering has been configured on both instances and a cluster user with identical credentials exists on both. -2) Identify the instance you would like to connect from the **unconnected instances** panel. +2. Identify the instance you would like to connect from the **unconnected instances** panel. -3) Click the plus icon next the appropriate instance. +3. Click the plus icon next the appropriate instance. -4) If configurations are correct, all databases will sync across the cluster, then appear in the **manage clustering** panel. If there is a configuration issue, a red exclamation icon will appear, click it to learn more about what could be causing the issue. +4. If configurations are correct, all databases will sync across the cluster, then appear in the **manage clustering** panel. If there is a configuration issue, a red exclamation icon will appear, click it to learn more about what could be causing the issue. --- @@ -72,9 +73,9 @@ HarperDB Instances can be clustered together with the following instructions. HarperDB Instances can be disconnected with the following instructions. -1) Identify the instance you would like to disconnect from the **connected instances** panel. +1. Identify the instance you would like to disconnect from the **connected instances** panel. -2) Click the minus icon next the appropriate instance. +2. Click the minus icon next the appropriate instance. --- @@ -82,8 +83,8 @@ HarperDB Instances can be disconnected with the following instructions. Subscriptions must be configured in order to move data between connected instances. Read more about subscriptions here: Creating A Subscription. The **manage clustering** panel displays a table with each row representing an channel per instance. Cells are bolded to indicate a change in the column. Publish and subscribe replication can be configured per table with the following instructions: -1) Identify the instance, database, and table for replication to be configured. +1. Identify the instance, database, and table for replication to be configured. -2) For publish, click the toggle switch in the **publish** column. +2. For publish, click the toggle switch in the **publish** column. -3) For subscribe, click the toggle switch in the **subscribe** column. \ No newline at end of file +3. For subscribe, click the toggle switch in the **subscribe** column. diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/organizations.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/organizations.md index cc6ab6ac..a6efb234 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/organizations.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/organizations.md @@ -3,43 +3,46 @@ title: Organizations --- # Organizations -HarperDB Studio organizations provide the ability to group HarperDB Cloud Instances. Organization behavior is as follows: -* Billing occurs at the organization level to a single credit card. -* Organizations retain their own unique HarperDB Cloud subdomain. -* Cloud instances reside within an organization. -* Studio users can be invited to organizations to share instances. +HarperDB Studio organizations provide the ability to group HarperDB Cloud Instances. Organization behavior is as follows: +- Billing occurs at the organization level to a single credit card. +- Organizations retain their own unique HarperDB Cloud subdomain. +- Cloud instances reside within an organization. +- Studio users can be invited to organizations to share instances. An organization is automatically created for you when you sign up for HarperDB Studio. If you only have one organization, the Studio will automatically bring you to your organization’s page. --- ## List Organizations + A summary view of all organizations your user belongs to can be viewed on the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. You can navigate to this page at any time by clicking the **all organizations** link at the top of the HarperDB Studio. ## Create a New Organization + A new organization can be created as follows: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the **Create a New Organization** card. -3) Fill out new organization details - * Enter Organization Name - *This is used for descriptive purposes only.* - * Enter Organization Subdomain - *Part of the URL that will be used to identify your HarperDB Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com).* -4) Click Create Organization. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the **Create a New Organization** card. +3. Fill out new organization details + - Enter Organization Name + _This is used for descriptive purposes only._ + - Enter Organization Subdomain + _Part of the URL that will be used to identify your HarperDB Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com)._ +4. Click Create Organization. ## Delete an Organization An organization cannot be deleted until all instances have been removed. An organization can be deleted as follows: -1) Navigate to the HarperDB Studio Organizations page. -2) Identify the proper organization card and click the trash can icon. -3) Enter the organization name into the text box. +1. Navigate to the HarperDB Studio Organizations page. +2. Identify the proper organization card and click the trash can icon. +3. Enter the organization name into the text box. + + _This is done for confirmation purposes to ensure you do not accidentally delete an organization._ - *This is done for confirmation purposes to ensure you do not accidentally delete an organization.* -4) Click the **Do It** button. +4. Click the **Do It** button. ## Manage Users @@ -49,11 +52,11 @@ HarperDB Studio organization owners can manage users including inviting new user A new user can be invited to an organization as follows: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) In the **add user** box, enter the new user’s email address. -5) Click **Add User**. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. In the **add user** box, enter the new user’s email address. +5. Click **Add User**. Users may or may not already be HarperDB Studio users when adding them to an organization. If the HarperDB Studio account already exists, the user will receive an email notification alerting them to the organization invitation. If the user does not have a HarperDB Studio account, they will receive an email welcoming them to HarperDB Studio. @@ -63,11 +66,11 @@ Users may or may not already be HarperDB Studio users when adding them to an org Organization owners have full access to the organization including the ability to manage organization users, create, modify, and delete instances, and delete the organization. Users must have accepted their invitation prior to being promoted to an owner. A user’s organization owner status can be toggled owner as follows: -1) Navigate to the HarperDB Studio Organizations page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) Click the appropriate user from the **existing users** section. -5) Toggle the **Is Owner** switch to the desired status. +1. Navigate to the HarperDB Studio Organizations page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. Click the appropriate user from the **existing users** section. +5. Toggle the **Is Owner** switch to the desired status. --- @@ -75,35 +78,32 @@ Organization owners have full access to the organization including the ability t Users may be removed from an organization at any time. Removing a user from an organization will not delete their HarperDB Studio account, it will only remove their access to the specified organization. A user can be removed from an organization as follows: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) Click the appropriate user from the **existing users** section. -5) Type **DELETE** in the text box in the **Delete User** row. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. Click the appropriate user from the **existing users** section. +5. Type **DELETE** in the text box in the **Delete User** row. - *This is done for confirmation purposes to ensure you do not accidentally delete a user.* -6) Click **Delete User**. + _This is done for confirmation purposes to ensure you do not accidentally delete a user._ + +6. Click **Delete User**. ## Manage Billing Billing is configured per organization and will be billed to the stored credit card at appropriate intervals (monthly or annually depending on the registered instance). Billing settings can be configured as follows: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **billing** at the top of the screen. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **billing** at the top of the screen. Here organization owners can view invoices, manage coupons, and manage the associated credit card. - - -*HarperDB billing and payments are managed via Stripe.* - - +_HarperDB billing and payments are managed via Stripe._ ### Add a Coupon Coupons are applicable towards any paid tier or enterprise instance and you can change your subscription at any time. Coupons can be added to your Organization as follows: -1) In the coupons panel of the **billing** page, enter your coupon code. -2) Click **Add Coupon**. -3) The coupon will then be available and displayed in the coupons panel. \ No newline at end of file +1. In the coupons panel of the **billing** page, enter your coupon code. +2. Click **Add Coupon**. +3. The coupon will then be available and displayed in the coupons panel. diff --git a/site/versioned_docs/version-4.3/administration/harperdb-studio/query-instance-data.md b/site/versioned_docs/version-4.3/administration/harperdb-studio/query-instance-data.md index 5dd2d8c6..22801dbc 100644 --- a/site/versioned_docs/version-4.3/administration/harperdb-studio/query-instance-data.md +++ b/site/versioned_docs/version-4.3/administration/harperdb-studio/query-instance-data.md @@ -6,14 +6,14 @@ title: Query Instance Data SQL queries can be executed directly through the HarperDB Studio with the following instructions: -1) Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. -3) Select your desired instance. -4) Click **query** in the instance control bar. -5) Enter your SQL query in the SQL query window. -6) Click **Execute**. +1. Navigate to the [HarperDB Studio Organizations](https://studio.harperdb.io/organizations) page. +2. Click the appropriate organization that the instance belongs to. +3. Select your desired instance. +4. Click **query** in the instance control bar. +5. Enter your SQL query in the SQL query window. +6. Click **Execute**. -*Please note, the Studio will execute the query exactly as entered. For example, if you attempt to `SELECT *` from a table with millions of rows, you will most likely crash your browser.* +_Please note, the Studio will execute the query exactly as entered. For example, if you attempt to `SELECT _` from a table with millions of rows, you will most likely crash your browser.\* ## Browse Query Results Set @@ -21,9 +21,9 @@ SQL queries can be executed directly through the HarperDB Studio with the follow The first page of results set data is automatically loaded on query execution. Paging controls are at the bottom of the table. Here you can: -* Page left and right using the arrows. -* Type in the desired page. -* Change the page size (the amount of records displayed in the table). +- Page left and right using the arrows. +- Type in the desired page. +- Change the page size (the amount of records displayed in the table). #### Refresh Results Set @@ -37,12 +37,11 @@ Toggle the auto switch at the top right of the results set table. The results se Query history is stored in your local browser cache. Executed queries are listed with the most recent at the top in the **query history** section. - #### Rerun Previous Query -* Identify the query from the **query history** list. -* Click the appropriate query. It will be loaded into the **sql query** input box. -* Click **Execute**. +- Identify the query from the **query history** list. +- Click the appropriate query. It will be loaded into the **sql query** input box. +- Click **Execute**. #### Clear Query History @@ -50,4 +49,4 @@ Click the trash can icon at the top right of the **query history** section. ## Create Charts -The HarperDB Studio includes a charting feature where you can build charts based on your specified queries. Visit the Charts documentation for more information. \ No newline at end of file +The HarperDB Studio includes a charting feature where you can build charts based on your specified queries. Visit the Charts documentation for more information. diff --git a/site/versioned_docs/version-4.3/administration/jobs.md b/site/versioned_docs/version-4.3/administration/jobs.md index 44b755fe..c626ed5a 100644 --- a/site/versioned_docs/version-4.3/administration/jobs.md +++ b/site/versioned_docs/version-4.3/administration/jobs.md @@ -10,7 +10,7 @@ HarperDB Jobs are asynchronous tasks performed by the Operations API. Jobs uses an asynchronous methodology to account for the potential of a long-running operation. For example, exporting millions of records to S3 could take some time, so that job is started and the id is provided to check on the status. -The job status can be **COMPLETE** or **IN\_PROGRESS**. +The job status can be **COMPLETE** or **IN_PROGRESS**. ## Example Job Operations diff --git a/site/versioned_docs/version-4.3/administration/logging/audit-logging.md b/site/versioned_docs/version-4.3/administration/logging/audit-logging.md index 11d552ec..ea7365ec 100644 --- a/site/versioned_docs/version-4.3/administration/logging/audit-logging.md +++ b/site/versioned_docs/version-4.3/administration/logging/audit-logging.md @@ -12,7 +12,7 @@ Audit log is enabled by default. To disable the audit log, set `logging.auditLog ### Audit Log Operations -#### read\_audit\_log +#### read_audit_log The `read_audit_log` operation is flexible, enabling users to query with many parameters. All operations search on a single table. Filter options include timestamps, usernames, and table hash values. Additional examples found in the [HarperDB API documentation](../../developers/operations-api/logs). @@ -20,116 +20,107 @@ The `read_audit_log` operation is flexible, enabling users to query with many pa ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "timestamp", - "search_values": [ - 1660585740558 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "timestamp", + "search_values": [1660585740558] } ``` There are three outcomes using timestamp. -* `"search_values": []` - All records returned for specified table -* `"search_values": [1660585740558]` - All records after provided timestamp -* `"search_values": [1660585740558, 1760585759710]` - Records "from" and "to" provided timestamp +- `"search_values": []` - All records returned for specified table +- `"search_values": [1660585740558]` - All records after provided timestamp +- `"search_values": [1660585740558, 1760585759710]` - Records "from" and "to" provided timestamp -*** +--- **Search by Username** ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "username", - "search_values": [ - "admin" - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "username", + "search_values": ["admin"] } ``` The above example will return all records whose `username` is "admin." -*** +--- **Search by Primary Key** ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "hash_value", - "search_values": [ - 318 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "hash_value", + "search_values": [318] } ``` The above example will return all records whose primary key (`hash_value`) is 318. -*** +--- -#### read\_audit\_log Response +#### read_audit_log Response The example that follows provides records of operations performed on a table. One thing of note is that the `read_audit_log` operation gives you the `original_records`. ```json { - "operation": "update", - "user_name": "HDB_ADMIN", - "timestamp": 1607035559122.277, - "hash_values": [ - 1, - 2 - ], - "records": [ - { - "id": 1, - "breed": "Muttzilla", - "age": 6, - "__updatedtime__": 1607035559122 - }, - { - "id": 2, - "age": 7, - "__updatedtime__": 1607035559121 - } - ], - "original_records": [ - { - "__createdtime__": 1607035556801, - "__updatedtime__": 1607035556801, - "age": 5, - "breed": "Mutt", - "id": 2, - "name": "Penny" - }, - { - "__createdtime__": 1607035556801, - "__updatedtime__": 1607035556801, - "age": 5, - "breed": "Mutt", - "id": 1, - "name": "Harper" - } - ] + "operation": "update", + "user_name": "HDB_ADMIN", + "timestamp": 1607035559122.277, + "hash_values": [1, 2], + "records": [ + { + "id": 1, + "breed": "Muttzilla", + "age": 6, + "__updatedtime__": 1607035559122 + }, + { + "id": 2, + "age": 7, + "__updatedtime__": 1607035559121 + } + ], + "original_records": [ + { + "__createdtime__": 1607035556801, + "__updatedtime__": 1607035556801, + "age": 5, + "breed": "Mutt", + "id": 2, + "name": "Penny" + }, + { + "__createdtime__": 1607035556801, + "__updatedtime__": 1607035556801, + "age": 5, + "breed": "Mutt", + "id": 1, + "name": "Harper" + } + ] } ``` -#### delete\_audit\_logs\_before +#### delete_audit_logs_before Just like with transaction logs, you can clean up your audit logs with the `delete_audit_logs_before` operation. It will delete audit log data according to the given parameters. The example below will delete records older than the timestamp provided. ```json { - "operation": "delete_audit_logs_before", - "schema": "dev", - "table": "cat", - "timestamp": 1598290282817 + "operation": "delete_audit_logs_before", + "schema": "dev", + "table": "cat", + "timestamp": 1598290282817 } ``` diff --git a/site/versioned_docs/version-4.3/administration/logging/index.md b/site/versioned_docs/version-4.3/administration/logging/index.md index 2ed92774..9a0c4975 100644 --- a/site/versioned_docs/version-4.3/administration/logging/index.md +++ b/site/versioned_docs/version-4.3/administration/logging/index.md @@ -6,6 +6,6 @@ title: Logging HarperDB provides many different logging options for various features and functionality. -* [Standard Logging](./standard-logging): HarperDB maintains a log of events that take place throughout operation. -* [Audit Logging](./audit-logging): HarperDB uses a standard HarperDB table to track transactions. For each table a user creates, a corresponding table will be created to track transactions against that table. -* [Transaction Logging](./transaction-logging): HarperDB stores a verbose history of all transactions logged for specified database tables, including original data records. +- [Standard Logging](./standard-logging): HarperDB maintains a log of events that take place throughout operation. +- [Audit Logging](./audit-logging): HarperDB uses a standard HarperDB table to track transactions. For each table a user creates, a corresponding table will be created to track transactions against that table. +- [Transaction Logging](./transaction-logging): HarperDB stores a verbose history of all transactions logged for specified database tables, including original data records. diff --git a/site/versioned_docs/version-4.3/administration/logging/standard-logging.md b/site/versioned_docs/version-4.3/administration/logging/standard-logging.md index cf120e3b..08affb24 100644 --- a/site/versioned_docs/version-4.3/administration/logging/standard-logging.md +++ b/site/versioned_docs/version-4.3/administration/logging/standard-logging.md @@ -22,15 +22,15 @@ For example, a typical log entry looks like: The components of a log entry are: -* timestamp - This is the date/time stamp when the event occurred -* level - This is an associated log level that gives a rough guide to the importance and urgency of the message. The available log levels in order of least urgent (and more verbose) are: `trace`, `debug`, `info`, `warn`, `error`, `fatal`, and `notify`. -* thread/ID - This reports the name of the thread and the thread ID that the event was reported on. Note that NATS logs are recorded by their process name and there is no thread id for them since they are a separate process. Key threads are: - * main - This is the thread that is responsible for managing all other threads and routes incoming requests to the other threads - * http - These are the worker threads that handle the primary workload of incoming HTTP requests to the operations API and custom functions. - * Clustering\* - These are threads and processes that handle replication. - * job - These are job threads that have been started to handle operations that are executed in a separate job thread. -* tags - Logging from a custom function will include a "custom-function" tag in the log entry. Most logs will not have any additional tags. -* message - This is the main message that was reported. +- timestamp - This is the date/time stamp when the event occurred +- level - This is an associated log level that gives a rough guide to the importance and urgency of the message. The available log levels in order of least urgent (and more verbose) are: `trace`, `debug`, `info`, `warn`, `error`, `fatal`, and `notify`. +- thread/ID - This reports the name of the thread and the thread ID that the event was reported on. Note that NATS logs are recorded by their process name and there is no thread id for them since they are a separate process. Key threads are: + - main - This is the thread that is responsible for managing all other threads and routes incoming requests to the other threads + - http - These are the worker threads that handle the primary workload of incoming HTTP requests to the operations API and custom functions. + - Clustering\* - These are threads and processes that handle replication. + - job - These are job threads that have been started to handle operations that are executed in a separate job thread. +- tags - Logging from a custom function will include a "custom-function" tag in the log entry. Most logs will not have any additional tags. +- message - This is the main message that was reported. We try to keep logging to a minimum by default, to do this the default log level is `error`. If you require more information from the logs, increasing the log level down will provide that. @@ -54,12 +54,12 @@ To access specific logs you may query the HarperDB API. Logs can be queried usin ```json { - "operation": "read_log", - "start": 0, - "limit": 1000, - "level": "error", - "from": "2021-01-25T22:05:27.464+0000", - "until": "2021-01-25T23:05:27.464+0000", - "order": "desc" + "operation": "read_log", + "start": 0, + "limit": 1000, + "level": "error", + "from": "2021-01-25T22:05:27.464+0000", + "until": "2021-01-25T23:05:27.464+0000", + "order": "desc" } ``` diff --git a/site/versioned_docs/version-4.3/administration/logging/transaction-logging.md b/site/versioned_docs/version-4.3/administration/logging/transaction-logging.md index a65c4714..6f2031ad 100644 --- a/site/versioned_docs/version-4.3/administration/logging/transaction-logging.md +++ b/site/versioned_docs/version-4.3/administration/logging/transaction-logging.md @@ -14,71 +14,71 @@ If you would like to use the transaction log, but have not set up clustering yet ## Transaction Log Operations -### read\_transaction\_log +### read_transaction_log The `read_transaction_log` operation returns a prescribed set of records, based on given parameters. The example below will give a maximum of 2 records within the timestamps provided. ```json { - "operation": "read_transaction_log", - "schema": "dev", - "table": "dog", - "from": 1598290235769, - "to": 1660249020865, - "limit": 2 + "operation": "read_transaction_log", + "schema": "dev", + "table": "dog", + "from": 1598290235769, + "to": 1660249020865, + "limit": 2 } ``` _See example response below._ -### read\_transaction\_log Response +### read_transaction_log Response ```json [ - { - "operation": "insert", - "user": "admin", - "timestamp": 1660165619736, - "records": [ - { - "id": 1, - "dog_name": "Penny", - "owner_name": "Kyle", - "breed_id": 154, - "age": 7, - "weight_lbs": 38, - "__updatedtime__": 1660165619688, - "__createdtime__": 1660165619688 - } - ] - }, - { - "operation": "update", - "user": "admin", - "timestamp": 1660165620040, - "records": [ - { - "id": 1, - "dog_name": "Penny B", - "__updatedtime__": 1660165620036 - } - ] - } + { + "operation": "insert", + "user": "admin", + "timestamp": 1660165619736, + "records": [ + { + "id": 1, + "dog_name": "Penny", + "owner_name": "Kyle", + "breed_id": 154, + "age": 7, + "weight_lbs": 38, + "__updatedtime__": 1660165619688, + "__createdtime__": 1660165619688 + } + ] + }, + { + "operation": "update", + "user": "admin", + "timestamp": 1660165620040, + "records": [ + { + "id": 1, + "dog_name": "Penny B", + "__updatedtime__": 1660165620036 + } + ] + } ] ``` _See example request above._ -### delete\_transaction\_logs\_before +### delete_transaction_logs_before The `delete_transaction_logs_before` operation will delete transaction log data according to the given parameters. The example below will delete records older than the timestamp provided. ```json { - "operation": "delete_transaction_logs_before", - "schema": "dev", - "table": "dog", - "timestamp": 1598290282817 + "operation": "delete_transaction_logs_before", + "schema": "dev", + "table": "dog", + "timestamp": 1598290282817 } ``` diff --git a/site/versioned_docs/version-4.3/deployments/_category_.json b/site/versioned_docs/version-4.3/deployments/_category_.json index 8fdd6e17..95644c6b 100644 --- a/site/versioned_docs/version-4.3/deployments/_category_.json +++ b/site/versioned_docs/version-4.3/deployments/_category_.json @@ -1,12 +1,10 @@ { - "label": "Deployments", - "position": 3, - "link": { - "type": "generated-index", - "title": "Deployments Documentation", - "description": "Installation and deployment guides for HarperDB", - "keywords": [ - "deployments" - ] - } -} \ No newline at end of file + "label": "Deployments", + "position": 3, + "link": { + "type": "generated-index", + "title": "Deployments Documentation", + "description": "Installation and deployment guides for HarperDB", + "keywords": ["deployments"] + } +} diff --git a/site/versioned_docs/version-4.3/deployments/configuration.md b/site/versioned_docs/version-4.3/deployments/configuration.md index d1a4452d..efd91ffd 100644 --- a/site/versioned_docs/version-4.3/deployments/configuration.md +++ b/site/versioned_docs/version-4.3/deployments/configuration.md @@ -8,7 +8,7 @@ HarperDB is configured through a [YAML](https://yaml.org/) file called `harperdb Some configuration will be populated by default in the config file on install, regardless of whether it is used. -*** +--- ## Using the Configuration File and Naming Conventions @@ -32,7 +32,7 @@ To use a custom configuration file to set values on install, use the CLI/ENV var To install HarperDB overtop of an existing configuration file, set `HDB_CONFIG` to the root path of your install `/harperdb-config.yaml` -*** +--- ## Configuration Options @@ -55,7 +55,7 @@ For HTTP clients that support (Brotli) compression encoding, responses that are ```yaml http: - compressionThreshold: 1200 + compressionThreshold: 1200 ``` `cors` - _Type_: boolean; _Default_: true @@ -92,16 +92,16 @@ The length of time in milliseconds after which a request will timeout. ```yaml http: - cors: true - corsAccessList: - - null - headersTimeout: 60000 - maxHeaderSize: 8192 - https: false - keepAliveTimeout: 30000 - port: 9926 - securePort: null - timeout: 120000 + cors: true + corsAccessList: + - null + headersTimeout: 60000 + maxHeaderSize: 8192 + https: false + keepAliveTimeout: 30000 + port: 9926 + securePort: null + timeout: 120000 ``` `mlts` - _Type_: boolean | object; _Default_: false @@ -123,7 +123,9 @@ This can be enabled to require client certificates (mTLS) for all incoming MQTT http: mtls: true ``` + or + ```yaml http: mtls: @@ -131,8 +133,7 @@ http: user: user-name ``` - -*** +--- ### `threads` @@ -171,8 +172,7 @@ threads: This specifies the heap memory limit for each thread, in megabytes. The default heap limit is a heuristic based on available memory and thread count. - -*** +--- ### `clustering` @@ -180,11 +180,11 @@ The `clustering` section configures the clustering engine, this is used to repli Clustering offers a lot of different configurations, however in a majority of cases the only options you will need to pay attention to are: -* `clustering.enabled` Enable the clustering processes. -* `clustering.hubServer.cluster.network.port` The port other nodes will connect to. This port must be accessible from other cluster nodes. -* `clustering.hubServer.cluster.network.routes`The connections to other instances. -* `clustering.nodeName` The name of your node, must be unique within the cluster. -* `clustering.user` The name of the user credentials used for Inter-node authentication. +- `clustering.enabled` Enable the clustering processes. +- `clustering.hubServer.cluster.network.port` The port other nodes will connect to. This port must be accessible from other cluster nodes. +- `clustering.hubServer.cluster.network.routes`The connections to other instances. +- `clustering.nodeName` The name of your node, must be unique within the cluster. +- `clustering.user` The name of the user credentials used for Inter-node authentication. `enabled` - _Type_: boolean; _Default_: false @@ -194,7 +194,7 @@ _Note: If you enabled clustering but do not create and add a cluster user you wi ```yaml clustering: - enabled: true + enabled: true ``` `clustering.hubServer.cluster` @@ -324,15 +324,16 @@ clustering: maxConsumeMsgs: 100 maxIngestThreads: 2 ``` + `maxConsumeMsgs` - _Type_: integer; _Default_: 100 The maximum number of messages a consumer can process in one go. `maxIngestThreads` - _Type_: integer; _Default_: 2 -The number of HarperDB threads that are delegated to ingesting messages. +The number of HarperDB threads that are delegated to ingesting messages. -*** +--- `logLevel` - _Type_: string; _Default_: error @@ -394,7 +395,7 @@ When true, all transactions that are received from other nodes are republished t When true, hub server will verify client certificate using the CA certificate. -*** +--- `user` - _Type_: string; _Default_: null @@ -406,10 +407,10 @@ The user can be created either through the API using an `add_user` request with ```yaml clustering: - user: cluster_person + user: cluster_person ``` -*** +--- ### `localStudio` @@ -424,7 +425,7 @@ localStudio: enabled: false ``` -*** +--- ### `logging` @@ -445,9 +446,9 @@ To access the audit logs, use the API operation `read_audit_log`. It will provid ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog" + "operation": "read_audit_log", + "schema": "dev", + "table": "dog" } ``` @@ -529,7 +530,7 @@ logging: stdStreams: false ``` -*** +--- ### `authentication` @@ -595,7 +596,7 @@ An array of allowable domains with CORS `domainSocket` - _Type_: string; _Default_: \/hdb/operations-server -The path to the Unix domain socket used to provide the Operations API through the CLI +The path to the Unix domain socket used to provide the Operations API through the CLI `headersTimeout` - _Type_: integer; _Default_: 60,000 milliseconds (1 minute) @@ -641,7 +642,7 @@ Path to the certificate authority file. Path to the private key file. -*** +--- ### `componentsRoot` @@ -653,7 +654,7 @@ The path to the folder containing the local component files. componentsRoot: ~/hdb/components ``` -*** +--- ### `rootPath` @@ -665,7 +666,7 @@ The HarperDB database and applications/API/interface are decoupled from each oth rootPath: /Users/jonsnow/hdb ``` -*** +--- ### `storage` @@ -760,8 +761,8 @@ The `path` configuration sets where all database files should reside. storage: path: /users/harperdb/storage ``` -_**Note:**_ This configuration applies to all database files, which includes system tables that are used internally by HarperDB. For this reason if you wish to use a non default `path` value you must move any existing schemas into your `path` location. Existing schemas is likely to include the system schema which can be found at `/schema/system`. +_**Note:**_ This configuration applies to all database files, which includes system tables that are used internally by HarperDB. For this reason if you wish to use a non default `path` value you must move any existing schemas into your `path` location. Existing schemas is likely to include the system schema which can be found at `/schema/system`. `pageSize` - _Type_: number; _Default_: Defaults to the default page size of the OS @@ -772,7 +773,7 @@ storage: pageSize: 4096 ``` -*** +--- ### `tls` @@ -808,16 +809,15 @@ tls: - certificate: ~/hdb/keys/certificate1.pem certificateAuthority: ~/hdb/keys/ca1.pem privateKey: ~/hdb/keys/privateKey1.pem - host: example.com # the host is optional, and if not provided, this certificate's common name will be used as the host name. + host: example.com # the host is optional, and if not provided, this certificate's common name will be used as the host name. - certificate: ~/hdb/keys/certificate2.pem certificateAuthority: ~/hdb/keys/ca2.pem privateKey: ~/hdb/keys/privateKey2.pem - ``` Note that a `tls` section can also be defined in the `operationsApi` section, which will override the root `tls` section for the operations API. -*** +--- ### `mqtt` @@ -869,6 +869,7 @@ This can be enabled to require client certificates (mTLS) for all incoming MQTT This can define a specific path to use for the certificate authority. By default, certificate authorization checks against the CA specified at `tls.certificateAuthority`, but if you need a specific/distinct CA for MQTT, you can set this. For example, you could specify that mTLS is required and will authenticate as "user-name": + ```yaml mqtt: network: @@ -877,7 +878,7 @@ mqtt: required: true ``` -*** +--- ### `databases` @@ -931,20 +932,22 @@ Using the API: ```json { - "operation": "set_configuration", - "databases": [{ - "nameOfDatabase": { - "tables": { - "nameOfTable": { - "path": "/path/to/table" - } - } - } - }] + "operation": "set_configuration", + "databases": [ + { + "nameOfDatabase": { + "tables": { + "nameOfTable": { + "path": "/path/to/table" + } + } + } + } + ] } ``` -*** +--- ### Components @@ -954,7 +957,7 @@ The name of the component. This will be used to name the folder where the compon `package` - _Type_: string -A reference to your [component](../developers/components/installing) package.This could be a remote git repo, a local folder/file or an NPM package. +A reference to your [component](../developers/components/installing) package.This could be a remote git repo, a local folder/file or an NPM package. HarperDB will add this package to a package.json file and call `npm install` on it, so any reference that works with that paradigm will work here. Read more about npm install [here](https://docs.npmjs.com/cli/v8/commands/npm-install) @@ -967,4 +970,4 @@ The port that your component should listen on. If no port is provided it will de : package: 'HarperDB-Add-Ons/package-name' port: 4321 -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.3/deployments/harperdb-cli.md b/site/versioned_docs/version-4.3/deployments/harperdb-cli.md index dd439c2e..e4bf6f33 100644 --- a/site/versioned_docs/version-4.3/deployments/harperdb-cli.md +++ b/site/versioned_docs/version-4.3/deployments/harperdb-cli.md @@ -35,7 +35,7 @@ harperdb install harperdb install --TC_AGREEMENT yes --HDB_ADMIN_USERNAME HDB_ADMIN --HDB_ADMIN_PASSWORD password --ROOTPATH /tmp/hdb/ --OPERATIONSAPI_NETWORK_PORT 9925 ``` -*** +--- ## Starting HarperDB @@ -45,7 +45,7 @@ To start HarperDB after it is installed, run the following command: harperdb start ``` -*** +--- ## Stopping HarperDB @@ -55,7 +55,7 @@ To stop HarperDB once it is running, run the following command: harperdb stop ``` -*** +--- ## Restarting HarperDB @@ -64,7 +64,8 @@ To restart HarperDB once it is running, run the following command: ```bash harperdb restart ``` -*** + +--- ## Getting the HarperDB Version @@ -73,7 +74,8 @@ To check the version of HarperDB that is installed run the following command: ```bash harperdb version ``` -*** + +--- ## Renew self-signed certificates @@ -83,22 +85,23 @@ To renew the HarperDB generated self-signed certificates, run: harperdb renew-certs ``` -*** +--- ## Copy a database with compaction -To copy a HarperDB database with compaction (to eliminate free-space and fragmentation), use +To copy a HarperDB database with compaction (to eliminate free-space and fragmentation), use ```bash harperdb copy-db ``` + For example, to copy the default database: + ```bash harperdb copy-db data /home/user/hdb/database/copy.mdb ``` - -*** +--- ## Get all available CLI commands @@ -107,7 +110,8 @@ To display all available HarperDB CLI commands along with a brief description ru ```bash harperdb help ``` -*** + +--- ## Get the status of HarperDB and clustering @@ -117,18 +121,18 @@ To display the status of the HarperDB process, the clustering hub and leaf proce harperdb status ``` -*** +--- ## Backups HarperDB uses a transactional commit process that ensures that data on disk is always transactionally consistent with storage. This means that HarperDB maintains database integrity in the event of a crash. It also means that you can use any standard volume snapshot tool to make a backup of a HarperDB database. Database files are stored in the hdb/database directory. As long as the snapshot is an atomic snapshot of these database files, the data can be copied/moved back into the database directory to restore a previous backup (with HarperDB shut down) , and database integrity will be preserved. Note that simply copying an in-use database file (using `cp`, for example) is _not_ a snapshot, and this would progressively read data from the database at different points in time, which yields unreliable copy that likely will not be usable. Standard copying is only reliable for a database file that is not in use. -*** +--- # Operations API through the CLI -Some of the API operations are available through the CLI, this includes most operations that do not require nested parameters. -To call the operation use the following convention: ` =`. +Some of the API operations are available through the CLI, this includes most operations that do not require nested parameters. +To call the operation use the following convention: ` =`. By default, the result will be formatted as YAML, if you would like the result in JSON pass: `json=true`. Some examples are: diff --git a/site/versioned_docs/version-4.3/deployments/harperdb-cloud/alarms.md b/site/versioned_docs/version-4.3/deployments/harperdb-cloud/alarms.md index 03526fa8..8bf264d9 100644 --- a/site/versioned_docs/version-4.3/deployments/harperdb-cloud/alarms.md +++ b/site/versioned_docs/version-4.3/deployments/harperdb-cloud/alarms.md @@ -8,13 +8,13 @@ HarperDB Cloud instance alarms are triggered when certain conditions are met. On ### Heading Definitions -* **Alarm**: Title of the alarm. -* **Threshold**: Definition of the alarm threshold. -* **Intervals**: The number of occurrences before an alarm is triggered and the period that the metric is evaluated over. -* **Proposed Remedy**: Recommended solution to avoid the alert in the future. +- **Alarm**: Title of the alarm. +- **Threshold**: Definition of the alarm threshold. +- **Intervals**: The number of occurrences before an alarm is triggered and the period that the metric is evaluated over. +- **Proposed Remedy**: Recommended solution to avoid the alert in the future. -| Alarm | Threshold | Intervals | Proposed Remedy | -| ------- | ---------- | --------- | -------------------------------------------------------------------------------------------------------------------------------- | +| Alarm | Threshold | Intervals | Proposed Remedy | +| ------- | ---------- | --------- | ----------------------------------------------------------------------------------------------------------------------------- | | Storage | > 90% Disk | 1 x 5min | [Increased storage volume](../../administration/harperdb-studio/instance-configuration#update-instance-storage) | | CPU | > 90% Avg | 2 x 5min | [Increase instance size for additional CPUs](../../administration/harperdb-studio/instance-configuration#update-instance-ram) | | Memory | > 90% RAM | 2 x 5min | [Increase instance size](../../administration/harperdb-studio/instance-configuration#update-instance-ram) | diff --git a/site/versioned_docs/version-4.3/deployments/harperdb-cloud/iops-impact.md b/site/versioned_docs/version-4.3/deployments/harperdb-cloud/iops-impact.md index 8d1b952a..e2591631 100644 --- a/site/versioned_docs/version-4.3/deployments/harperdb-cloud/iops-impact.md +++ b/site/versioned_docs/version-4.3/deployments/harperdb-cloud/iops-impact.md @@ -28,15 +28,18 @@ For assistance in estimating IOPS requirements feel free to contact HarperDB Sup ## Example Use Case IOPS Requirements -* **Sensor Data Collection** +- **Sensor Data Collection** - In the case of IoT sensors where data collection will be sustained, high IOPS are required. While there are not typically large queries going on in this case, there is a high volume of data being ingested. This implies that IOPS will be sustained at a high level. For example, if you are collecting 100 records per second you would expect to need roughly 3,000 IOPS just to handle the data inserts. -* **Data Analytics/BI Server** + In the case of IoT sensors where data collection will be sustained, high IOPS are required. While there are not typically large queries going on in this case, there is a high volume of data being ingested. This implies that IOPS will be sustained at a high level. For example, if you are collecting 100 records per second you would expect to need roughly 3,000 IOPS just to handle the data inserts. - Providing a server for analytics purposes typically requires a larger machine. Typically these cases involve large scale SQL joins and aggregations, which puts a large strain on reads. HarperDB utilizes an in-memory cache, which provides a significant performance boost on machines with large amounts of memory. However, if disparate datasets are constantly being queried and/or new data is frequently being loaded, you will find that the system still needs to have high IOPS to meet performance demand. -* **Web Services** +- **Data Analytics/BI Server** - Typical web service implementations with discrete reads and writes often do not need high IOPS to perform as expected. This is often the case in more transactional systems without the requirement for high performance load. A good rule to follow is that any HarperDB operation that requires a data scan will be IOPS intensive, but if these are not frequent then the EBS boost will suffice. Queries utilizing equals operations in either SQL or NoSQL do not require a scan due to HarperDB’s native indexing. -* **High Performance Database** + Providing a server for analytics purposes typically requires a larger machine. Typically these cases involve large scale SQL joins and aggregations, which puts a large strain on reads. HarperDB utilizes an in-memory cache, which provides a significant performance boost on machines with large amounts of memory. However, if disparate datasets are constantly being queried and/or new data is frequently being loaded, you will find that the system still needs to have high IOPS to meet performance demand. - Ultimately, if performance is your top priority, HarperDB should be run on bare metal hardware. Cloud providers offer these options at a higher cost, but they come with obvious performance improvements. +- **Web Services** + + Typical web service implementations with discrete reads and writes often do not need high IOPS to perform as expected. This is often the case in more transactional systems without the requirement for high performance load. A good rule to follow is that any HarperDB operation that requires a data scan will be IOPS intensive, but if these are not frequent then the EBS boost will suffice. Queries utilizing equals operations in either SQL or NoSQL do not require a scan due to HarperDB’s native indexing. + +- **High Performance Database** + + Ultimately, if performance is your top priority, HarperDB should be run on bare metal hardware. Cloud providers offer these options at a higher cost, but they come with obvious performance improvements. diff --git a/site/versioned_docs/version-4.3/deployments/harperdb-cloud/verizon-5g-wavelength-instances.md b/site/versioned_docs/version-4.3/deployments/harperdb-cloud/verizon-5g-wavelength-instances.md index f2100f77..9c84cefa 100644 --- a/site/versioned_docs/version-4.3/deployments/harperdb-cloud/verizon-5g-wavelength-instances.md +++ b/site/versioned_docs/version-4.3/deployments/harperdb-cloud/verizon-5g-wavelength-instances.md @@ -28,4 +28,4 @@ AWS EBS gp2 volumes have a baseline performance level, which determines the numb Smaller gp2 volumes are perfect for trying out the functionality of HarperDB, and might also work well for applications that don’t perform many database transactions. For applications that perform a moderate or high number of transactions, we recommend that you use a larger HarperDB volume. Learn more about the [impact of IOPS on performance here](./iops-impact). -You can read more about [AWS EBS gp2 volume IOPS here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html#ebsvolumetypes\_gp2). +You can read more about [AWS EBS gp2 volume IOPS here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html#ebsvolumetypes_gp2). diff --git a/site/versioned_docs/version-4.3/deployments/install-harperdb/index.md b/site/versioned_docs/version-4.3/deployments/install-harperdb/index.md index 42b2663b..9e45d6da 100644 --- a/site/versioned_docs/version-4.3/deployments/install-harperdb/index.md +++ b/site/versioned_docs/version-4.3/deployments/install-harperdb/index.md @@ -55,7 +55,7 @@ npm install -g harperdb-X.X.X.tgz harperdb install HarperDB comes with binaries for standard AMD64/x64 or ARM64 CPU architectures on Linux, Windows (x64 only), and Mac (including Apple Silicon). However, if you are installing on a less common platform (Alpine, for example), you will need to ensure that you have build tools installed for the installation process to compile the binaries (this is handled automatically), including: -* [Go](https://go.dev/dl/): version 1.19.1 -* GCC -* Make -* Python v3.7, v3.8, v3.9, or v3.10 +- [Go](https://go.dev/dl/): version 1.19.1 +- GCC +- Make +- Python v3.7, v3.8, v3.9, or v3.10 diff --git a/site/versioned_docs/version-4.3/deployments/install-harperdb/linux.md b/site/versioned_docs/version-4.3/deployments/install-harperdb/linux.md index 026e9fe0..86ff5b97 100644 --- a/site/versioned_docs/version-4.3/deployments/install-harperdb/linux.md +++ b/site/versioned_docs/version-4.3/deployments/install-harperdb/linux.md @@ -8,7 +8,7 @@ If you wish to install locally or already have a configured server, see the basi The following is a recommended way to configure Linux and install HarperDB. These instructions should work reasonably well for any public cloud or on-premises Linux instance. -*** +--- These instructions assume that the following has already been completed: @@ -22,7 +22,7 @@ While you will need to access HarperDB through port 9925 for the administration For this example, we will use an AWS Ubuntu Server 22.04 LTS m5.large EC2 Instance with an additional General Purpose SSD EBS volume and the default “ubuntu” user account. -*** +--- ### (Optional) LVM Configuration @@ -85,7 +85,7 @@ Run `lsblk` and note the device name of the additional volume lsblk ``` -Create an ext4 filesystem on the volume (The below commands assume the device name is nvme1n1. If you used LVM to create logical volume, replace /dev/nvme1n1 with /dev/hdb\_vg/hdb\_lv) +Create an ext4 filesystem on the volume (The below commands assume the device name is nvme1n1. If you used LVM to create logical volume, replace /dev/nvme1n1 with /dev/hdb_vg/hdb_lv) ```bash sudo mkfs.ext4 -L hdb_data /dev/nvme1n1 @@ -175,6 +175,7 @@ harperdb start \ ``` You can also use a custom configuration file to set values on install, use the CLI/ENV variable `HDB_CONFIG` and set it to the path of your [custom configuration file](../../deployments/configuration): + ```bash npm install -g harperdb harperdb start \ @@ -185,6 +186,7 @@ harperdb start \ ``` #### Start HarperDB on Boot + HarperDB will automatically start after installation. If you wish HarperDB to start when the OS boots, you have two options: You can set up a crontab: diff --git a/site/versioned_docs/version-4.3/deployments/upgrade-hdb-instance.md b/site/versioned_docs/version-4.3/deployments/upgrade-hdb-instance.md index b5f54570..3fd61cfd 100644 --- a/site/versioned_docs/version-4.3/deployments/upgrade-hdb-instance.md +++ b/site/versioned_docs/version-4.3/deployments/upgrade-hdb-instance.md @@ -12,10 +12,11 @@ Upgrading HarperDB is a two-step process. First the latest version of HarperDB m 1. Install the latest version of HarperDB using `npm install -g harperdb`. - Note `-g` should only be used if you installed HarperDB globally (which is recommended). + Note `-g` should only be used if you installed HarperDB globally (which is recommended). + 1. Run `harperdb` to initiate the upgrade process. - HarperDB will then prompt you for all appropriate inputs and then run the upgrade directives. + HarperDB will then prompt you for all appropriate inputs and then run the upgrade directives. ## Node Version Manager (nvm) diff --git a/site/versioned_docs/version-4.3/developers/_category_.json b/site/versioned_docs/version-4.3/developers/_category_.json index 9fe399bf..fdc723e5 100644 --- a/site/versioned_docs/version-4.3/developers/_category_.json +++ b/site/versioned_docs/version-4.3/developers/_category_.json @@ -1,12 +1,10 @@ { - "label": "Developers", - "position": 1, - "link": { - "type": "generated-index", - "title": "Developers Documentation", - "description": "Comprehensive guides and references for building applications with HarperDB", - "keywords": [ - "developers" - ] - } -} \ No newline at end of file + "label": "Developers", + "position": 1, + "link": { + "type": "generated-index", + "title": "Developers Documentation", + "description": "Comprehensive guides and references for building applications with HarperDB", + "keywords": ["developers"] + } +} diff --git a/site/versioned_docs/version-4.3/developers/applications/caching.md b/site/versioned_docs/version-4.3/developers/applications/caching.md index 10f70f84..2389fa6d 100644 --- a/site/versioned_docs/version-4.3/developers/applications/caching.md +++ b/site/versioned_docs/version-4.3/developers/applications/caching.md @@ -21,9 +21,10 @@ You may also note that we can define a time-to-live (TTL) expiration on the tabl While you can provide a single expiration time, there are actually several expiration timings that are potentially relevant, and can be independently configured. These settings are available as directive properties on the table configuration (like `expiration` above): stale expiration: The point when a request for a record should trigger a request to origin (but might possibly return the current stale record depending on policy) must-revalidate expiration: The point when a request for a record must make a request to origin first and return the latest value from origin. eviction expiration: The point when a record is actually removed from the caching table. You can provide a single expiration and it defines the behavior for all three. You can also provide three settings for expiration, through table directives: -* expiration - The amount of time until a record goes stale. -* eviction - The amount of time after expiration before a record can be evicted (defaults to zero). -* scanInterval - The interval for scanning for expired records (defaults to one quarter of the total of expiration and eviction). + +- expiration - The amount of time until a record goes stale. +- eviction - The amount of time after expiration before a record can be evicted (defaults to zero). +- scanInterval - The interval for scanning for expired records (defaults to one quarter of the total of expiration and eviction). ## Define External Data Source @@ -32,8 +33,8 @@ Next, you need to define the source for your cache. External data sources could ```javascript class ThirdPartyAPI extends Resource { async get() { - return (await fetch(`https://some-api.com/${this.getId()}`)).json(); - } + return (await fetch(`https://some-api.com/${this.getId()}`)).json(); + } } ``` @@ -68,11 +69,11 @@ In the example above, we simply retrieved data to fulfill a cache request. We ma ```javascript class ThirdPartyAPI extends Resource { - async get() { - let response = await fetch(`https://some-api.com/${this.getId()}`); - this.getContext().lastModified = response.headers.get('Last-Modified'); - return response.json(); - } + async get() { + let response = await fetch(`https://some-api.com/${this.getId()}`); + this.getContext().lastModified = response.headers.get('Last-Modified'); + return response.json(); + } } ``` @@ -108,10 +109,11 @@ One way to provide more active caching is to specifically invalidate individual ```javascript const { MyTable } = tables; export class MyTableEndpoint extends MyTable { - async post(data) { - if (data.invalidate) // use this flag as a marker - this.invalidate(); - } + async post(data) { + if (data.invalidate) + // use this flag as a marker + this.invalidate(); + } } ``` @@ -142,20 +144,20 @@ class ThirdPartyAPI extends Resource { Notification events should always include an `id` property to indicate the primary key of the updated record. The event should have a `value` property for `put` and `message` event types. The `timestamp` is optional and can be used to indicate the exact timestamp of the change. The following event `type`s are supported: -* `put` - This indicates that the record has been updated and provides the new value of the record. -* `invalidate` - Alternately, you can notify with an event type of `invalidate` to indicate that the data has changed, but without the overhead of actually sending the data (the `value` property is not needed), so the data only needs to be sent if and when the data is requested through the cache. An `invalidate` will evict the entry and update the timestamp to indicate that there is new data that should be requested (if needed). -* `delete` - This indicates that the record has been deleted. -* `message` - This indicates a message is being passed through the record. The record value has not changed, but this is used for [publish/subscribe messaging](../real-time). -* `transaction` - This indicates that there are multiple writes that should be treated as a single atomic transaction. These writes should be included as an array of data notification events in the `writes` property. +- `put` - This indicates that the record has been updated and provides the new value of the record. +- `invalidate` - Alternately, you can notify with an event type of `invalidate` to indicate that the data has changed, but without the overhead of actually sending the data (the `value` property is not needed), so the data only needs to be sent if and when the data is requested through the cache. An `invalidate` will evict the entry and update the timestamp to indicate that there is new data that should be requested (if needed). +- `delete` - This indicates that the record has been deleted. +- `message` - This indicates a message is being passed through the record. The record value has not changed, but this is used for [publish/subscribe messaging](../real-time). +- `transaction` - This indicates that there are multiple writes that should be treated as a single atomic transaction. These writes should be included as an array of data notification events in the `writes` property. And the following properties can be defined on event objects: -* `type`: The event type as described above. -* `id`: The primary key of the record that updated -* `value`: The new value of the record that updated (for put and message) -* `writes`: An array of event properties that are part of a transaction (used in conjunction with the transaction event type). -* `table`: The name of the table with the record that was updated. This can be used with events within a transaction to specify events across multiple tables. -* `timestamp`: The timestamp of when the data change occurred +- `type`: The event type as described above. +- `id`: The primary key of the record that updated +- `value`: The new value of the record that updated (for put and message) +- `writes`: An array of event properties that are part of a transaction (used in conjunction with the transaction event type). +- `table`: The name of the table with the record that was updated. This can be used with events within a transaction to specify events across multiple tables. +- `timestamp`: The timestamp of when the data change occurred With an active external data source with a `subscribe` method, the data source will proactively notify the cache, ensuring a fresh and efficient active cache. Note that with an active data source, we still use the `sourcedFrom` method to register the source for a caching table, and the table will automatically detect and call the subscribe method on the data source. @@ -174,13 +176,13 @@ An alternative to using asynchronous generators is to use a subscription stream ```javascript class ThirdPartyAPI extends Resource { - subscribe() { - const subscription = super.subscribe(); - setupListeningToRemoteService().on('update', (event) => { - subscription.send(event); - }); - return subscription; - } + subscribe() { + const subscription = super.subscribe(); + setupListeningToRemoteService().on('update', (event) => { + subscription.send(event); + }); + return subscription; + } } ``` @@ -216,12 +218,12 @@ When you are using a caching table, it is important to remember that any resourc ```javascript class MyCache extends tables.MyCache { - async post(data) { - // if the data is not cached locally, retrieves from source: - await this.ensuredLoaded(); - // now we can be sure that the data is loaded, and can access properties - this.quantity = this.quantity - data.purchases; - } + async post(data) { + // if the data is not cached locally, retrieves from source: + await this.ensuredLoaded(); + // now we can be sure that the data is loaded, and can access properties + this.quantity = this.quantity - data.purchases; + } } ``` @@ -267,21 +269,24 @@ Cache-Control: only-if-cached, no-store You may also use the `stale-if-error` to indicate if it is acceptable to return a stale cached resource when the data source returns an error (network connection error, 500, 502, 503, or 504). The `must-revalidate` directive can indicate a stale cached resource can not be returned, even when the data source has an error (by default a stale cached resource is returned when there is a network connection error). - ## Caching Flow + It may be helpful to understand the flow of a cache request. When a request is made to a caching table: -* HarperDB will first create a resource instance to handle the process, and ensure that the data is loaded for the resource instance. To do this, it will first check if the record is in the table/cache. - * If the record is not in the cache, HarperDB will first check if there is a current request to get the record from the source. If there is, HarperDB will wait for the request to complete and return the record from the cache. - * If not, HarperDB will call the `get()` method on the source to retrieve the record. The record will then be stored in the cache. - * If the record is in the cache, HarperDB will check if the record is stale. If the record is not stale, HarperDB will immediately return the record from the cache. If the record is stale, HarperDB will call the `get()` method on the source to retrieve the record. - * The record will then be stored in the cache. This will write of the record to the cache will be done in a separate asynchronous/background write-behind transaction, so it does not block the current request, which will return the data immediately once it has it. -* The `get()` method will be called on the resource instance to return the record to the client (or perform any querying on the record). If this is overriden, the method will be called at this time. + +- HarperDB will first create a resource instance to handle the process, and ensure that the data is loaded for the resource instance. To do this, it will first check if the record is in the table/cache. + - If the record is not in the cache, HarperDB will first check if there is a current request to get the record from the source. If there is, HarperDB will wait for the request to complete and return the record from the cache. + - If not, HarperDB will call the `get()` method on the source to retrieve the record. The record will then be stored in the cache. + - If the record is in the cache, HarperDB will check if the record is stale. If the record is not stale, HarperDB will immediately return the record from the cache. If the record is stale, HarperDB will call the `get()` method on the source to retrieve the record. + - The record will then be stored in the cache. This will write of the record to the cache will be done in a separate asynchronous/background write-behind transaction, so it does not block the current request, which will return the data immediately once it has it. +- The `get()` method will be called on the resource instance to return the record to the client (or perform any querying on the record). If this is overriden, the method will be called at this time. ### Caching Flow with Write-Through + When a writes are performed on a caching table (in `put()` or `post()` method, for example), the flow is slightly different: -* HarperDB will have first created a resource instance to handle the process, and this resource instance that will be the current `this` for a call to `put()` or `post()`. -* If a `put()` or `update()` is called, for example, this action will be record in the current transaction. -* Once the transaction is committed (which is done automatically as the request handler completes), the transaction write will be sent to the source to update the data. - * The local writes will wait for the source to confirm the writes have completed (note that this effectively allows you to perform a two-phase transactional write to the source, and the source can confirm the writes have completed before the transaction is committed locally). - * The transaction writes will then be written the local caching table. -* The transaction handler will wait for the local commit to be written, then the transaction will be resolved and a response will be sent to the client. + +- HarperDB will have first created a resource instance to handle the process, and this resource instance that will be the current `this` for a call to `put()` or `post()`. +- If a `put()` or `update()` is called, for example, this action will be record in the current transaction. +- Once the transaction is committed (which is done automatically as the request handler completes), the transaction write will be sent to the source to update the data. + - The local writes will wait for the source to confirm the writes have completed (note that this effectively allows you to perform a two-phase transactional write to the source, and the source can confirm the writes have completed before the transaction is committed locally). + - The transaction writes will then be written the local caching table. +- The transaction handler will wait for the local commit to be written, then the transaction will be resolved and a response will be sent to the client. diff --git a/site/versioned_docs/version-4.3/developers/applications/debugging.md b/site/versioned_docs/version-4.3/developers/applications/debugging.md index ca03115f..d37d9074 100644 --- a/site/versioned_docs/version-4.3/developers/applications/debugging.md +++ b/site/versioned_docs/version-4.3/developers/applications/debugging.md @@ -18,13 +18,13 @@ For local debugging and development, it is recommended that you use standard con HarperDB Logger Functions -* `trace(message)`: Write a 'trace' level log, if the configured level allows for it. -* `debug(message)`: Write a 'debug' level log, if the configured level allows for it. -* `info(message)`: Write a 'info' level log, if the configured level allows for it. -* `warn(message)`: Write a 'warn' level log, if the configured level allows for it. -* `error(message)`: Write a 'error' level log, if the configured level allows for it. -* `fatal(message)`: Write a 'fatal' level log, if the configured level allows for it. -* `notify(message)`: Write a 'notify' level log. +- `trace(message)`: Write a 'trace' level log, if the configured level allows for it. +- `debug(message)`: Write a 'debug' level log, if the configured level allows for it. +- `info(message)`: Write a 'info' level log, if the configured level allows for it. +- `warn(message)`: Write a 'warn' level log, if the configured level allows for it. +- `error(message)`: Write a 'error' level log, if the configured level allows for it. +- `fatal(message)`: Write a 'fatal' level log, if the configured level allows for it. +- `notify(message)`: Write a 'notify' level log. For example, you can log a warning: diff --git a/site/versioned_docs/version-4.3/developers/applications/define-routes.md b/site/versioned_docs/version-4.3/developers/applications/define-routes.md index 450238f2..411c5a68 100644 --- a/site/versioned_docs/version-4.3/developers/applications/define-routes.md +++ b/site/versioned_docs/version-4.3/developers/applications/define-routes.md @@ -16,23 +16,23 @@ fastifyRoutes: # This loads files that define fastify routes using fastify's aut By default, route URLs are configured to be: -* \[**Instance URL**]:\[**HTTP Port**]/\[**Project Name**]/\[**Route URL**] +- \[**Instance URL**]:\[**HTTP Port**]/\[**Project Name**]/\[**Route URL**] However, you can specify the path to be `/` if you wish to have your routes handling the root path of incoming URLs. -* The route below, using the default config, within the **dogs** project, with a route of **breeds** would be available at **http:/localhost:9926/dogs/breeds**. +- The route below, using the default config, within the **dogs** project, with a route of **breeds** would be available at **http:/localhost:9926/dogs/breeds**. In effect, this route is just a pass-through to HarperDB. The same result could have been achieved by hitting the core HarperDB API, since it uses **hdbCore.preValidation** and **hdbCore.request**, which are defined in the “helper methods” section, below. ```javascript export default async (server, { hdbCore, logger }) => { - server.route({ - url: '/', - method: 'POST', - preValidation: hdbCore.preValidation, - handler: hdbCore.request, - }) -} + server.route({ + url: '/', + method: 'POST', + preValidation: hdbCore.preValidation, + handler: hdbCore.request, + }); +}; ``` ## Custom Handlers @@ -69,20 +69,20 @@ Below is an example of a route that uses a custom validation hook: import customValidation from '../helpers/customValidation'; export default async (server, { hdbCore, logger }) => { - server.route({ - url: '/:id', - method: 'GET', - preValidation: (request) => customValidation(request, logger), - handler: (request) => { - request.body= { - operation: 'sql', - sql: `SELECT * FROM dev.dog WHERE id = ${request.params.id}` - }; - - return hdbCore.requestWithoutAuthentication(request); - } - }); -} + server.route({ + url: '/:id', + method: 'GET', + preValidation: (request) => customValidation(request, logger), + handler: (request) => { + request.body = { + operation: 'sql', + sql: `SELECT * FROM dev.dog WHERE id = ${request.params.id}`, + }; + + return hdbCore.requestWithoutAuthentication(request); + }, + }); +}; ``` Notice we imported customValidation from the **helpers** directory. To include a helper, and to see the actual code within customValidation, see [Define Helpers](#helper-methods). @@ -95,24 +95,25 @@ When declaring routes, you are given access to 2 helper methods: hdbCore and log hdbCore contains three functions that allow you to authenticate an inbound request, and execute operations against HarperDB directly, by passing the standard Operations API. -* **preValidation** +- **preValidation** + + This is an array of functions used for fastify authentication. The second function takes the authorization header from the inbound request and executes the same authentication as the standard HarperDB Operations API (for example, `hdbCore.preValidation[1](./req, resp, callback)`). It will determine if the user exists, and if they are allowed to perform this operation. **If you use the request method, you have to use preValidation to get the authenticated user**. - This is an array of functions used for fastify authentication. The second function takes the authorization header from the inbound request and executes the same authentication as the standard HarperDB Operations API (for example, `hdbCore.preValidation[1](./req, resp, callback)`). It will determine if the user exists, and if they are allowed to perform this operation. **If you use the request method, you have to use preValidation to get the authenticated user**. -* **request** +- **request** - This will execute a request with HarperDB using the operations API. The `request.body` should contain a standard HarperDB operation and must also include the `hdb_user` property that was in `request.body` provided in the callback. -* **requestWithoutAuthentication** + This will execute a request with HarperDB using the operations API. The `request.body` should contain a standard HarperDB operation and must also include the `hdb_user` property that was in `request.body` provided in the callback. - Executes a request against HarperDB without any security checks around whether the inbound user is allowed to make this request. For security purposes, you should always take the following precautions when using this method: +- **requestWithoutAuthentication** - * Properly handle user-submitted values, including url params. User-submitted values should only be used for `search_value` and for defining values in records. Special care should be taken to properly escape any values if user-submitted values are used for SQL. + Executes a request against HarperDB without any security checks around whether the inbound user is allowed to make this request. For security purposes, you should always take the following precautions when using this method: + - Properly handle user-submitted values, including url params. User-submitted values should only be used for `search_value` and for defining values in records. Special care should be taken to properly escape any values if user-submitted values are used for SQL. **logger** This helper allows you to write directly to the log file, hdb.log. It’s useful for debugging during development, although you may also use the console logger. There are 5 functions contained within logger, each of which pertains to a different **logging.level** configuration in your harperdb-config.yaml file. -* logger.trace(‘Starting the handler for /dogs’) -* logger.debug(‘This should only fire once’) -* logger.warn(‘This should never ever fire’) -* logger.error(‘This did not go well’) -* logger.fatal(‘This did not go very well at all’) +- logger.trace(‘Starting the handler for /dogs’) +- logger.debug(‘This should only fire once’) +- logger.warn(‘This should never ever fire’) +- logger.error(‘This did not go well’) +- logger.fatal(‘This did not go very well at all’) diff --git a/site/versioned_docs/version-4.3/developers/applications/defining-schemas.md b/site/versioned_docs/version-4.3/developers/applications/defining-schemas.md index 70e293c2..c2c577d6 100644 --- a/site/versioned_docs/version-4.3/developers/applications/defining-schemas.md +++ b/site/versioned_docs/version-4.3/developers/applications/defining-schemas.md @@ -40,10 +40,10 @@ type TableName @table By default the table name is inherited from the type name (in this case the table name would be "TableName"). The `@table` directive supports several optional arguments (all of these are optional and can be freely combined): -* `@table(table: "table_name")` - This allows you to explicitly specify the table name. -* `@table(database: "database_name")` - This allows you to specify which database the table belongs to. This defaults to the "data" database. -* `@table(expiration: 3600)` - Sets an expiration time on entries in the table before they are automatically cleared (primarily useful for caching tables). This is specified in seconds. -* `@table(audit: true)` - This enables the audit log for the table so that a history of record changes are recorded. This defaults to [configuration file's setting for `auditLog`](../../deployments/configuration#logging). +- `@table(table: "table_name")` - This allows you to explicitly specify the table name. +- `@table(database: "database_name")` - This allows you to specify which database the table belongs to. This defaults to the "data" database. +- `@table(expiration: 3600)` - Sets an expiration time on entries in the table before they are automatically cleared (primarily useful for caching tables). This is specified in seconds. +- `@table(audit: true)` - This enables the audit log for the table so that a history of record changes are recorded. This defaults to [configuration file's setting for `auditLog`](../../deployments/configuration#logging). #### `@export` @@ -58,11 +58,14 @@ type MyTable @table @export(name: "my-table") This table would be available at the URL path `/my-table/`. Without the `name` parameter, the exported name defaults to the name of the table type ("MyTable" in this example). ### Relationships: `@relationship` + Defining relationships is the foundation of using "join" queries in HarperDB. A relationship defines how one table relates to another table using a foreign key. Using the `@relationship` directive will define a property as a computed property, which resolves to the an record/instance from a target type, based on the referenced attribute, which can be in this table or the target table. The `@relationship` directive must be used in combination with an attribute with a type that references another table. #### `@relationship(from: attribute)` + This defines a relationship where the foreign key is defined in this table, and relates to the primary key of the target table. If the foreign key is single-valued, this establishes a many-to-one relationship with the target table. The foreign key may also be a multi-valued array, in which case this will be a many-to-many relationship. For example, we can define a foreign key that references another table and then define the relationship. Here we create a `brandId` attribute that will be our foreign key (it will hold an id that references the primary key of the Brand table), and we define a relationship to the `Brand` table through the `brand` attribute: + ```graphql type Product @table @export { id: ID @primaryKey @@ -73,6 +76,7 @@ type Brand @table @export { id: ID @primaryKey } ``` + Once this is defined we can use the `brand` attribute as a [property in our product instances](../../technical-details/reference/resource) and allow for querying by `brand` and selecting brand attributes as returned properties in [query results](../rest). Again, the foreign key may be a multi-valued array (array of keys referencing the target table records). For example, if we had a list of features that references a Feature table: @@ -90,8 +94,10 @@ type Feature @table { ``` #### `@relationship(to: attribute)` + This defines a relationship where the foreign key is defined in the target table and relates to primary key of this table. If the foreign key is single-valued, this establishes a one-to-many relationship with the target table. Note that the target table type must be an array element type (like `[Table]`). The foreign key may also be a multi-valued array, in which case this will be a many-to-many relationship. For example, we can define on a reciprocal relationship, from the example above, adding a relationship from brand back to product. Here we use continue to use the `brandId` attribute from the `Product` schema, and we define a relationship to the `Product` table through the `products` attribute: + ```graphql type Brand @table @export { id: ID @primaryKey @@ -99,6 +105,7 @@ type Brand @table @export { products: [Product] @relationship(to: brandId) } ``` + Once this is defined we can use the `products` attribute as a property in our brand instances and allow for querying by `products` and selecting product attributes as returned properties in query results. Note that schemas can also reference themselves with relationships, allow records to define relationships like parent-child relationships between records in the same table. @@ -135,16 +142,16 @@ If you do not define a schema for a table and create a table through the operati HarperDB supports the following field types in addition to user defined (object) types: -* `String`: String/text. -* `Int`: A 32-bit signed integer (from -2147483648 to 2147483647). -* `Long`: A 54-bit signed integer (from -9007199254740992 to 9007199254740992). -* `Float`: Any number (any number that can be represented as a [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision\_floating-point\_format). Note that all numbers are stored in the most compact representation available). -* `BigInt`: Any integer (negative or positive) with less than 300 digits. (Note that `BigInt` is a distinct and separate type from standard numbers in JavaScript, so custom code should handle this type appropriately.) -* `Boolean`: true or false. -* `ID`: A string (but indicates it is not intended to be human readable). -* `Any`: Any primitive, object, or array is allowed. -* `Date`: A Date object. -* `Bytes`: Binary data (as a Buffer or Uint8Array). +- `String`: String/text. +- `Int`: A 32-bit signed integer (from -2147483648 to 2147483647). +- `Long`: A 54-bit signed integer (from -9007199254740992 to 9007199254740992). +- `Float`: Any number (any number that can be represented as a [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision_floating-point_format). Note that all numbers are stored in the most compact representation available). +- `BigInt`: Any integer (negative or positive) with less than 300 digits. (Note that `BigInt` is a distinct and separate type from standard numbers in JavaScript, so custom code should handle this type appropriately.) +- `Boolean`: true or false. +- `ID`: A string (but indicates it is not intended to be human readable). +- `Any`: Any primitive, object, or array is allowed. +- `Date`: A Date object. +- `Bytes`: Binary data (as a Buffer or Uint8Array). #### Renaming Tables @@ -152,10 +159,10 @@ It is important to note that HarperDB does not currently support renaming tables ### OpenAPI Specification -_The [OpenAPI Specification](https://spec.openapis.org/oas/v3.1.0) defines a standard, programming language-agnostic interface description for HTTP APIs, -which allows both humans and computers to discover and understand the capabilities of a service without requiring +_The [OpenAPI Specification](https://spec.openapis.org/oas/v3.1.0) defines a standard, programming language-agnostic interface description for HTTP APIs, +which allows both humans and computers to discover and understand the capabilities of a service without requiring access to source code, additional documentation, or inspection of network traffic._ If a set of endpoints are configured through a HarperDB GraphQL schema, those endpoints can be described by using a default REST endpoint called `GET /openapi`. -_Note: The `/openapi` endpoint should only be used as a starting guide, it may not cover all the elements of an endpoint._ \ No newline at end of file +_Note: The `/openapi` endpoint should only be used as a starting guide, it may not cover all the elements of an endpoint._ diff --git a/site/versioned_docs/version-4.3/developers/applications/example-projects.md b/site/versioned_docs/version-4.3/developers/applications/example-projects.md index 5bd07e77..1b90c862 100644 --- a/site/versioned_docs/version-4.3/developers/applications/example-projects.md +++ b/site/versioned_docs/version-4.3/developers/applications/example-projects.md @@ -6,32 +6,32 @@ title: Example Projects **Library of example HarperDB applications and components:** -* [Authorization in HarperDB using Okta Customer Identity Cloud](https://www.harperdb.io/post/authorization-in-harperdb-using-okta-customer-identity-cloud), by Yitaek Hwang +- [Authorization in HarperDB using Okta Customer Identity Cloud](https://www.harperdb.io/post/authorization-in-harperdb-using-okta-customer-identity-cloud), by Yitaek Hwang -* [How to Speed Up your Applications by Caching at the Edge with HarperDB](https://dev.to/doabledanny/how-to-speed-up-your-applications-by-caching-at-the-edge-with-harperdb-3o2l), by Danny Adams +- [How to Speed Up your Applications by Caching at the Edge with HarperDB](https://dev.to/doabledanny/how-to-speed-up-your-applications-by-caching-at-the-edge-with-harperdb-3o2l), by Danny Adams -* [OAuth Authentication in HarperDB using Auth0 & Node.js](https://www.harperdb.io/post/oauth-authentication-in-harperdb-using-auth0-and-node-js), by Lucas Santos +- [OAuth Authentication in HarperDB using Auth0 & Node.js](https://www.harperdb.io/post/oauth-authentication-in-harperdb-using-auth0-and-node-js), by Lucas Santos -* [How To Create a CRUD API with Next.js & HarperDB Custom Functions](https://www.harperdb.io/post/create-a-crud-api-w-next-js-harperdb), by Colby Fayock +- [How To Create a CRUD API with Next.js & HarperDB Custom Functions](https://www.harperdb.io/post/create-a-crud-api-w-next-js-harperdb), by Colby Fayock -* [Build a Dynamic REST API with Custom Functions](https://harperdb.io/blog/build-a-dynamic-rest-api-with-custom-functions/), by Terra Roush +- [Build a Dynamic REST API with Custom Functions](https://harperdb.io/blog/build-a-dynamic-rest-api-with-custom-functions/), by Terra Roush -* [How to use HarperDB Custom Functions to Build your Entire Backend](https://dev.to/andrewbaisden/how-to-use-harperdb-custom-functions-to-build-your-entire-backend-a2m), by Andrew Baisden +- [How to use HarperDB Custom Functions to Build your Entire Backend](https://dev.to/andrewbaisden/how-to-use-harperdb-custom-functions-to-build-your-entire-backend-a2m), by Andrew Baisden -* [Using TensorFlowJS & HarperDB Custom Functions for Machine Learning](https://harperdb.io/blog/using-tensorflowjs-harperdb-for-machine-learning/), by Kevin Ashcraft +- [Using TensorFlowJS & HarperDB Custom Functions for Machine Learning](https://harperdb.io/blog/using-tensorflowjs-harperdb-for-machine-learning/), by Kevin Ashcraft -* [Build & Deploy a Fitness App with Python & HarperDB](https://www.youtube.com/watch?v=KMkmA4i2FQc), by Patrick Löber +- [Build & Deploy a Fitness App with Python & HarperDB](https://www.youtube.com/watch?v=KMkmA4i2FQc), by Patrick Löber -* [Create a Discord Slash Bot using HarperDB Custom Functions](https://geekysrm.hashnode.dev/discord-slash-bot-with-harperdb-custom-functions), by Soumya Ranjan Mohanty +- [Create a Discord Slash Bot using HarperDB Custom Functions](https://geekysrm.hashnode.dev/discord-slash-bot-with-harperdb-custom-functions), by Soumya Ranjan Mohanty -* [How I used HarperDB Custom Functions to Build a Web App for my Newsletter](https://blog.hrithwik.me/how-i-used-harperdb-custom-functions-to-build-a-web-app-for-my-newsletter), by Hrithwik Bharadwaj +- [How I used HarperDB Custom Functions to Build a Web App for my Newsletter](https://blog.hrithwik.me/how-i-used-harperdb-custom-functions-to-build-a-web-app-for-my-newsletter), by Hrithwik Bharadwaj -* [How I used HarperDB Custom Functions and Recharts to create Dashboard](https://blog.greenroots.info/how-to-create-dashboard-with-harperdb-custom-functions-and-recharts), by Tapas Adhikary +- [How I used HarperDB Custom Functions and Recharts to create Dashboard](https://blog.greenroots.info/how-to-create-dashboard-with-harperdb-custom-functions-and-recharts), by Tapas Adhikary -* [How To Use HarperDB Custom Functions With Your React App](https://dev.to/tyaga001/how-to-use-harperdb-custom-functions-with-your-react-app-2c43), by Ankur Tyagi +- [How To Use HarperDB Custom Functions With Your React App](https://dev.to/tyaga001/how-to-use-harperdb-custom-functions-with-your-react-app-2c43), by Ankur Tyagi -* [Build a Web App Using HarperDB’s Custom Functions](https://www.youtube.com/watch?v=rz6prItVJZU), livestream by Jaxon Repp +- [Build a Web App Using HarperDB’s Custom Functions](https://www.youtube.com/watch?v=rz6prItVJZU), livestream by Jaxon Repp -* [How to Web Scrape Using Python, Snscrape & Custom Functions](https://hackernoon.com/how-to-web-scrape-using-python-snscrape-and-harperdb), by Davis David +- [How to Web Scrape Using Python, Snscrape & Custom Functions](https://hackernoon.com/how-to-web-scrape-using-python-snscrape-and-harperdb), by Davis David -* [What’s the Big Deal w/ Custom Functions](https://rss.com/podcasts/harperdb-select-star/278933/), Select* Podcast +- [What’s the Big Deal w/ Custom Functions](https://rss.com/podcasts/harperdb-select-star/278933/), Select\* Podcast diff --git a/site/versioned_docs/version-4.3/developers/applications/index.md b/site/versioned_docs/version-4.3/developers/applications/index.md index 51c47624..2373810a 100644 --- a/site/versioned_docs/version-4.3/developers/applications/index.md +++ b/site/versioned_docs/version-4.3/developers/applications/index.md @@ -14,7 +14,7 @@ When working through this guide, we recommend you use the [HarperDB Application ## Understanding the Component Application Architecture -HarperDB provides several types of components. Any package that is added to HarperDB is called a "component", and components are generally categorized as either "applications", which deliver a set of endpoints for users, or "extensions", which are building blocks for features like authentication, additional protocols, and connectors that can be used by other components. Components can be added to the `hdb/components` directory and will be loaded by HarperDB when it starts. Components that are remotely deployed to HarperDB (through the studio or the operation API) are installed into the hdb/node\_modules directory. Using `harperdb run .` or `harperdb dev .` allows us to specifically load a certain application in addition to any that have been manually added to `hdb/components` or installed (in `node\_modules`). +HarperDB provides several types of components. Any package that is added to HarperDB is called a "component", and components are generally categorized as either "applications", which deliver a set of endpoints for users, or "extensions", which are building blocks for features like authentication, additional protocols, and connectors that can be used by other components. Components can be added to the `hdb/components` directory and will be loaded by HarperDB when it starts. Components that are remotely deployed to HarperDB (through the studio or the operation API) are installed into the hdb/node_modules directory. Using `harperdb run .` or `harperdb dev .` allows us to specifically load a certain application in addition to any that have been manually added to `hdb/components` or installed (in `node\_modules`). ```mermaid flowchart LR @@ -68,7 +68,7 @@ To create your own application from scratch, you'll may want to initialize it as Here's an example for a github repo: ```shell -> git remote set-url origin git@github.com:// +> git remote set-url origin git@github.com:// ``` Locally developing your application and then committing your app to a source control is a great way to manage your code and configuration, and then you can [directly deploy from your repository](./#deploying-your-application). @@ -186,7 +186,7 @@ If-None-Match: "etag-id" # browsers can automatically provide this ## Querying -Querying your application database is straightforward and easy, as tables exported with the `@export` directive are automatically exposed via [REST endpoints](../rest). Simple queries can be crafted through [URL query parameters](https://en.wikipedia.org/wiki/Query\_string). +Querying your application database is straightforward and easy, as tables exported with the `@export` directive are automatically exposed via [REST endpoints](../rest). Simple queries can be crafted through [URL query parameters](https://en.wikipedia.org/wiki/Query_string). In order to maintain reasonable query speed on a database as it grows in size, it is critical to select and establish the proper indexes. So, before we add the `@export` declaration to our `Dog` table and begin querying it, let's take a moment to target some table properties for indexing. We'll use `name` and `breed` as indexed table properties on our `Dog` table. All we need to do to accomplish this is tag these properties with the `@indexed` directive: @@ -228,9 +228,9 @@ Congratulations, you now have created a secure database application backend with This guide assumes that you're building a HarperDB application locally. If you have a cloud instance available, you can deploy it by doing the following: -* Commit and push your application component directory code (i.e., the `my-app` directory) to a Github repo. In this tutorial we started with a clone of the application-template. To commit and push to your own repository, change the origin to your repo: `git remote set-url origin git@github.com:your-account/your-repo.git` -* Go to the applications section of your target cloud instance in the [HarperDB Studio](../../administration/harperdb-studio/manage-applications). -* In the left-hand menu of the applications IDE, click 'deploy' and specify a package location reference that follows the [npm package specification](https://docs.npmjs.com/cli/v8/using-npm/package-spec) (i.e., a string like `HarperDB/Application-Template` or a URL like `https://github.com/HarperDB/application-template`, for example, that npm knows how to install). +- Commit and push your application component directory code (i.e., the `my-app` directory) to a Github repo. In this tutorial we started with a clone of the application-template. To commit and push to your own repository, change the origin to your repo: `git remote set-url origin git@github.com:your-account/your-repo.git` +- Go to the applications section of your target cloud instance in the [HarperDB Studio](../../administration/harperdb-studio/manage-applications). +- In the left-hand menu of the applications IDE, click 'deploy' and specify a package location reference that follows the [npm package specification](https://docs.npmjs.com/cli/v8/using-npm/package-spec) (i.e., a string like `HarperDB/Application-Template` or a URL like `https://github.com/HarperDB/application-template`, for example, that npm knows how to install). You can also deploy your application from your repository by directly using the [`deploy_component` operation](../operations-api/components#deploy-component). @@ -292,8 +292,7 @@ Here we have focused on customizing how we retrieve data, but we may also want t ```javascript export class CustomDog extends Dog { async post(data) { - if (data.action === 'add-trick') - this.tricks.push(data.trick); + if (data.action === 'add-trick') this.tricks.push(data.trick); } } ``` @@ -330,9 +329,10 @@ We can also directly implement the Resource class and use it to create new data ```javascript const { Breed } = tables; // our Breed table -class BreedSource extends Resource { // define a data source +class BreedSource extends Resource { + // define a data source async get() { - return (await fetch(`https://best-dog-site.com/${this.getId()}`)).json(); + return (await fetch(`https://best-dog-site.com/${this.getId()}`)).json(); } } // define that our breed table is a cache of data from the data source above, with a specified expiration @@ -351,10 +351,10 @@ This config file allows you define a location for static files, as well (that ar Each configuration entry can have the following properties, in addition to properties that may be specific to the individual component: -* `files`: This specifies the set of files that should be handled the component. This is a glob pattern, so a set of files can be specified like "directory/**". -* `path`: This is the URL path that is handled by this component. -* `root`: This specifies the root directory for mapping file paths to the URLs. For example, if you want all the files in `web/**` to be available in the root URL path via the static handler, you could specify a root of `web`, to indicate that the web directory maps to the root URL path. -* `package`: This is used to specify that this component is a third party package, and can be loaded from the specified package reference (which can be an NPM package, Github reference, URL, etc.). +- `files`: This specifies the set of files that should be handled the component. This is a glob pattern, so a set of files can be specified like "directory/\*\*". +- `path`: This is the URL path that is handled by this component. +- `root`: This specifies the root directory for mapping file paths to the URLs. For example, if you want all the files in `web/**` to be available in the root URL path via the static handler, you could specify a root of `web`, to indicate that the web directory maps to the root URL path. +- `package`: This is used to specify that this component is a third party package, and can be loaded from the specified package reference (which can be an NPM package, Github reference, URL, etc.). ## Define Fastify Routes diff --git a/site/versioned_docs/version-4.3/developers/clustering/certificate-management.md b/site/versioned_docs/version-4.3/developers/clustering/certificate-management.md index 58243cb7..e77a9a1c 100644 --- a/site/versioned_docs/version-4.3/developers/clustering/certificate-management.md +++ b/site/versioned_docs/version-4.3/developers/clustering/certificate-management.md @@ -34,7 +34,7 @@ Since these new certificates can be issued with correct CNs, you should set `ins ### Certificate Requirements -* Certificates must have an `Extended Key Usage` that defines both `TLS Web Server Authentication` and `TLS Web Client Authentication` as these certificates will be used to accept connections from other HarperDB nodes and to make requests to other HarperDB nodes. Example: +- Certificates must have an `Extended Key Usage` that defines both `TLS Web Server Authentication` and `TLS Web Client Authentication` as these certificates will be used to accept connections from other HarperDB nodes and to make requests to other HarperDB nodes. Example: ``` X509v3 Key Usage: critical @@ -43,8 +43,8 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication ``` -* If you are using an intermediate CA to issue the certificates, the entire certificate chain (to the root CA) must be included in the `certificateAuthority` file. -* If your certificates expire you will need a way to issue new certificates to the nodes and then restart HarperDB. If you are using a public CA such as LetsEncrypt, a tool like `certbot` can be used to renew certificates. +- If you are using an intermediate CA to issue the certificates, the entire certificate chain (to the root CA) must be included in the `certificateAuthority` file. +- If your certificates expire you will need a way to issue new certificates to the nodes and then restart HarperDB. If you are using a public CA such as LetsEncrypt, a tool like `certbot` can be used to renew certificates. ### Certificate Troubleshooting diff --git a/site/versioned_docs/version-4.3/developers/clustering/creating-a-cluster-user.md b/site/versioned_docs/version-4.3/developers/clustering/creating-a-cluster-user.md index 3edecd29..7865ae1c 100644 --- a/site/versioned_docs/version-4.3/developers/clustering/creating-a-cluster-user.md +++ b/site/versioned_docs/version-4.3/developers/clustering/creating-a-cluster-user.md @@ -16,11 +16,11 @@ There are multiple ways a `cluster_user` can be created, they are: ```json { - "operation": "add_user", - "role": "cluster_user", - "username": "cluster_account", - "password": "letsCluster123!", - "active": true + "operation": "add_user", + "role": "cluster_user", + "username": "cluster_account", + "password": "letsCluster123!", + "active": true } ``` @@ -30,8 +30,8 @@ This can be done through the API by calling `set_configuration` or by editing th ```json { - "operation": "set_configuration", - "clustering_user": "cluster_account" + "operation": "set_configuration", + "clustering_user": "cluster_account" } ``` diff --git a/site/versioned_docs/version-4.3/developers/clustering/enabling-clustering.md b/site/versioned_docs/version-4.3/developers/clustering/enabling-clustering.md index 6b563b19..596665d9 100644 --- a/site/versioned_docs/version-4.3/developers/clustering/enabling-clustering.md +++ b/site/versioned_docs/version-4.3/developers/clustering/enabling-clustering.md @@ -23,8 +23,8 @@ _Note: When making any changes to the `harperdb-config.yaml` file HarperDB must ```json { - "operation": "set_configuration", - "clustering_enabled": true + "operation": "set_configuration", + "clustering_enabled": true } ``` diff --git a/site/versioned_docs/version-4.3/developers/clustering/establishing-routes.md b/site/versioned_docs/version-4.3/developers/clustering/establishing-routes.md index b733aaed..d8a725d7 100644 --- a/site/versioned_docs/version-4.3/developers/clustering/establishing-routes.md +++ b/site/versioned_docs/version-4.3/developers/clustering/establishing-routes.md @@ -43,9 +43,9 @@ There are multiple ways to set routes, they are: ```json { - "operation": "cluster_set_routes", - "server": "hub", - "routes":[ {"host": "3.735.184.8", "port": 9932} ] + "operation": "cluster_set_routes", + "server": "hub", + "routes": [{ "host": "3.735.184.8", "port": 9932 }] } ``` @@ -67,7 +67,7 @@ The API also has `cluster_get_routes` for getting all routes in the config and ` ```json { - "operation": "cluster_delete_routes", - "routes":[ {"host": "3.735.184.8", "port": 9932} ] + "operation": "cluster_delete_routes", + "routes": [{ "host": "3.735.184.8", "port": 9932 }] } ``` diff --git a/site/versioned_docs/version-4.3/developers/clustering/index.md b/site/versioned_docs/version-4.3/developers/clustering/index.md index f5949afd..dfcdac11 100644 --- a/site/versioned_docs/version-4.3/developers/clustering/index.md +++ b/site/versioned_docs/version-4.3/developers/clustering/index.md @@ -8,24 +8,24 @@ HarperDB clustering is the process of connecting multiple HarperDB databases tog HarperDB’s clustering engine replicates data between instances of HarperDB using a highly performant, bi-directional pub/sub model on a per-table basis. Data replicates asynchronously with eventual consistency across the cluster following the defined pub/sub configuration. Individual transactions are sent in the order in which they were transacted, once received by the destination instance, they are processed in an ACID-compliant manner. Conflict resolution follows a last writer wins model based on recorded transaction time on the transaction and the timestamp on the record on the node. -*** +--- ### Common Use Case A common use case is an edge application collecting and analyzing sensor data that creates an alert if a sensor value exceeds a given threshold: -* The edge application should not be making outbound http requests for security purposes. -* There may not be a reliable network connection. -* Not all sensor data will be sent to the cloud--either because of the unreliable network connection, or maybe it’s just a pain to store it. -* The edge node should be inaccessible from outside the firewall. -* The edge node will send alerts to the cloud with a snippet of sensor data containing the offending sensor readings. +- The edge application should not be making outbound http requests for security purposes. +- There may not be a reliable network connection. +- Not all sensor data will be sent to the cloud--either because of the unreliable network connection, or maybe it’s just a pain to store it. +- The edge node should be inaccessible from outside the firewall. +- The edge node will send alerts to the cloud with a snippet of sensor data containing the offending sensor readings. HarperDB simplifies the architecture of such an application with its bi-directional, table-level replication: -* The edge instance subscribes to a “thresholds” table on the cloud instance, so the application only makes localhost calls to get the thresholds. -* The application continually pushes sensor data into a “sensor\_data” table via the localhost API, comparing it to the threshold values as it does so. -* When a threshold violation occurs, the application adds a record to the “alerts” table. -* The application appends to that record array “sensor\_data” entries for the 60 seconds (or minutes, or days) leading up to the threshold violation. -* The edge instance publishes the “alerts” table up to the cloud instance. +- The edge instance subscribes to a “thresholds” table on the cloud instance, so the application only makes localhost calls to get the thresholds. +- The application continually pushes sensor data into a “sensor_data” table via the localhost API, comparing it to the threshold values as it does so. +- When a threshold violation occurs, the application adds a record to the “alerts” table. +- The application appends to that record array “sensor_data” entries for the 60 seconds (or minutes, or days) leading up to the threshold violation. +- The edge instance publishes the “alerts” table up to the cloud instance. By letting HarperDB focus on the fault-tolerant logistics of transporting your data, you get to write less code. By moving data only when and where it’s needed, you lower storage and bandwidth costs. And by restricting your app to only making local calls to HarperDB, you reduce the overall exposure of your application to outside forces. diff --git a/site/versioned_docs/version-4.3/developers/clustering/managing-subscriptions.md b/site/versioned_docs/version-4.3/developers/clustering/managing-subscriptions.md index a8a4b407..ebb5b3d2 100644 --- a/site/versioned_docs/version-4.3/developers/clustering/managing-subscriptions.md +++ b/site/versioned_docs/version-4.3/developers/clustering/managing-subscriptions.md @@ -12,22 +12,22 @@ To add a single node and create one or more subscriptions use `set_node_replicat ```json { - "operation": "set_node_replication", - "node_name": "Node2", - "subscriptions": [ - { - "database": "data", - "table": "dog", - "publish": false, - "subscribe": true - }, - { - "database": "data", - "table": "chicken", - "publish": true, - "subscribe": true - } - ] + "operation": "set_node_replication", + "node_name": "Node2", + "subscriptions": [ + { + "database": "data", + "table": "dog", + "publish": false, + "subscribe": true + }, + { + "database": "data", + "table": "chicken", + "publish": true, + "subscribe": true + } + ] } ``` @@ -37,16 +37,16 @@ To update one or more subscriptions with a single node you can also use `set_nod ```json { - "operation": "set_node_replication", - "node_name": "Node2", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ] + "operation": "set_node_replication", + "node_name": "Node2", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ] } ``` @@ -56,37 +56,37 @@ To add or update subscriptions with one or more nodes in one API call use `confi ```json { - "operation": "configure_cluster", - "connections": [ - { - "node_name": "Node2", - "subscriptions": [ - { - "database": "dev", - "table": "chicken", - "publish": false, - "subscribe": true - }, - { - "database": "prod", - "table": "dog", - "publish": true, - "subscribe": true - } - ] - }, - { - "node_name": "Node3", - "subscriptions": [ - { - "database": "dev", - "table": "chicken", - "publish": true, - "subscribe": false - } - ] - } - ] + "operation": "configure_cluster", + "connections": [ + { + "node_name": "Node2", + "subscriptions": [ + { + "database": "dev", + "table": "chicken", + "publish": false, + "subscribe": true + }, + { + "database": "prod", + "table": "dog", + "publish": true, + "subscribe": true + } + ] + }, + { + "node_name": "Node3", + "subscriptions": [ + { + "database": "dev", + "table": "chicken", + "publish": true, + "subscribe": false + } + ] + } + ] } ``` @@ -100,17 +100,17 @@ There is an optional property called `start_time` that can be passed in the subs ```json { - "operation": "set_node_replication", - "node_name": "Node2", - "subscriptions": [ - { - "database": "dev", - "table": "dog", - "publish": false, - "subscribe": true, - "start_time": "2022-09-02T20:06:35.993Z" - } - ] + "operation": "set_node_replication", + "node_name": "Node2", + "subscriptions": [ + { + "database": "dev", + "table": "dog", + "publish": false, + "subscribe": true, + "start_time": "2022-09-02T20:06:35.993Z" + } + ] } ``` @@ -126,8 +126,8 @@ To remove a node and all its subscriptions use `remove_node`. ```json { - "operation":"remove_node", - "node_name":"Node2" + "operation": "remove_node", + "node_name": "Node2" } ``` @@ -137,32 +137,32 @@ To get the status of all connected nodes and see their subscriptions use `cluste ```json { - "node_name": "Node1", - "is_enabled": true, - "connections": [ - { - "node_name": "Node2", - "status": "open", - "ports": { - "clustering": 9932, - "operations_api": 9925 - }, - "latency_ms": 65, - "uptime": "11m 19s", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ], - "system_info": { - "hdb_version": "4.0.0", - "node_version": "16.17.1", - "platform": "linux" - } - } - ] + "node_name": "Node1", + "is_enabled": true, + "connections": [ + { + "node_name": "Node2", + "status": "open", + "ports": { + "clustering": 9932, + "operations_api": 9925 + }, + "latency_ms": 65, + "uptime": "11m 19s", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ], + "system_info": { + "hdb_version": "4.0.0", + "node_version": "16.17.1", + "platform": "linux" + } + } + ] } ``` diff --git a/site/versioned_docs/version-4.3/developers/clustering/naming-a-node.md b/site/versioned_docs/version-4.3/developers/clustering/naming-a-node.md index d1ebdfb1..308aef7a 100644 --- a/site/versioned_docs/version-4.3/developers/clustering/naming-a-node.md +++ b/site/versioned_docs/version-4.3/developers/clustering/naming-a-node.md @@ -27,8 +27,8 @@ _Note: When making any changes to the `harperdb-config.yaml` file HarperDB must ```json { - "operation": "set_configuration", - "clustering_nodeName":"Node1" + "operation": "set_configuration", + "clustering_nodeName": "Node1" } ``` diff --git a/site/versioned_docs/version-4.3/developers/clustering/subscription-overview.md b/site/versioned_docs/version-4.3/developers/clustering/subscription-overview.md index 6ceac7fe..a7b0f8fa 100644 --- a/site/versioned_docs/version-4.3/developers/clustering/subscription-overview.md +++ b/site/versioned_docs/version-4.3/developers/clustering/subscription-overview.md @@ -10,7 +10,7 @@ _Note: ‘local’ and ‘remote’ will often be referred to. In the context of A subscription consists of: -`database` - the name of the database that the table you are creating the subscription for belongs to. *Note, this was previously referred to as schema and may occasionally still be referenced that way.* +`database` - the name of the database that the table you are creating the subscription for belongs to. _Note, this was previously referred to as schema and may occasionally still be referenced that way._ `table` - the name of the table the subscription will apply to. diff --git a/site/versioned_docs/version-4.3/developers/clustering/things-worth-knowing.md b/site/versioned_docs/version-4.3/developers/clustering/things-worth-knowing.md index c57a47ca..41035b44 100644 --- a/site/versioned_docs/version-4.3/developers/clustering/things-worth-knowing.md +++ b/site/versioned_docs/version-4.3/developers/clustering/things-worth-knowing.md @@ -6,21 +6,21 @@ title: Things Worth Knowing Additional information that will help you define your clustering topology. -*** +--- ### Transactions Transactions that are replicated across the cluster are: -* Insert -* Update -* Upsert -* Delete -* Bulk loads - * CSV data load - * CSV file load - * CSV URL load - * Import from S3 +- Insert +- Update +- Upsert +- Delete +- Bulk loads + - CSV data load + - CSV file load + - CSV URL load + - Import from S3 When adding or updating a node any databases and tables in the subscription that don’t exist on the remote node will be automatically created. @@ -28,13 +28,13 @@ When adding or updating a node any databases and tables in the subscription that Users and roles are not replicated across the cluster. -*** +--- ### Queueing HarperDB has built-in resiliency for when network connectivity is lost within a subscription. When connections are reestablished, a catchup routine is executed to ensure data that was missed, specific to the subscription, is sent/received as defined. -*** +--- ### Topologies diff --git a/site/versioned_docs/version-4.3/developers/components/drivers.md b/site/versioned_docs/version-4.3/developers/components/drivers.md index 87066c72..3296031f 100644 --- a/site/versioned_docs/version-4.3/developers/components/drivers.md +++ b/site/versioned_docs/version-4.3/developers/components/drivers.md @@ -7,6 +7,4 @@ description: >- # Drivers - -
DriverDocsDownload
Power BIPowerBI DocsWindows
TableauTableau DocsWindows
Mac
Driver JAR
ExcelExcel DocsWindows
JDBCJDBC DocsWindows
Mac
Driver JAR
ODBCODBC DocsWindows
Mac
Linux (RPM)
Linux (DEB)
ADOADO DocsWindows
CmdletsCmdlets DocsWindows
SSISSSIS DocsWindows
diff --git a/site/versioned_docs/version-4.3/developers/components/google-data-studio.md b/site/versioned_docs/version-4.3/developers/components/google-data-studio.md index 324bb5ce..d252f3f0 100644 --- a/site/versioned_docs/version-4.3/developers/components/google-data-studio.md +++ b/site/versioned_docs/version-4.3/developers/components/google-data-studio.md @@ -17,21 +17,21 @@ The HarperDB database must be accessible through the Internet in order for Googl Get started by selecting the HarperDB connector from the [Google Data Studio Partner Connector Gallery](https://datastudio.google.com/u/0/datasources/create). 1. Log in to [https://datastudio.google.com/](https://datastudio.google.com/). -1. Add a new Data Source using the HarperDB connector. The current release version can be added as a data source by following this link: [HarperDB Google Data Studio Connector](https://datastudio.google.com/datasources/create?connectorId=AKfycbxBKgF8FI5R42WVxO-QCOq7dmUys0HJrUJMkBQRoGnCasY60\_VJeO3BhHJPvdd20-S76g). +1. Add a new Data Source using the HarperDB connector. The current release version can be added as a data source by following this link: [HarperDB Google Data Studio Connector](https://datastudio.google.com/datasources/create?connectorId=AKfycbxBKgF8FI5R42WVxO-QCOq7dmUys0HJrUJMkBQRoGnCasY60_VJeO3BhHJPvdd20-S76g). 1. Authorize the connector to access other servers on your behalf (this allows the connector to contact your database). 1. Enter the Web URL to access your database (preferably with HTTPS), as well as the Basic Auth key you use to access the database. Just include the key, not the word “Basic” at the start of it. 1. Check the box for “Secure Connections Only” if you want to always use HTTPS connections for this data source; entering a Web URL that starts with https:// will do the same thing, if you prefer. 1. Check the box for “Allow Bad Certs” if your HarperDB instance does not have a valid SSL certificate. [HarperDB Cloud](../../deployments/harperdb-cloud/) always has valid certificates, and so will never require this to be checked. Instances you set up yourself may require this, if you are using self-signed certs. If you are using [HarperDB Cloud](../../deployments/harperdb-cloud/) or another instance you know should always have valid SSL certificates, do not check this box. 1. Choose your Query Type. This determines what information the configuration will ask for after pressing the Next button. - * Table will ask you for a Schema and a Table to return all fields of using `SELECT *`. - * SQL will ask you for the SQL query you’re using to retrieve fields from the database. You may `JOIN` multiple tables together, and use HarperDB specific SQL functions, along with the usual power SQL grants. + - Table will ask you for a Schema and a Table to return all fields of using `SELECT *`. + - SQL will ask you for the SQL query you’re using to retrieve fields from the database. You may `JOIN` multiple tables together, and use HarperDB specific SQL functions, along with the usual power SQL grants. 1. When all information is entered correctly, press the Connect button in the top right of the new Data Source view to generate the Schema. You may also want to name the data source at this point. If the connector encounters any errors, a dialog box will tell you what went wrong so you can correct the issue. 1. If there are no errors, you now have a data source you can use in your reports! You may change the types of the generated fields in the Schema view if you need to (for instance, changing a Number field to a specific currency), as well as creating new fields from the report view that do calculations on other fields. ## Considerations -* Both Postman and the [HarperDB Studio](../../administration/harperdb-studio/) app have ways to convert a user:password pair to a Basic Auth token. Use either to create the token for the connector’s user. - * You may sign out of your current user by going to the instances tab in HarperDB Studio, then clicking on the lock icon at the top-right of a given instance’s box. Click the lock again to sign in as any user. The Basic Auth token will be visible in the Authorization header portion of any code created in the Sample Code tab. -* It’s highly recommended that you create a read-only user role in HarperDB Studio, and create a user with that role for your data sources to use. This prevents that authorization token from being used to alter your database, should someone else ever get ahold of it. -* The RecordCount field is intended for use as a metric, for counting how many instances of a given set of values appear in a report’s data set. -* _Do not attempt to create fields with spaces in their names_ for any data sources! Google Data Studio will crash when attempting to retrieve a field with such a name, producing a System Error instead of a useful chart on your reports. Using CamelCase or snake\_case gets around this. +- Both Postman and the [HarperDB Studio](../../administration/harperdb-studio/) app have ways to convert a user:password pair to a Basic Auth token. Use either to create the token for the connector’s user. + - You may sign out of your current user by going to the instances tab in HarperDB Studio, then clicking on the lock icon at the top-right of a given instance’s box. Click the lock again to sign in as any user. The Basic Auth token will be visible in the Authorization header portion of any code created in the Sample Code tab. +- It’s highly recommended that you create a read-only user role in HarperDB Studio, and create a user with that role for your data sources to use. This prevents that authorization token from being used to alter your database, should someone else ever get ahold of it. +- The RecordCount field is intended for use as a metric, for counting how many instances of a given set of values appear in a report’s data set. +- _Do not attempt to create fields with spaces in their names_ for any data sources! Google Data Studio will crash when attempting to retrieve a field with such a name, producing a System Error instead of a useful chart on your reports. Using CamelCase or snake_case gets around this. diff --git a/site/versioned_docs/version-4.3/developers/components/index.md b/site/versioned_docs/version-4.3/developers/components/index.md index e0e82581..8fed49d8 100644 --- a/site/versioned_docs/version-4.3/developers/components/index.md +++ b/site/versioned_docs/version-4.3/developers/components/index.md @@ -6,12 +6,12 @@ title: Components HarperDB is a highly extensible database application platform with support for a rich variety of composable modular components and components that can be used and combined to build applications and add functionality to existing applications. HarperDB tools, components, and add-ons can be found in a few places: -* [SDK libraries](./sdks) are available for connecting to HarperDB from different languages. -* [Drivers](./drivers) are available for connecting to HarperDB from different products and tools. -* [HarperDB-Add-Ons repositories](https://github.com/orgs/HarperDB-Add-Ons/repositories) lists various templates and add-ons for HarperDB. -* [HarperDB repositories](https://github.com/orgs/HarperDB-Add-Ons/repositories) include additional tools for HarperDB. -* You can also [search github.com for ever-growing list of projects that use, or work with, HarperDB](https://github.com/search?q=harperdb\&type=repositories) -* [Google Data Studio](./google-data-studio) is a visualization tool for building charts and tables from HarperDB data. +- [SDK libraries](./sdks) are available for connecting to HarperDB from different languages. +- [Drivers](./drivers) are available for connecting to HarperDB from different products and tools. +- [HarperDB-Add-Ons repositories](https://github.com/orgs/HarperDB-Add-Ons/repositories) lists various templates and add-ons for HarperDB. +- [HarperDB repositories](https://github.com/orgs/HarperDB-Add-Ons/repositories) include additional tools for HarperDB. +- You can also [search github.com for ever-growing list of projects that use, or work with, HarperDB](https://github.com/search?q=harperdb&type=repositories) +- [Google Data Studio](./google-data-studio) is a visualization tool for building charts and tables from HarperDB data. ## Components diff --git a/site/versioned_docs/version-4.3/developers/components/installing.md b/site/versioned_docs/version-4.3/developers/components/installing.md index 2c6741a2..6bbb6261 100644 --- a/site/versioned_docs/version-4.3/developers/components/installing.md +++ b/site/versioned_docs/version-4.3/developers/components/installing.md @@ -8,8 +8,8 @@ Components can be easily added by adding a new top level element to your `harper The configuration comprises two values: -* component name - can be anything, as long as it follows valid YAML syntax. -* package - a reference to your component. +- component name - can be anything, as long as it follows valid YAML syntax. +- package - a reference to your component. ```yaml myComponentName: @@ -20,7 +20,7 @@ Under the hood HarperDB is calling npm install on all components, this means tha ```yaml myGithubComponent: - package: HarperDB-Add-Ons/package#v2.2.0 # install from GitHub + package: HarperDB-Add-Ons/package#v2.2.0 # install from GitHub myNPMComponent: package: harperdb # install from NPM myTarBall: @@ -39,13 +39,13 @@ The package.json file that is created will look something like this. ```json { - "dependencies": { - "myGithubComponent": "github:HarperDB-Add-Ons/package#v2.2.0", - "myNPMComponent": "npm:harperdb", - "myTarBall": "file:/Users/harper/cool-component.tar", - "myLocal": "file:/Users/harper/local", - "myWebsite": "https://harperdb-component" - } + "dependencies": { + "myGithubComponent": "github:HarperDB-Add-Ons/package#v2.2.0", + "myNPMComponent": "npm:harperdb", + "myTarBall": "file:/Users/harper/cool-component.tar", + "myLocal": "file:/Users/harper/local", + "myWebsite": "https://harperdb-component" + } } ``` @@ -62,9 +62,9 @@ To add a component using the operations API use the `deploy_component` operation ```json { - "operation": "deploy_component", - "project": "my-cool-component", - "package": "HarperDB-Add-Ons/package/mycc" + "operation": "deploy_component", + "project": "my-cool-component", + "package": "HarperDB-Add-Ons/package/mycc" } ``` @@ -72,8 +72,8 @@ Another option is to pass `deploy_component` a base64-encoded string representat ```json { - "operation": "deploy_component", - "project": "my-cool-component", - "payload": "NzY1IAAwMDAwMjQgADAwMDAwMDAwMDAwIDE0NDIwMDQ3...." + "operation": "deploy_component", + "project": "my-cool-component", + "payload": "NzY1IAAwMDAwMjQgADAwMDAwMDAwMDAwIDE0NDIwMDQ3...." } ``` diff --git a/site/versioned_docs/version-4.3/developers/components/operations.md b/site/versioned_docs/version-4.3/developers/components/operations.md index 95ca23c8..32108df5 100644 --- a/site/versioned_docs/version-4.3/developers/components/operations.md +++ b/site/versioned_docs/version-4.3/developers/components/operations.md @@ -8,30 +8,38 @@ One way to manage applications and components is through [HarperDB Studio](../.. HarperDB Studio manages your applications using nine HarperDB operations. You may view these operations within our [API Docs](../operations-api/). A brief overview of each of the operations is below: -* **components\_status** +- **components_status** - Returns the state of the applications server. This includes whether it is enabled, upon which port it is listening, and where its root project directory is located on the host machine. -* **get\_components** + Returns the state of the applications server. This includes whether it is enabled, upon which port it is listening, and where its root project directory is located on the host machine. - Returns an array of projects within the applications root project directory. -* **get\_component\_file** +- **get_components** - Returns the content of the specified file as text. HarperDB Studio uses this call to render the file content in its built-in code editor. -* **set\_component\_file** + Returns an array of projects within the applications root project directory. - Updates the content of the specified file. HarperDB Studio uses this call to save any changes made through its built-in code editor. -* **drop\_component\_file** +- **get_component_file** - Deletes the specified file. -* **add\_component\_project** + Returns the content of the specified file as text. HarperDB Studio uses this call to render the file content in its built-in code editor. - Creates a new project folder in the applications root project directory. It also inserts into the new directory the contents of our applications Project template, which is available publicly, here: [https://github.com/HarperDB/harperdb-custom-functions-template](https://github.com/HarperDB/harperdb-custom-functions-template). -* **drop\_component\_project** +- **set_component_file** - Deletes the specified project folder and all of its contents. -* **package\_component\_project** + Updates the content of the specified file. HarperDB Studio uses this call to save any changes made through its built-in code editor. - Creates a .tar file of the specified project folder, then reads it into a base64-encoded string and returns that string to the user. -* **deploy\_component\_project** +- **drop_component_file** - Takes the output of package\_component\_project, decrypts the base64-encoded string, reconstitutes the .tar file of your project folder, and extracts it to the applications root project directory. + Deletes the specified file. + +- **add_component_project** + + Creates a new project folder in the applications root project directory. It also inserts into the new directory the contents of our applications Project template, which is available publicly, here: [https://github.com/HarperDB/harperdb-custom-functions-template](https://github.com/HarperDB/harperdb-custom-functions-template). + +- **drop_component_project** + + Deletes the specified project folder and all of its contents. + +- **package_component_project** + + Creates a .tar file of the specified project folder, then reads it into a base64-encoded string and returns that string to the user. + +- **deploy_component_project** + + Takes the output of package_component_project, decrypts the base64-encoded string, reconstitutes the .tar file of your project folder, and extracts it to the applications root project directory. diff --git a/site/versioned_docs/version-4.3/developers/components/writing-extensions.md b/site/versioned_docs/version-4.3/developers/components/writing-extensions.md index 2435841d..8d2069f8 100644 --- a/site/versioned_docs/version-4.3/developers/components/writing-extensions.md +++ b/site/versioned_docs/version-4.3/developers/components/writing-extensions.md @@ -8,9 +8,9 @@ HarperDB is a highly extensible database application platform with support for a There are three general categories of components for HarperDB: -* **protocol extensions** that provide and define ways for clients to access data -* **resource extensions** that handle and interpret different types of files -* **consumer data sources** that provide a way to access and retrieve data from other sources. +- **protocol extensions** that provide and define ways for clients to access data +- **resource extensions** that handle and interpret different types of files +- **consumer data sources** that provide a way to access and retrieve data from other sources. Server protocol extensions can be used to implement new protocols like MQTT, AMQP, Kafka, or maybe a retro-style Gopher interface. It can also be used to augment existing protocols like HTTP with "middleware" that can add authentication, analytics, or additional content negotiation, or add layer protocols on top of WebSockets. @@ -48,10 +48,10 @@ Here, the `request` object will have the following structure (this is based on N ```typescript interface Request { - method: string - headers: Headers // use request.headers.get(headerName) to get header values - body: Stream - data: any // deserialized data from the request body + method: string; + headers: Headers; // use request.headers.get(headerName) to get header values + body: Stream; + data: any; // deserialized data from the request body } ``` @@ -59,10 +59,10 @@ The returned `response` object should have the following structure (again, follo ```typescript interface Response { - status?: number - headers?: {} // an object with header name/values - data?: any // object/value that will be serialized into the body - body?: Stream + status?: number; + headers?: {}; // an object with header name/values + data?: any; // object/value that will be serialized into the body + body?: Stream; } ``` @@ -77,7 +77,7 @@ export function start(options: { port: number, server: {}, resources: Map}) { // get some token for the user and determine the user // if we want to use harperdb's user database let user = server.getUser(username, password); - request.user = user; // authenticate user object goes on the request + request.user = user; // authenticate user object goes on the request } // continue on to the next layer return nextLayer(request); @@ -88,6 +88,7 @@ export function start(options: { port: number, server: {}, resources: Map}) { ``` #### Direct Socket Server + If you were implementing a new protocol, you can directly interact with the sockets and listen for new incoming TCP connections: ```javascript @@ -97,7 +98,9 @@ export function start(options: { port: number, server: {}}) { }); }) ``` + #### WebSockets + If you were implementing a protocol using WebSockets, you can define a listener for incoming WebSocket connections and indicate the WebSockets (sub)protocol to specifically handle (which will select your listener if the `Sec-WebSocket-Protocol` header matches your protocol): ```javascript @@ -147,11 +150,12 @@ Data source components implement the `Resource` interface to provide access to v ## Content Type Extensions HarperDB uses content negotiation to determine how to deserialize content incoming data from HTTP requests (and any other protocols that support content negotiation) and to serialize data into responses. This negotiation is performed by comparing the `Content-Type` header with registered content type handler to determine how to deserialize content into structured data that is processed and stored, and comparing the `Accept` header with registered content type handlers to determine how to serialize structured data. HarperDB comes with a rich set of content type handlers including JSON, CBOR, MessagePack, CSV, Event-Stream, and more. However, you can also add your own content type handlers by adding new entries (or even replacing existing entries) to the `contentTypes` exported map from the `server` global (or `harperdb` export). This map is keyed by the MIME type, and the value is an object with properties (all optional): -* `serialize(data): Buffer|Uint8Array|string`: If defined, this will be called with the data structure and should return the data serialized as binary data (NodeJS Buffer or Uint8Array) or a string, for the response. -* `serializeStream(data): ReadableStream`: If defined, this will be called with the data structure and should return the data serialized as a ReadableStream. This is generally necessary for handling asynchronous iteratables. -* `deserialize(Buffer|string): any`: If defined (and deserializeStream is not defined), this will be called with the raw data received from the incoming request and should return the deserialized data structure. This will be called with a string for text MIME types ("text/..."), and a Buffer for all others. -* `deserializeStream(ReadableStream): any`: If defined, this will be called with the raw data stream (if there is one) received from the incoming request and should return the deserialized data structure (potentially as an asynchronous iterable). -* `q: number`: This is an indication of this serialization quality between 0 and 1, and if omitted, defaults to 1. It is called "content negotiation" instead of "content demanding" because both client and server may have multiple supported content types, and the server needs to choose the best for both. This is determined by finding the content type (of all supported) with the highest product of client q and server q (1 is a perfect representation of the data, 0 is worst, 0.5 is medium quality). + +- `serialize(data): Buffer|Uint8Array|string`: If defined, this will be called with the data structure and should return the data serialized as binary data (NodeJS Buffer or Uint8Array) or a string, for the response. +- `serializeStream(data): ReadableStream`: If defined, this will be called with the data structure and should return the data serialized as a ReadableStream. This is generally necessary for handling asynchronous iteratables. +- `deserialize(Buffer|string): any`: If defined (and deserializeStream is not defined), this will be called with the raw data received from the incoming request and should return the deserialized data structure. This will be called with a string for text MIME types ("text/..."), and a Buffer for all others. +- `deserializeStream(ReadableStream): any`: If defined, this will be called with the raw data stream (if there is one) received from the incoming request and should return the deserialized data structure (potentially as an asynchronous iterable). +- `q: number`: This is an indication of this serialization quality between 0 and 1, and if omitted, defaults to 1. It is called "content negotiation" instead of "content demanding" because both client and server may have multiple supported content types, and the server needs to choose the best for both. This is determined by finding the content type (of all supported) with the highest product of client q and server q (1 is a perfect representation of the data, 0 is worst, 0.5 is medium quality). For example, if you wanted to define an XML serializer (that can respond with XML to requests with `Accept: text/xml`) you could write: diff --git a/site/versioned_docs/version-4.3/developers/operations-api/advanced-json-sql-examples.md b/site/versioned_docs/version-4.3/developers/operations-api/advanced-json-sql-examples.md index c26161b7..7acab90a 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/advanced-json-sql-examples.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/advanced-json-sql-examples.md @@ -1,1780 +1,1775 @@ --- -title: Advanced JSON SQL Examples +title: Advanced JSON SQL Examples --- -# Advanced JSON SQL Examples +# Advanced JSON SQL Examples ## Create movies database + Create a new database called "movies" using the 'create_database' operation. _Note: Creating a database is optional, if one is not created HarperDB will default to using a database named `data`_ ### Body + ```json { - "operation": "create_database", - "database": "movies" + "operation": "create_database", + "database": "movies" } ``` ### Response: 200 + ```json { - "message": "database 'movies' successfully created" + "message": "database 'movies' successfully created" } ``` --- ## Create movie Table + Creates a new table called "movie" inside the database "movies" using the ‘create_table’ operation. ### Body ```json { - "operation": "create_table", - "database": "movies", - "table": "movie", - "primary_key": "id" + "operation": "create_table", + "database": "movies", + "table": "movie", + "primary_key": "id" } ``` ### Response: 200 + ```json { - "message": "table 'movies.movie' successfully created." + "message": "table 'movies.movie' successfully created." } ``` - --- ## Create credits Table + Creates a new table called "credits" inside the database "movies" using the ‘create_table’ operation. ### Body ```json { - "operation": "create_table", - "database": "movies", - "table": "credits", - "primary_key": "movie_id" + "operation": "create_table", + "database": "movies", + "table": "credits", + "primary_key": "movie_id" } ``` ### Response: 200 + ```json { - "message": "table 'movies.credits' successfully created." + "message": "table 'movies.credits' successfully created." } ``` - --- ## Bulk Insert movie Via CSV + Inserts data from a hosted CSV file into the "movie" table using the 'csv_url_load' operation. ### Body ```json { - "operation": "csv_url_load", - "database": "movies", - "table": "movie", - "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/movie.csv" + "operation": "csv_url_load", + "database": "movies", + "table": "movie", + "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/movie.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 1889eee4-23c1-4945-9bb7-c805fc20726c" + "message": "Starting job with id 1889eee4-23c1-4945-9bb7-c805fc20726c" } ``` - --- ## Bulk Insert credits Via CSV + Inserts data from a hosted CSV file into the "credits" table using the 'csv_url_load' operation. ### Body ```json { - "operation": "csv_url_load", - "database": "movies", - "table": "credits", - "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/credits.csv" + "operation": "csv_url_load", + "database": "movies", + "table": "credits", + "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/credits.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 3a14cd74-67f3-41e9-8ccd-45ffd0addc2c", - "job_id": "3a14cd74-67f3-41e9-8ccd-45ffd0addc2c" + "message": "Starting job with id 3a14cd74-67f3-41e9-8ccd-45ffd0addc2c", + "job_id": "3a14cd74-67f3-41e9-8ccd-45ffd0addc2c" } ``` - --- ## View raw data + In the following example we will be running expressions on the keywords & production_companies attributes, so for context we are displaying what the raw data looks like. ### Body ```json { - "operation": "sql", - "sql": "SELECT title, rank, keywords, production_companies FROM movies.movie ORDER BY rank LIMIT 10" + "operation": "sql", + "sql": "SELECT title, rank, keywords, production_companies FROM movies.movie ORDER BY rank LIMIT 10" } ``` ### Response: 200 + ```json [ - { - "title": "Ad Astra", - "rank": 1, - "keywords": [ - { - "id": 305, - "name": "moon" - }, - { - "id": 697, - "name": "loss of loved one" - }, - { - "id": 839, - "name": "planet mars" - }, - { - "id": 14626, - "name": "astronaut" - }, - { - "id": 157265, - "name": "moon colony" - }, - { - "id": 162429, - "name": "solar system" - }, - { - "id": 240119, - "name": "father son relationship" - }, - { - "id": 244256, - "name": "near future" - }, - { - "id": 257878, - "name": "planet neptune" - }, - { - "id": 260089, - "name": "space walk" - } - ], - "production_companies": [ - { - "id": 490, - "name": "New Regency Productions", - "origin_country": "" - }, - { - "id": 79963, - "name": "Keep Your Head", - "origin_country": "" - }, - { - "id": 73492, - "name": "MadRiver Pictures", - "origin_country": "" - }, - { - "id": 81, - "name": "Plan B Entertainment", - "origin_country": "US" - }, - { - "id": 30666, - "name": "RT Features", - "origin_country": "BR" - }, - { - "id": 30148, - "name": "Bona Film Group", - "origin_country": "CN" - }, - { - "id": 22213, - "name": "TSG Entertainment", - "origin_country": "US" - } - ] - }, - { - "title": "Extraction", - "rank": 2, - "keywords": [ - { - "id": 3070, - "name": "mercenary" - }, - { - "id": 4110, - "name": "mumbai (bombay), india" - }, - { - "id": 9717, - "name": "based on comic" - }, - { - "id": 9730, - "name": "crime boss" - }, - { - "id": 11107, - "name": "rescue mission" - }, - { - "id": 18712, - "name": "based on graphic novel" - }, - { - "id": 265216, - "name": "dhaka (dacca), bangladesh" - } - ], - "production_companies": [ - { - "id": 106544, - "name": "AGBO", - "origin_country": "US" - }, - { - "id": 109172, - "name": "Thematic Entertainment", - "origin_country": "US" - }, - { - "id": 92029, - "name": "TGIM Films", - "origin_country": "US" - } - ] - }, - { - "title": "To the Beat! Back 2 School", - "rank": 3, - "keywords": [ - { - "id": 10873, - "name": "school" - } - ], - "production_companies": [] - }, - { - "title": "Bloodshot", - "rank": 4, - "keywords": [ - { - "id": 2651, - "name": "nanotechnology" - }, - { - "id": 9715, - "name": "superhero" - }, - { - "id": 9717, - "name": "based on comic" - }, - { - "id": 164218, - "name": "psychotronic" - }, - { - "id": 255024, - "name": "shared universe" - }, - { - "id": 258575, - "name": "valiant comics" - } - ], - "production_companies": [ - { - "id": 34, - "name": "Sony Pictures", - "origin_country": "US" - }, - { - "id": 10246, - "name": "Cross Creek Pictures", - "origin_country": "US" - }, - { - "id": 6573, - "name": "Mimran Schur Pictures", - "origin_country": "US" - }, - { - "id": 333, - "name": "Original Film", - "origin_country": "US" - }, - { - "id": 103673, - "name": "The Hideaway Entertainment", - "origin_country": "US" - }, - { - "id": 124335, - "name": "Valiant Entertainment", - "origin_country": "US" - }, - { - "id": 5, - "name": "Columbia Pictures", - "origin_country": "US" - }, - { - "id": 1225, - "name": "One Race", - "origin_country": "US" - }, - { - "id": 30148, - "name": "Bona Film Group", - "origin_country": "CN" - } - ] - }, - { - "title": "The Call of the Wild", - "rank": 5, - "keywords": [ - { - "id": 818, - "name": "based on novel or book" - }, - { - "id": 4542, - "name": "gold rush" - }, - { - "id": 15162, - "name": "dog" - }, - { - "id": 155821, - "name": "sled dogs" - }, - { - "id": 189390, - "name": "yukon" - }, - { - "id": 207928, - "name": "19th century" - }, - { - "id": 259987, - "name": "cgi animation" - }, - { - "id": 263806, - "name": "1890s" - } - ], - "production_companies": [ - { - "id": 787, - "name": "3 Arts Entertainment", - "origin_country": "US" - }, - { - "id": 127928, - "name": "20th Century Studios", - "origin_country": "US" - }, - { - "id": 22213, - "name": "TSG Entertainment", - "origin_country": "US" - } - ] - }, - { - "title": "Sonic the Hedgehog", - "rank": 6, - "keywords": [ - { - "id": 282, - "name": "video game" - }, - { - "id": 6054, - "name": "friendship" - }, - { - "id": 10842, - "name": "good vs evil" - }, - { - "id": 41645, - "name": "based on video game" - }, - { - "id": 167043, - "name": "road movie" - }, - { - "id": 172142, - "name": "farting" - }, - { - "id": 188933, - "name": "bar fight" - }, - { - "id": 226967, - "name": "amistad" - }, - { - "id": 245230, - "name": "live action remake" - }, - { - "id": 258111, - "name": "fantasy" - }, - { - "id": 260223, - "name": "videojuego" - } - ], - "production_companies": [ - { - "id": 333, - "name": "Original Film", - "origin_country": "US" - }, - { - "id": 10644, - "name": "Blur Studios", - "origin_country": "US" - }, - { - "id": 77884, - "name": "Marza Animation Planet", - "origin_country": "JP" - }, - { - "id": 4, - "name": "Paramount", - "origin_country": "US" - }, - { - "id": 113750, - "name": "SEGA", - "origin_country": "JP" - }, - { - "id": 100711, - "name": "DJ2 Entertainment", - "origin_country": "" - }, - { - "id": 24955, - "name": "Paramount Animation", - "origin_country": "US" - } - ] - }, - { - "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", - "rank": 7, - "keywords": [ - { - "id": 849, - "name": "dc comics" - }, - { - "id": 9717, - "name": "based on comic" - }, - { - "id": 187056, - "name": "woman director" - }, - { - "id": 229266, - "name": "dc extended universe" - } - ], - "production_companies": [ - { - "id": 9993, - "name": "DC Entertainment", - "origin_country": "US" - }, - { - "id": 82968, - "name": "LuckyChap Entertainment", - "origin_country": "GB" - }, - { - "id": 103462, - "name": "Kroll & Co Entertainment", - "origin_country": "US" - }, - { - "id": 174, - "name": "Warner Bros. Pictures", - "origin_country": "US" - }, - { - "id": 429, - "name": "DC Comics", - "origin_country": "US" - }, - { - "id": 128064, - "name": "DC Films", - "origin_country": "US" - }, - { - "id": 101831, - "name": "Clubhouse Pictures", - "origin_country": "US" - } - ] - }, - { - "title": "Justice League Dark: Apokolips War", - "rank": 8, - "keywords": [ - { - "id": 849, - "name": "dc comics" - } - ], - "production_companies": [ - { - "id": 2785, - "name": "Warner Bros. Animation", - "origin_country": "US" - }, - { - "id": 9993, - "name": "DC Entertainment", - "origin_country": "US" - }, - { - "id": 429, - "name": "DC Comics", - "origin_country": "US" - } - ] - }, - { - "title": "Parasite", - "rank": 9, - "keywords": [ - { - "id": 1353, - "name": "underground" - }, - { - "id": 5318, - "name": "seoul" - }, - { - "id": 5732, - "name": "birthday party" - }, - { - "id": 5752, - "name": "private lessons" - }, - { - "id": 9866, - "name": "basement" - }, - { - "id": 10453, - "name": "con artist" - }, - { - "id": 11935, - "name": "working class" - }, - { - "id": 12565, - "name": "psychological thriller" - }, - { - "id": 13126, - "name": "limousine driver" - }, - { - "id": 14514, - "name": "class differences" - }, - { - "id": 14864, - "name": "rich poor" - }, - { - "id": 17997, - "name": "housekeeper" - }, - { - "id": 18015, - "name": "tutor" - }, - { - "id": 18035, - "name": "family" - }, - { - "id": 33421, - "name": "crime family" - }, - { - "id": 173272, - "name": "flood" - }, - { - "id": 188861, - "name": "smell" - }, - { - "id": 198673, - "name": "unemployed" - }, - { - "id": 237462, - "name": "wealthy family" - } - ], - "production_companies": [ - { - "id": 7036, - "name": "CJ Entertainment", - "origin_country": "KR" - }, - { - "id": 4399, - "name": "Barunson E&A", - "origin_country": "KR" - } - ] - }, - { - "title": "Star Wars: The Rise of Skywalker", - "rank": 10, - "keywords": [ - { - "id": 161176, - "name": "space opera" - } - ], - "production_companies": [ - { - "id": 1, - "name": "Lucasfilm", - "origin_country": "US" - }, - { - "id": 11461, - "name": "Bad Robot", - "origin_country": "US" - }, - { - "id": 2, - "name": "Walt Disney Pictures", - "origin_country": "US" - }, - { - "id": 120404, - "name": "British Film Commission", - "origin_country": "" - } - ] - } + { + "title": "Ad Astra", + "rank": 1, + "keywords": [ + { + "id": 305, + "name": "moon" + }, + { + "id": 697, + "name": "loss of loved one" + }, + { + "id": 839, + "name": "planet mars" + }, + { + "id": 14626, + "name": "astronaut" + }, + { + "id": 157265, + "name": "moon colony" + }, + { + "id": 162429, + "name": "solar system" + }, + { + "id": 240119, + "name": "father son relationship" + }, + { + "id": 244256, + "name": "near future" + }, + { + "id": 257878, + "name": "planet neptune" + }, + { + "id": 260089, + "name": "space walk" + } + ], + "production_companies": [ + { + "id": 490, + "name": "New Regency Productions", + "origin_country": "" + }, + { + "id": 79963, + "name": "Keep Your Head", + "origin_country": "" + }, + { + "id": 73492, + "name": "MadRiver Pictures", + "origin_country": "" + }, + { + "id": 81, + "name": "Plan B Entertainment", + "origin_country": "US" + }, + { + "id": 30666, + "name": "RT Features", + "origin_country": "BR" + }, + { + "id": 30148, + "name": "Bona Film Group", + "origin_country": "CN" + }, + { + "id": 22213, + "name": "TSG Entertainment", + "origin_country": "US" + } + ] + }, + { + "title": "Extraction", + "rank": 2, + "keywords": [ + { + "id": 3070, + "name": "mercenary" + }, + { + "id": 4110, + "name": "mumbai (bombay), india" + }, + { + "id": 9717, + "name": "based on comic" + }, + { + "id": 9730, + "name": "crime boss" + }, + { + "id": 11107, + "name": "rescue mission" + }, + { + "id": 18712, + "name": "based on graphic novel" + }, + { + "id": 265216, + "name": "dhaka (dacca), bangladesh" + } + ], + "production_companies": [ + { + "id": 106544, + "name": "AGBO", + "origin_country": "US" + }, + { + "id": 109172, + "name": "Thematic Entertainment", + "origin_country": "US" + }, + { + "id": 92029, + "name": "TGIM Films", + "origin_country": "US" + } + ] + }, + { + "title": "To the Beat! Back 2 School", + "rank": 3, + "keywords": [ + { + "id": 10873, + "name": "school" + } + ], + "production_companies": [] + }, + { + "title": "Bloodshot", + "rank": 4, + "keywords": [ + { + "id": 2651, + "name": "nanotechnology" + }, + { + "id": 9715, + "name": "superhero" + }, + { + "id": 9717, + "name": "based on comic" + }, + { + "id": 164218, + "name": "psychotronic" + }, + { + "id": 255024, + "name": "shared universe" + }, + { + "id": 258575, + "name": "valiant comics" + } + ], + "production_companies": [ + { + "id": 34, + "name": "Sony Pictures", + "origin_country": "US" + }, + { + "id": 10246, + "name": "Cross Creek Pictures", + "origin_country": "US" + }, + { + "id": 6573, + "name": "Mimran Schur Pictures", + "origin_country": "US" + }, + { + "id": 333, + "name": "Original Film", + "origin_country": "US" + }, + { + "id": 103673, + "name": "The Hideaway Entertainment", + "origin_country": "US" + }, + { + "id": 124335, + "name": "Valiant Entertainment", + "origin_country": "US" + }, + { + "id": 5, + "name": "Columbia Pictures", + "origin_country": "US" + }, + { + "id": 1225, + "name": "One Race", + "origin_country": "US" + }, + { + "id": 30148, + "name": "Bona Film Group", + "origin_country": "CN" + } + ] + }, + { + "title": "The Call of the Wild", + "rank": 5, + "keywords": [ + { + "id": 818, + "name": "based on novel or book" + }, + { + "id": 4542, + "name": "gold rush" + }, + { + "id": 15162, + "name": "dog" + }, + { + "id": 155821, + "name": "sled dogs" + }, + { + "id": 189390, + "name": "yukon" + }, + { + "id": 207928, + "name": "19th century" + }, + { + "id": 259987, + "name": "cgi animation" + }, + { + "id": 263806, + "name": "1890s" + } + ], + "production_companies": [ + { + "id": 787, + "name": "3 Arts Entertainment", + "origin_country": "US" + }, + { + "id": 127928, + "name": "20th Century Studios", + "origin_country": "US" + }, + { + "id": 22213, + "name": "TSG Entertainment", + "origin_country": "US" + } + ] + }, + { + "title": "Sonic the Hedgehog", + "rank": 6, + "keywords": [ + { + "id": 282, + "name": "video game" + }, + { + "id": 6054, + "name": "friendship" + }, + { + "id": 10842, + "name": "good vs evil" + }, + { + "id": 41645, + "name": "based on video game" + }, + { + "id": 167043, + "name": "road movie" + }, + { + "id": 172142, + "name": "farting" + }, + { + "id": 188933, + "name": "bar fight" + }, + { + "id": 226967, + "name": "amistad" + }, + { + "id": 245230, + "name": "live action remake" + }, + { + "id": 258111, + "name": "fantasy" + }, + { + "id": 260223, + "name": "videojuego" + } + ], + "production_companies": [ + { + "id": 333, + "name": "Original Film", + "origin_country": "US" + }, + { + "id": 10644, + "name": "Blur Studios", + "origin_country": "US" + }, + { + "id": 77884, + "name": "Marza Animation Planet", + "origin_country": "JP" + }, + { + "id": 4, + "name": "Paramount", + "origin_country": "US" + }, + { + "id": 113750, + "name": "SEGA", + "origin_country": "JP" + }, + { + "id": 100711, + "name": "DJ2 Entertainment", + "origin_country": "" + }, + { + "id": 24955, + "name": "Paramount Animation", + "origin_country": "US" + } + ] + }, + { + "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", + "rank": 7, + "keywords": [ + { + "id": 849, + "name": "dc comics" + }, + { + "id": 9717, + "name": "based on comic" + }, + { + "id": 187056, + "name": "woman director" + }, + { + "id": 229266, + "name": "dc extended universe" + } + ], + "production_companies": [ + { + "id": 9993, + "name": "DC Entertainment", + "origin_country": "US" + }, + { + "id": 82968, + "name": "LuckyChap Entertainment", + "origin_country": "GB" + }, + { + "id": 103462, + "name": "Kroll & Co Entertainment", + "origin_country": "US" + }, + { + "id": 174, + "name": "Warner Bros. Pictures", + "origin_country": "US" + }, + { + "id": 429, + "name": "DC Comics", + "origin_country": "US" + }, + { + "id": 128064, + "name": "DC Films", + "origin_country": "US" + }, + { + "id": 101831, + "name": "Clubhouse Pictures", + "origin_country": "US" + } + ] + }, + { + "title": "Justice League Dark: Apokolips War", + "rank": 8, + "keywords": [ + { + "id": 849, + "name": "dc comics" + } + ], + "production_companies": [ + { + "id": 2785, + "name": "Warner Bros. Animation", + "origin_country": "US" + }, + { + "id": 9993, + "name": "DC Entertainment", + "origin_country": "US" + }, + { + "id": 429, + "name": "DC Comics", + "origin_country": "US" + } + ] + }, + { + "title": "Parasite", + "rank": 9, + "keywords": [ + { + "id": 1353, + "name": "underground" + }, + { + "id": 5318, + "name": "seoul" + }, + { + "id": 5732, + "name": "birthday party" + }, + { + "id": 5752, + "name": "private lessons" + }, + { + "id": 9866, + "name": "basement" + }, + { + "id": 10453, + "name": "con artist" + }, + { + "id": 11935, + "name": "working class" + }, + { + "id": 12565, + "name": "psychological thriller" + }, + { + "id": 13126, + "name": "limousine driver" + }, + { + "id": 14514, + "name": "class differences" + }, + { + "id": 14864, + "name": "rich poor" + }, + { + "id": 17997, + "name": "housekeeper" + }, + { + "id": 18015, + "name": "tutor" + }, + { + "id": 18035, + "name": "family" + }, + { + "id": 33421, + "name": "crime family" + }, + { + "id": 173272, + "name": "flood" + }, + { + "id": 188861, + "name": "smell" + }, + { + "id": 198673, + "name": "unemployed" + }, + { + "id": 237462, + "name": "wealthy family" + } + ], + "production_companies": [ + { + "id": 7036, + "name": "CJ Entertainment", + "origin_country": "KR" + }, + { + "id": 4399, + "name": "Barunson E&A", + "origin_country": "KR" + } + ] + }, + { + "title": "Star Wars: The Rise of Skywalker", + "rank": 10, + "keywords": [ + { + "id": 161176, + "name": "space opera" + } + ], + "production_companies": [ + { + "id": 1, + "name": "Lucasfilm", + "origin_country": "US" + }, + { + "id": 11461, + "name": "Bad Robot", + "origin_country": "US" + }, + { + "id": 2, + "name": "Walt Disney Pictures", + "origin_country": "US" + }, + { + "id": 120404, + "name": "British Film Commission", + "origin_country": "" + } + ] + } ] ``` - --- ## Simple search_json call -This query uses search_json to convert the keywords object array to a simple string array. The expression '[name]' tells the function to extract all values for the name attribute and wrap them in an array. + +This query uses search_json to convert the keywords object array to a simple string array. The expression '[name]' tells the function to extract all values for the name attribute and wrap them in an array. ### Body ```json { - "operation": "sql", - "sql": "SELECT title, rank, search_json('[name]', keywords) as keywords FROM movies.movie ORDER BY rank LIMIT 10" + "operation": "sql", + "sql": "SELECT title, rank, search_json('[name]', keywords) as keywords FROM movies.movie ORDER BY rank LIMIT 10" } ``` ### Response: 200 + ```json [ - { - "title": "Ad Astra", - "rank": 1, - "keywords": [ - "moon", - "loss of loved one", - "planet mars", - "astronaut", - "moon colony", - "solar system", - "father son relationship", - "near future", - "planet neptune", - "space walk" - ] - }, - { - "title": "Extraction", - "rank": 2, - "keywords": [ - "mercenary", - "mumbai (bombay), india", - "based on comic", - "crime boss", - "rescue mission", - "based on graphic novel", - "dhaka (dacca), bangladesh" - ] - }, - { - "title": "To the Beat! Back 2 School", - "rank": 3, - "keywords": [ - "school" - ] - }, - { - "title": "Bloodshot", - "rank": 4, - "keywords": [ - "nanotechnology", - "superhero", - "based on comic", - "psychotronic", - "shared universe", - "valiant comics" - ] - }, - { - "title": "The Call of the Wild", - "rank": 5, - "keywords": [ - "based on novel or book", - "gold rush", - "dog", - "sled dogs", - "yukon", - "19th century", - "cgi animation", - "1890s" - ] - }, - { - "title": "Sonic the Hedgehog", - "rank": 6, - "keywords": [ - "video game", - "friendship", - "good vs evil", - "based on video game", - "road movie", - "farting", - "bar fight", - "amistad", - "live action remake", - "fantasy", - "videojuego" - ] - }, - { - "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", - "rank": 7, - "keywords": [ - "dc comics", - "based on comic", - "woman director", - "dc extended universe" - ] - }, - { - "title": "Justice League Dark: Apokolips War", - "rank": 8, - "keywords": [ - "dc comics" - ] - }, - { - "title": "Parasite", - "rank": 9, - "keywords": [ - "underground", - "seoul", - "birthday party", - "private lessons", - "basement", - "con artist", - "working class", - "psychological thriller", - "limousine driver", - "class differences", - "rich poor", - "housekeeper", - "tutor", - "family", - "crime family", - "flood", - "smell", - "unemployed", - "wealthy family" - ] - }, - { - "title": "Star Wars: The Rise of Skywalker", - "rank": 10, - "keywords": [ - "space opera" - ] - } + { + "title": "Ad Astra", + "rank": 1, + "keywords": [ + "moon", + "loss of loved one", + "planet mars", + "astronaut", + "moon colony", + "solar system", + "father son relationship", + "near future", + "planet neptune", + "space walk" + ] + }, + { + "title": "Extraction", + "rank": 2, + "keywords": [ + "mercenary", + "mumbai (bombay), india", + "based on comic", + "crime boss", + "rescue mission", + "based on graphic novel", + "dhaka (dacca), bangladesh" + ] + }, + { + "title": "To the Beat! Back 2 School", + "rank": 3, + "keywords": ["school"] + }, + { + "title": "Bloodshot", + "rank": 4, + "keywords": ["nanotechnology", "superhero", "based on comic", "psychotronic", "shared universe", "valiant comics"] + }, + { + "title": "The Call of the Wild", + "rank": 5, + "keywords": [ + "based on novel or book", + "gold rush", + "dog", + "sled dogs", + "yukon", + "19th century", + "cgi animation", + "1890s" + ] + }, + { + "title": "Sonic the Hedgehog", + "rank": 6, + "keywords": [ + "video game", + "friendship", + "good vs evil", + "based on video game", + "road movie", + "farting", + "bar fight", + "amistad", + "live action remake", + "fantasy", + "videojuego" + ] + }, + { + "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", + "rank": 7, + "keywords": ["dc comics", "based on comic", "woman director", "dc extended universe"] + }, + { + "title": "Justice League Dark: Apokolips War", + "rank": 8, + "keywords": ["dc comics"] + }, + { + "title": "Parasite", + "rank": 9, + "keywords": [ + "underground", + "seoul", + "birthday party", + "private lessons", + "basement", + "con artist", + "working class", + "psychological thriller", + "limousine driver", + "class differences", + "rich poor", + "housekeeper", + "tutor", + "family", + "crime family", + "flood", + "smell", + "unemployed", + "wealthy family" + ] + }, + { + "title": "Star Wars: The Rise of Skywalker", + "rank": 10, + "keywords": ["space opera"] + } ] ``` - --- ## Use search_json in a where clause -This example shows how we can use SEARCH_JSON to filter out records in a WHERE clause. The production_companies attribute holds an object array of companies that produced each movie, we want to only see movies which were produced by Marvel Studios. Our expression is a filter '$[name="Marvel Studios"]' this tells the function to iterate the production_companies array and only return entries where the name is "Marvel Studios". + +This example shows how we can use SEARCH_JSON to filter out records in a WHERE clause. The production_companies attribute holds an object array of companies that produced each movie, we want to only see movies which were produced by Marvel Studios. Our expression is a filter '$[name="Marvel Studios"]' this tells the function to iterate the production_companies array and only return entries where the name is "Marvel Studios". ### Body ```json { - "operation": "sql", - "sql": "SELECT title, release_date FROM movies.movie where search_json('$[name=\"Marvel Studios\"]', production_companies) IS NOT NULL ORDER BY release_date" + "operation": "sql", + "sql": "SELECT title, release_date FROM movies.movie where search_json('$[name=\"Marvel Studios\"]', production_companies) IS NOT NULL ORDER BY release_date" } ``` ### Response: 200 + ```json [ - { - "title": "Iron Man", - "release_date": "2008-04-30" - }, - { - "title": "The Incredible Hulk", - "release_date": "2008-06-12" - }, - { - "title": "Iron Man 2", - "release_date": "2010-04-28" - }, - { - "title": "Thor", - "release_date": "2011-04-21" - }, - { - "title": "Captain America: The First Avenger", - "release_date": "2011-07-22" - }, - { - "title": "Marvel One-Shot: The Consultant", - "release_date": "2011-09-12" - }, - { - "title": "Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer", - "release_date": "2011-10-25" - }, - { - "title": "The Avengers", - "release_date": "2012-04-25" - }, - { - "title": "Marvel One-Shot: Item 47", - "release_date": "2012-09-13" - }, - { - "title": "Iron Man 3", - "release_date": "2013-04-18" - }, - { - "title": "Marvel One-Shot: Agent Carter", - "release_date": "2013-09-08" - }, - { - "title": "Thor: The Dark World", - "release_date": "2013-10-29" - }, - { - "title": "Marvel One-Shot: All Hail the King", - "release_date": "2014-02-04" - }, - { - "title": "Marvel Studios: Assembling a Universe", - "release_date": "2014-03-18" - }, - { - "title": "Captain America: The Winter Soldier", - "release_date": "2014-03-20" - }, - { - "title": "Guardians of the Galaxy", - "release_date": "2014-07-30" - }, - { - "title": "Avengers: Age of Ultron", - "release_date": "2015-04-22" - }, - { - "title": "Ant-Man", - "release_date": "2015-07-14" - }, - { - "title": "Captain America: Civil War", - "release_date": "2016-04-27" - }, - { - "title": "Team Thor", - "release_date": "2016-08-28" - }, - { - "title": "Doctor Strange", - "release_date": "2016-10-25" - }, - { - "title": "Guardians of the Galaxy Vol. 2", - "release_date": "2017-04-19" - }, - { - "title": "Spider-Man: Homecoming", - "release_date": "2017-07-05" - }, - { - "title": "Thor: Ragnarok", - "release_date": "2017-10-25" - }, - { - "title": "Black Panther", - "release_date": "2018-02-13" - }, - { - "title": "Avengers: Infinity War", - "release_date": "2018-04-25" - }, - { - "title": "Ant-Man and the Wasp", - "release_date": "2018-07-04" - }, - { - "title": "Captain Marvel", - "release_date": "2019-03-06" - }, - { - "title": "Avengers: Endgame", - "release_date": "2019-04-24" - }, - { - "title": "Spider-Man: Far from Home", - "release_date": "2019-06-28" - }, - { - "title": "Black Widow", - "release_date": "2020-10-28" - }, - { - "title": "Untitled Spider-Man 3", - "release_date": "2021-11-04" - }, - { - "title": "Thor: Love and Thunder", - "release_date": "2022-02-10" - }, - { - "title": "Doctor Strange in the Multiverse of Madness", - "release_date": "2022-03-23" - }, - { - "title": "Untitled Marvel Project (3)", - "release_date": "2022-07-29" - }, - { - "title": "Guardians of the Galaxy Vol. 3", - "release_date": "2023-02-16" - } + { + "title": "Iron Man", + "release_date": "2008-04-30" + }, + { + "title": "The Incredible Hulk", + "release_date": "2008-06-12" + }, + { + "title": "Iron Man 2", + "release_date": "2010-04-28" + }, + { + "title": "Thor", + "release_date": "2011-04-21" + }, + { + "title": "Captain America: The First Avenger", + "release_date": "2011-07-22" + }, + { + "title": "Marvel One-Shot: The Consultant", + "release_date": "2011-09-12" + }, + { + "title": "Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer", + "release_date": "2011-10-25" + }, + { + "title": "The Avengers", + "release_date": "2012-04-25" + }, + { + "title": "Marvel One-Shot: Item 47", + "release_date": "2012-09-13" + }, + { + "title": "Iron Man 3", + "release_date": "2013-04-18" + }, + { + "title": "Marvel One-Shot: Agent Carter", + "release_date": "2013-09-08" + }, + { + "title": "Thor: The Dark World", + "release_date": "2013-10-29" + }, + { + "title": "Marvel One-Shot: All Hail the King", + "release_date": "2014-02-04" + }, + { + "title": "Marvel Studios: Assembling a Universe", + "release_date": "2014-03-18" + }, + { + "title": "Captain America: The Winter Soldier", + "release_date": "2014-03-20" + }, + { + "title": "Guardians of the Galaxy", + "release_date": "2014-07-30" + }, + { + "title": "Avengers: Age of Ultron", + "release_date": "2015-04-22" + }, + { + "title": "Ant-Man", + "release_date": "2015-07-14" + }, + { + "title": "Captain America: Civil War", + "release_date": "2016-04-27" + }, + { + "title": "Team Thor", + "release_date": "2016-08-28" + }, + { + "title": "Doctor Strange", + "release_date": "2016-10-25" + }, + { + "title": "Guardians of the Galaxy Vol. 2", + "release_date": "2017-04-19" + }, + { + "title": "Spider-Man: Homecoming", + "release_date": "2017-07-05" + }, + { + "title": "Thor: Ragnarok", + "release_date": "2017-10-25" + }, + { + "title": "Black Panther", + "release_date": "2018-02-13" + }, + { + "title": "Avengers: Infinity War", + "release_date": "2018-04-25" + }, + { + "title": "Ant-Man and the Wasp", + "release_date": "2018-07-04" + }, + { + "title": "Captain Marvel", + "release_date": "2019-03-06" + }, + { + "title": "Avengers: Endgame", + "release_date": "2019-04-24" + }, + { + "title": "Spider-Man: Far from Home", + "release_date": "2019-06-28" + }, + { + "title": "Black Widow", + "release_date": "2020-10-28" + }, + { + "title": "Untitled Spider-Man 3", + "release_date": "2021-11-04" + }, + { + "title": "Thor: Love and Thunder", + "release_date": "2022-02-10" + }, + { + "title": "Doctor Strange in the Multiverse of Madness", + "release_date": "2022-03-23" + }, + { + "title": "Untitled Marvel Project (3)", + "release_date": "2022-07-29" + }, + { + "title": "Guardians of the Galaxy Vol. 3", + "release_date": "2023-02-16" + } ] ``` - --- ## Use search_json to show the movies with the largest casts -This example shows how we can use SEARCH_JSON to perform a simple calculation on JSON and order by the results. The cast attribute holds an object array of details around the cast of a movie. We use the expression '$count(id)' that counts each id and returns the value back which we alias in SQL as cast_size which in turn gets used to sort the rows. + +This example shows how we can use SEARCH_JSON to perform a simple calculation on JSON and order by the results. The cast attribute holds an object array of details around the cast of a movie. We use the expression '$count(id)' that counts each id and returns the value back which we alias in SQL as cast_size which in turn gets used to sort the rows. ### Body ```json { - "operation": "sql", - "sql": "SELECT movie_title, search_json('$count(id)', `cast`) as cast_size FROM movies.credits ORDER BY cast_size DESC LIMIT 10" + "operation": "sql", + "sql": "SELECT movie_title, search_json('$count(id)', `cast`) as cast_size FROM movies.credits ORDER BY cast_size DESC LIMIT 10" } ``` ### Response: 200 + ```json [ - { - "movie_title": "Around the World in Eighty Days", - "cast_size": 312 - }, - { - "movie_title": "And the Oscar Goes To...", - "cast_size": 259 - }, - { - "movie_title": "Rock of Ages", - "cast_size": 223 - }, - { - "movie_title": "Mr. Smith Goes to Washington", - "cast_size": 213 - }, - { - "movie_title": "Les Misérables", - "cast_size": 208 - }, - { - "movie_title": "Jason Bourne", - "cast_size": 201 - }, - { - "movie_title": "The Muppets", - "cast_size": 191 - }, - { - "movie_title": "You Don't Mess with the Zohan", - "cast_size": 183 - }, - { - "movie_title": "The Irishman", - "cast_size": 173 - }, - { - "movie_title": "Spider-Man: Far from Home", - "cast_size": 173 - } + { + "movie_title": "Around the World in Eighty Days", + "cast_size": 312 + }, + { + "movie_title": "And the Oscar Goes To...", + "cast_size": 259 + }, + { + "movie_title": "Rock of Ages", + "cast_size": 223 + }, + { + "movie_title": "Mr. Smith Goes to Washington", + "cast_size": 213 + }, + { + "movie_title": "Les Misérables", + "cast_size": 208 + }, + { + "movie_title": "Jason Bourne", + "cast_size": 201 + }, + { + "movie_title": "The Muppets", + "cast_size": 191 + }, + { + "movie_title": "You Don't Mess with the Zohan", + "cast_size": 183 + }, + { + "movie_title": "The Irishman", + "cast_size": 173 + }, + { + "movie_title": "Spider-Man: Far from Home", + "cast_size": 173 + } ] ``` - --- ## search_json as a condition, in a select with a table join -This example shows how we can use SEARCH_JSON to find movies where at least of 2 our favorite actors from Marvel films have acted together then list the movie, its overview, release date, and the actors names and their characters. The WHERE clause performs a count on credits.cast attribute that have the matching actors. The SELECT performs the same filter on the cast attribute and performs a transform on each object to just return the actor's name and their character. + +This example shows how we can use SEARCH_JSON to find movies where at least of 2 our favorite actors from Marvel films have acted together then list the movie, its overview, release date, and the actors names and their characters. The WHERE clause performs a count on credits.cast attribute that have the matching actors. The SELECT performs the same filter on the cast attribute and performs a transform on each object to just return the actor's name and their character. ### Body ```json { - "operation": "sql", - "sql": "SELECT m.title, m.overview, m.release_date, search_json('$[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]].{\"actor\": name, \"character\": character}', c.`cast`) as characters FROM movies.credits c INNER JOIN movies.movie m ON c.movie_id = m.id WHERE search_json('$count($[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]])', c.`cast`) >= 2" + "operation": "sql", + "sql": "SELECT m.title, m.overview, m.release_date, search_json('$[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]].{\"actor\": name, \"character\": character}', c.`cast`) as characters FROM movies.credits c INNER JOIN movies.movie m ON c.movie_id = m.id WHERE search_json('$count($[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]])', c.`cast`) >= 2" } ``` ### Response: 200 + ```json [ - { - "title": "Out of Sight", - "overview": "Meet Jack Foley, a smooth criminal who bends the law and is determined to make one last heist. Karen Sisco is a federal marshal who chooses all the right moves … and all the wrong guys. Now they're willing to risk it all to find out if there's more between them than just the law.", - "release_date": "1998-06-26", - "characters": [ - { - "actor": "Don Cheadle", - "character": "Maurice Miller" - }, - { - "actor": "Samuel L. Jackson", - "character": "Hejira Henry (uncredited)" - } - ] - }, - { - "title": "Iron Man", - "overview": "After being held captive in an Afghan cave, billionaire engineer Tony Stark creates a unique weaponized suit of armor to fight evil.", - "release_date": "2008-04-30", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury (uncredited)" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - } - ] - }, - { - "title": "Captain America: The First Avenger", - "overview": "During World War II, Steve Rogers is a sickly man from Brooklyn who's transformed into super-soldier Captain America to aid in the war effort. Rogers must stop the Red Skull – Adolf Hitler's ruthless head of weaponry, and the leader of an organization that intends to use a mysterious device of untold powers for world domination.", - "release_date": "2011-07-22", - "characters": [ - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - } - ] - }, - { - "title": "In Good Company", - "overview": "Dan Foreman is a seasoned advertisement sales executive at a high-ranking publication when a corporate takeover results in him being placed under naive supervisor Carter Duryea, who is half his age. Matters are made worse when Dan's new supervisor becomes romantically involved with his daughter an 18 year-old college student Alex.", - "release_date": "2004-12-29", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Alex Foreman" - }, - { - "actor": "Clark Gregg", - "character": "Mark Steckle" - } - ] - }, - { - "title": "Zodiac", - "overview": "The true story of the investigation of the \"Zodiac Killer\", a serial killer who terrified the San Francisco Bay Area, taunting police with his ciphers and letters. The case becomes an obsession for three men as their lives and careers are built and destroyed by the endless trail of clues.", - "release_date": "2007-03-02", - "characters": [ - { - "actor": "Mark Ruffalo", - "character": "Dave Toschi" - }, - { - "actor": "Robert Downey Jr.", - "character": "Paul Avery" - } - ] - }, - { - "title": "Hard Eight", - "overview": "A stranger mentors a young Reno gambler who weds a hooker and befriends a vulgar casino regular.", - "release_date": "1996-02-28", - "characters": [ - { - "actor": "Gwyneth Paltrow", - "character": "Clementine" - }, - { - "actor": "Samuel L. Jackson", - "character": "Jimmy" - } - ] - }, - { - "title": "The Spirit", - "overview": "Down these mean streets a man must come. A hero born, murdered, and born again. A Rookie cop named Denny Colt returns from the beyond as The Spirit, a hero whose mission is to fight against the bad forces from the shadows of Central City. The Octopus, who kills anyone unfortunate enough to see his face, has other plans; he is going to wipe out the entire city.", - "release_date": "2008-12-25", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Silken Floss" - }, - { - "actor": "Samuel L. Jackson", - "character": "Octopuss" - } - ] - }, - { - "title": "S.W.A.T.", - "overview": "Hondo Harrelson recruits Jim Street to join an elite unit of the Los Angeles Police Department. Together they seek out more members, including tough Deke Kay and single mom Chris Sanchez. The team's first big assignment is to escort crime boss Alex Montel to prison. It seems routine, but when Montel offers a huge reward to anyone who can break him free, criminals of various stripes step up for the prize.", - "release_date": "2003-08-08", - "characters": [ - { - "actor": "Samuel L. Jackson", - "character": "Sgt. Dan 'Hondo' Harrelson" - }, - { - "actor": "Jeremy Renner", - "character": "Brian Gamble" - } - ] - }, - { - "title": "Iron Man 2", - "overview": "With the world now aware of his dual life as the armored superhero Iron Man, billionaire inventor Tony Stark faces pressure from the government, the press and the public to share his technology with the military. Unwilling to let go of his invention, Stark, with Pepper Potts and James 'Rhodey' Rhodes at his side, must forge new alliances – and confront powerful enemies.", - "release_date": "2010-04-28", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - }, - { - "actor": "Scarlett Johansson", - "character": "Natalie Rushman / Natasha Romanoff / Black Widow" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - } - ] - }, - { - "title": "Thor", - "overview": "Against his father Odin's will, The Mighty Thor - a powerful but arrogant warrior god - recklessly reignites an ancient war. Thor is cast down to Earth and forced to live among humans as punishment. Once here, Thor learns what it takes to be a true hero when the most dangerous villain of his world sends the darkest forces of Asgard to invade Earth.", - "release_date": "2011-04-21", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye (uncredited)" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury (uncredited)" - } - ] - }, - { - "title": "View from the Top", - "overview": "A small-town woman tries to achieve her goal of becoming a flight attendant.", - "release_date": "2003-03-21", - "characters": [ - { - "actor": "Gwyneth Paltrow", - "character": "Donna" - }, - { - "actor": "Mark Ruffalo", - "character": "Ted Stewart" - } - ] - }, - { - "title": "The Nanny Diaries", - "overview": "A college graduate goes to work as a nanny for a rich New York family. Ensconced in their home, she has to juggle their dysfunction, a new romance, and the spoiled brat in her charge.", - "release_date": "2007-08-24", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Annie Braddock" - }, - { - "actor": "Chris Evans", - "character": "Hayden \"Harvard Hottie\"" - } - ] - }, - { - "title": "The Perfect Score", - "overview": "Six high school seniors decide to break into the Princeton Testing Center so they can steal the answers to their upcoming SAT tests and all get perfect scores.", - "release_date": "2004-01-30", - "characters": [ - { - "actor": "Chris Evans", - "character": "Kyle" - }, - { - "actor": "Scarlett Johansson", - "character": "Francesca Curtis" - } - ] - }, - { - "title": "The Avengers", - "overview": "When an unexpected enemy emerges and threatens global safety and security, Nick Fury, director of the international peacekeeping agency known as S.H.I.E.L.D., finds himself in need of a team to pull the world back from the brink of disaster. Spanning the globe, a daring recruitment effort begins!", - "release_date": "2012-04-25", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - } - ] - }, - { - "title": "Iron Man 3", - "overview": "When Tony Stark's world is torn apart by a formidable terrorist called the Mandarin, he starts an odyssey of rebuilding and retribution.", - "release_date": "2013-04-18", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / Iron Patriot" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner (uncredited)" - } - ] - }, - { - "title": "Marvel One-Shot: The Consultant", - "overview": "Agent Coulson informs Agent Sitwell that the World Security Council wishes Emil Blonsky to be released from prison to join the Avengers Initiative. As Nick Fury doesn't want to release Blonsky, the two agents decide to send a patsy to sabotage the meeting...", - "release_date": "2011-09-12", - "characters": [ - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark (archive footage)" - } - ] - }, - { - "title": "Thor: The Dark World", - "overview": "Thor fights to restore order across the cosmos… but an ancient race led by the vengeful Malekith returns to plunge the universe back into darkness. Faced with an enemy that even Odin and Asgard cannot withstand, Thor must embark on his most perilous and personal journey yet, one that will reunite him with Jane Foster and force him to sacrifice everything to save us all.", - "release_date": "2013-10-29", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Chris Evans", - "character": "Loki as Captain America (uncredited)" - } - ] - }, - { - "title": "Avengers: Age of Ultron", - "overview": "When Tony Stark tries to jumpstart a dormant peacekeeping program, things go awry and Earth’s Mightiest Heroes are put to the ultimate test as the fate of the planet hangs in the balance. As the villainous Ultron emerges, it is up to The Avengers to stop him from enacting his terrible plans, and soon uneasy alliances and unexpected action pave the way for an epic and unique global adventure.", - "release_date": "2015-04-22", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - } - ] - }, - { - "title": "Captain America: The Winter Soldier", - "overview": "After the cataclysmic events in New York with The Avengers, Steve Rogers, aka Captain America is living quietly in Washington, D.C. and trying to adjust to the modern world. But when a S.H.I.E.L.D. colleague comes under attack, Steve becomes embroiled in a web of intrigue that threatens to put the world at risk. Joining forces with the Black Widow, Captain America struggles to expose the ever-widening conspiracy while fighting off professional assassins sent to silence him at every turn. When the full scope of the villainous plot is revealed, Captain America and the Black Widow enlist the help of a new ally, the Falcon. However, they soon find themselves up against an unexpected and formidable enemy—the Winter Soldier.", - "release_date": "2014-03-20", - "characters": [ - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - } - ] - }, - { - "title": "Thanks for Sharing", - "overview": "A romantic comedy that brings together three disparate characters who are learning to face a challenging and often confusing world as they struggle together against a common demon—sex addiction.", - "release_date": "2013-09-19", - "characters": [ - { - "actor": "Mark Ruffalo", - "character": "Adam" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Phoebe" - } - ] - }, - { - "title": "Chef", - "overview": "When Chef Carl Casper suddenly quits his job at a prominent Los Angeles restaurant after refusing to compromise his creative integrity for its controlling owner, he is left to figure out what's next. Finding himself in Miami, he teams up with his ex-wife, his friend and his son to launch a food truck. Taking to the road, Chef Carl goes back to his roots to reignite his passion for the kitchen -- and zest for life and love.", - "release_date": "2014-05-08", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Molly" - }, - { - "actor": "Robert Downey Jr.", - "character": "Marvin" - } - ] - }, - { - "title": "Marvel Studios: Assembling a Universe", - "overview": "A look at the story behind Marvel Studios and the Marvel Cinematic Universe, featuring interviews and behind-the-scenes footage from all of the Marvel films, the Marvel One-Shots and \"Marvel's Agents of S.H.I.E.L.D.\"", - "release_date": "2014-03-18", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Himself / Tony Stark / Iron Man" - }, - { - "actor": "Chris Hemsworth", - "character": "Himself / Thor" - }, - { - "actor": "Chris Evans", - "character": "Himself / Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Himself / Bruce Banner / Hulk" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Herself" - }, - { - "actor": "Clark Gregg", - "character": "Himself" - }, - { - "actor": "Samuel L. Jackson", - "character": "Himself" - }, - { - "actor": "Scarlett Johansson", - "character": "Herself" - }, - { - "actor": "Jeremy Renner", - "character": "Himself" - } - ] - }, - { - "title": "Captain America: Civil War", - "overview": "Following the events of Age of Ultron, the collective governments of the world pass an act designed to regulate all superhuman activity. This polarizes opinion amongst the Avengers, causing two factions to side with Iron Man or Captain America, which causes an epic battle between former allies.", - "release_date": "2016-04-27", - "characters": [ - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - } - ] - }, - { - "title": "Thor: Ragnarok", - "overview": "Thor is imprisoned on the other side of the universe and finds himself in a race against time to get back to Asgard to stop Ragnarok, the destruction of his home-world and the end of Asgardian civilization, at the hands of an all-powerful new threat, the ruthless Hela.", - "release_date": "2017-10-25", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / Hulk" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow (archive footage / uncredited)" - } - ] - }, - { - "title": "Avengers: Endgame", - "overview": "After the devastating events of Avengers: Infinity War, the universe is in ruins due to the efforts of the Mad Titan, Thanos. With the help of remaining allies, the Avengers must assemble once more in order to undo Thanos' actions and restore order to the universe once and for all, no matter what consequences may be in store.", - "release_date": "2019-04-24", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / Hulk" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - }, - { - "actor": "Don Cheadle", - "character": "James Rhodes / War Machine" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Pepper Potts" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - } - ] - }, - { - "title": "Avengers: Infinity War", - "overview": "As the Avengers and their allies have continued to protect the world from threats too large for any one hero to handle, a new danger has emerged from the cosmic shadows: Thanos. A despot of intergalactic infamy, his goal is to collect all six Infinity Stones, artifacts of unimaginable power, and use them to inflict his twisted will on all of reality. Everything the Avengers have fought for has led up to this moment - the fate of Earth and existence itself has never been more uncertain.", - "release_date": "2018-04-25", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury (uncredited)" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - } - ] - }, - { - "title": "Captain Marvel", - "overview": "The story follows Carol Danvers as she becomes one of the universe’s most powerful heroes when Earth is caught in the middle of a galactic war between two alien races. Set in the 1990s, Captain Marvel is an all-new adventure from a previously unseen period in the history of the Marvel Cinematic Universe.", - "release_date": "2019-03-06", - "characters": [ - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Clark Gregg", - "character": "Agent Phil Coulson" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America (uncredited)" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow (uncredited)" - }, - { - "actor": "Don Cheadle", - "character": "James 'Rhodey' Rhodes / War Machine (uncredited)" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk (uncredited)" - } - ] - }, - { - "title": "Spider-Man: Homecoming", - "overview": "Following the events of Captain America: Civil War, Peter Parker, with the help of his mentor Tony Stark, tries to balance his life as an ordinary high school student in Queens, New York City, with fighting crime as his superhero alter ego Spider-Man as a new threat, the Vulture, emerges.", - "release_date": "2017-07-05", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - } - ] - }, - { - "title": "Team Thor", - "overview": "Discover what Thor was up to during the events of Captain America: Civil War.", - "release_date": "2016-08-28", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner" - } - ] - }, - { - "title": "Black Widow", - "overview": "Natasha Romanoff, also known as Black Widow, confronts the darker parts of her ledger when a dangerous conspiracy with ties to her past arises. Pursued by a force that will stop at nothing to bring her down, Natasha must deal with her history as a spy and the broken relationships left in her wake long before she became an Avenger.", - "release_date": "2020-10-28", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - } - ] - } + { + "title": "Out of Sight", + "overview": "Meet Jack Foley, a smooth criminal who bends the law and is determined to make one last heist. Karen Sisco is a federal marshal who chooses all the right moves … and all the wrong guys. Now they're willing to risk it all to find out if there's more between them than just the law.", + "release_date": "1998-06-26", + "characters": [ + { + "actor": "Don Cheadle", + "character": "Maurice Miller" + }, + { + "actor": "Samuel L. Jackson", + "character": "Hejira Henry (uncredited)" + } + ] + }, + { + "title": "Iron Man", + "overview": "After being held captive in an Afghan cave, billionaire engineer Tony Stark creates a unique weaponized suit of armor to fight evil.", + "release_date": "2008-04-30", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury (uncredited)" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + } + ] + }, + { + "title": "Captain America: The First Avenger", + "overview": "During World War II, Steve Rogers is a sickly man from Brooklyn who's transformed into super-soldier Captain America to aid in the war effort. Rogers must stop the Red Skull – Adolf Hitler's ruthless head of weaponry, and the leader of an organization that intends to use a mysterious device of untold powers for world domination.", + "release_date": "2011-07-22", + "characters": [ + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + } + ] + }, + { + "title": "In Good Company", + "overview": "Dan Foreman is a seasoned advertisement sales executive at a high-ranking publication when a corporate takeover results in him being placed under naive supervisor Carter Duryea, who is half his age. Matters are made worse when Dan's new supervisor becomes romantically involved with his daughter an 18 year-old college student Alex.", + "release_date": "2004-12-29", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Alex Foreman" + }, + { + "actor": "Clark Gregg", + "character": "Mark Steckle" + } + ] + }, + { + "title": "Zodiac", + "overview": "The true story of the investigation of the \"Zodiac Killer\", a serial killer who terrified the San Francisco Bay Area, taunting police with his ciphers and letters. The case becomes an obsession for three men as their lives and careers are built and destroyed by the endless trail of clues.", + "release_date": "2007-03-02", + "characters": [ + { + "actor": "Mark Ruffalo", + "character": "Dave Toschi" + }, + { + "actor": "Robert Downey Jr.", + "character": "Paul Avery" + } + ] + }, + { + "title": "Hard Eight", + "overview": "A stranger mentors a young Reno gambler who weds a hooker and befriends a vulgar casino regular.", + "release_date": "1996-02-28", + "characters": [ + { + "actor": "Gwyneth Paltrow", + "character": "Clementine" + }, + { + "actor": "Samuel L. Jackson", + "character": "Jimmy" + } + ] + }, + { + "title": "The Spirit", + "overview": "Down these mean streets a man must come. A hero born, murdered, and born again. A Rookie cop named Denny Colt returns from the beyond as The Spirit, a hero whose mission is to fight against the bad forces from the shadows of Central City. The Octopus, who kills anyone unfortunate enough to see his face, has other plans; he is going to wipe out the entire city.", + "release_date": "2008-12-25", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Silken Floss" + }, + { + "actor": "Samuel L. Jackson", + "character": "Octopuss" + } + ] + }, + { + "title": "S.W.A.T.", + "overview": "Hondo Harrelson recruits Jim Street to join an elite unit of the Los Angeles Police Department. Together they seek out more members, including tough Deke Kay and single mom Chris Sanchez. The team's first big assignment is to escort crime boss Alex Montel to prison. It seems routine, but when Montel offers a huge reward to anyone who can break him free, criminals of various stripes step up for the prize.", + "release_date": "2003-08-08", + "characters": [ + { + "actor": "Samuel L. Jackson", + "character": "Sgt. Dan 'Hondo' Harrelson" + }, + { + "actor": "Jeremy Renner", + "character": "Brian Gamble" + } + ] + }, + { + "title": "Iron Man 2", + "overview": "With the world now aware of his dual life as the armored superhero Iron Man, billionaire inventor Tony Stark faces pressure from the government, the press and the public to share his technology with the military. Unwilling to let go of his invention, Stark, with Pepper Potts and James 'Rhodey' Rhodes at his side, must forge new alliances – and confront powerful enemies.", + "release_date": "2010-04-28", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + }, + { + "actor": "Scarlett Johansson", + "character": "Natalie Rushman / Natasha Romanoff / Black Widow" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + } + ] + }, + { + "title": "Thor", + "overview": "Against his father Odin's will, The Mighty Thor - a powerful but arrogant warrior god - recklessly reignites an ancient war. Thor is cast down to Earth and forced to live among humans as punishment. Once here, Thor learns what it takes to be a true hero when the most dangerous villain of his world sends the darkest forces of Asgard to invade Earth.", + "release_date": "2011-04-21", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye (uncredited)" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury (uncredited)" + } + ] + }, + { + "title": "View from the Top", + "overview": "A small-town woman tries to achieve her goal of becoming a flight attendant.", + "release_date": "2003-03-21", + "characters": [ + { + "actor": "Gwyneth Paltrow", + "character": "Donna" + }, + { + "actor": "Mark Ruffalo", + "character": "Ted Stewart" + } + ] + }, + { + "title": "The Nanny Diaries", + "overview": "A college graduate goes to work as a nanny for a rich New York family. Ensconced in their home, she has to juggle their dysfunction, a new romance, and the spoiled brat in her charge.", + "release_date": "2007-08-24", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Annie Braddock" + }, + { + "actor": "Chris Evans", + "character": "Hayden \"Harvard Hottie\"" + } + ] + }, + { + "title": "The Perfect Score", + "overview": "Six high school seniors decide to break into the Princeton Testing Center so they can steal the answers to their upcoming SAT tests and all get perfect scores.", + "release_date": "2004-01-30", + "characters": [ + { + "actor": "Chris Evans", + "character": "Kyle" + }, + { + "actor": "Scarlett Johansson", + "character": "Francesca Curtis" + } + ] + }, + { + "title": "The Avengers", + "overview": "When an unexpected enemy emerges and threatens global safety and security, Nick Fury, director of the international peacekeeping agency known as S.H.I.E.L.D., finds himself in need of a team to pull the world back from the brink of disaster. Spanning the globe, a daring recruitment effort begins!", + "release_date": "2012-04-25", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + } + ] + }, + { + "title": "Iron Man 3", + "overview": "When Tony Stark's world is torn apart by a formidable terrorist called the Mandarin, he starts an odyssey of rebuilding and retribution.", + "release_date": "2013-04-18", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / Iron Patriot" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner (uncredited)" + } + ] + }, + { + "title": "Marvel One-Shot: The Consultant", + "overview": "Agent Coulson informs Agent Sitwell that the World Security Council wishes Emil Blonsky to be released from prison to join the Avengers Initiative. As Nick Fury doesn't want to release Blonsky, the two agents decide to send a patsy to sabotage the meeting...", + "release_date": "2011-09-12", + "characters": [ + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark (archive footage)" + } + ] + }, + { + "title": "Thor: The Dark World", + "overview": "Thor fights to restore order across the cosmos… but an ancient race led by the vengeful Malekith returns to plunge the universe back into darkness. Faced with an enemy that even Odin and Asgard cannot withstand, Thor must embark on his most perilous and personal journey yet, one that will reunite him with Jane Foster and force him to sacrifice everything to save us all.", + "release_date": "2013-10-29", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Chris Evans", + "character": "Loki as Captain America (uncredited)" + } + ] + }, + { + "title": "Avengers: Age of Ultron", + "overview": "When Tony Stark tries to jumpstart a dormant peacekeeping program, things go awry and Earth’s Mightiest Heroes are put to the ultimate test as the fate of the planet hangs in the balance. As the villainous Ultron emerges, it is up to The Avengers to stop him from enacting his terrible plans, and soon uneasy alliances and unexpected action pave the way for an epic and unique global adventure.", + "release_date": "2015-04-22", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + } + ] + }, + { + "title": "Captain America: The Winter Soldier", + "overview": "After the cataclysmic events in New York with The Avengers, Steve Rogers, aka Captain America is living quietly in Washington, D.C. and trying to adjust to the modern world. But when a S.H.I.E.L.D. colleague comes under attack, Steve becomes embroiled in a web of intrigue that threatens to put the world at risk. Joining forces with the Black Widow, Captain America struggles to expose the ever-widening conspiracy while fighting off professional assassins sent to silence him at every turn. When the full scope of the villainous plot is revealed, Captain America and the Black Widow enlist the help of a new ally, the Falcon. However, they soon find themselves up against an unexpected and formidable enemy—the Winter Soldier.", + "release_date": "2014-03-20", + "characters": [ + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + } + ] + }, + { + "title": "Thanks for Sharing", + "overview": "A romantic comedy that brings together three disparate characters who are learning to face a challenging and often confusing world as they struggle together against a common demon—sex addiction.", + "release_date": "2013-09-19", + "characters": [ + { + "actor": "Mark Ruffalo", + "character": "Adam" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Phoebe" + } + ] + }, + { + "title": "Chef", + "overview": "When Chef Carl Casper suddenly quits his job at a prominent Los Angeles restaurant after refusing to compromise his creative integrity for its controlling owner, he is left to figure out what's next. Finding himself in Miami, he teams up with his ex-wife, his friend and his son to launch a food truck. Taking to the road, Chef Carl goes back to his roots to reignite his passion for the kitchen -- and zest for life and love.", + "release_date": "2014-05-08", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Molly" + }, + { + "actor": "Robert Downey Jr.", + "character": "Marvin" + } + ] + }, + { + "title": "Marvel Studios: Assembling a Universe", + "overview": "A look at the story behind Marvel Studios and the Marvel Cinematic Universe, featuring interviews and behind-the-scenes footage from all of the Marvel films, the Marvel One-Shots and \"Marvel's Agents of S.H.I.E.L.D.\"", + "release_date": "2014-03-18", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Himself / Tony Stark / Iron Man" + }, + { + "actor": "Chris Hemsworth", + "character": "Himself / Thor" + }, + { + "actor": "Chris Evans", + "character": "Himself / Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Himself / Bruce Banner / Hulk" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Herself" + }, + { + "actor": "Clark Gregg", + "character": "Himself" + }, + { + "actor": "Samuel L. Jackson", + "character": "Himself" + }, + { + "actor": "Scarlett Johansson", + "character": "Herself" + }, + { + "actor": "Jeremy Renner", + "character": "Himself" + } + ] + }, + { + "title": "Captain America: Civil War", + "overview": "Following the events of Age of Ultron, the collective governments of the world pass an act designed to regulate all superhuman activity. This polarizes opinion amongst the Avengers, causing two factions to side with Iron Man or Captain America, which causes an epic battle between former allies.", + "release_date": "2016-04-27", + "characters": [ + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + } + ] + }, + { + "title": "Thor: Ragnarok", + "overview": "Thor is imprisoned on the other side of the universe and finds himself in a race against time to get back to Asgard to stop Ragnarok, the destruction of his home-world and the end of Asgardian civilization, at the hands of an all-powerful new threat, the ruthless Hela.", + "release_date": "2017-10-25", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / Hulk" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow (archive footage / uncredited)" + } + ] + }, + { + "title": "Avengers: Endgame", + "overview": "After the devastating events of Avengers: Infinity War, the universe is in ruins due to the efforts of the Mad Titan, Thanos. With the help of remaining allies, the Avengers must assemble once more in order to undo Thanos' actions and restore order to the universe once and for all, no matter what consequences may be in store.", + "release_date": "2019-04-24", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / Hulk" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + }, + { + "actor": "Don Cheadle", + "character": "James Rhodes / War Machine" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Pepper Potts" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + } + ] + }, + { + "title": "Avengers: Infinity War", + "overview": "As the Avengers and their allies have continued to protect the world from threats too large for any one hero to handle, a new danger has emerged from the cosmic shadows: Thanos. A despot of intergalactic infamy, his goal is to collect all six Infinity Stones, artifacts of unimaginable power, and use them to inflict his twisted will on all of reality. Everything the Avengers have fought for has led up to this moment - the fate of Earth and existence itself has never been more uncertain.", + "release_date": "2018-04-25", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury (uncredited)" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + } + ] + }, + { + "title": "Captain Marvel", + "overview": "The story follows Carol Danvers as she becomes one of the universe’s most powerful heroes when Earth is caught in the middle of a galactic war between two alien races. Set in the 1990s, Captain Marvel is an all-new adventure from a previously unseen period in the history of the Marvel Cinematic Universe.", + "release_date": "2019-03-06", + "characters": [ + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Clark Gregg", + "character": "Agent Phil Coulson" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America (uncredited)" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow (uncredited)" + }, + { + "actor": "Don Cheadle", + "character": "James 'Rhodey' Rhodes / War Machine (uncredited)" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk (uncredited)" + } + ] + }, + { + "title": "Spider-Man: Homecoming", + "overview": "Following the events of Captain America: Civil War, Peter Parker, with the help of his mentor Tony Stark, tries to balance his life as an ordinary high school student in Queens, New York City, with fighting crime as his superhero alter ego Spider-Man as a new threat, the Vulture, emerges.", + "release_date": "2017-07-05", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + } + ] + }, + { + "title": "Team Thor", + "overview": "Discover what Thor was up to during the events of Captain America: Civil War.", + "release_date": "2016-08-28", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner" + } + ] + }, + { + "title": "Black Widow", + "overview": "Natasha Romanoff, also known as Black Widow, confronts the darker parts of her ledger when a dangerous conspiracy with ties to her past arises. Pursued by a force that will stop at nothing to bring her down, Natasha must deal with her history as a spy and the broken relationships left in her wake long before she became an Avenger.", + "release_date": "2020-10-28", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + } + ] + } ] ``` diff --git a/site/versioned_docs/version-4.3/developers/operations-api/bulk-operations.md b/site/versioned_docs/version-4.3/developers/operations-api/bulk-operations.md index 59430b69..d698130f 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/bulk-operations.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/bulk-operations.md @@ -5,132 +5,144 @@ title: Bulk Operations # Bulk Operations ## CSV Data Load + Ingests CSV data, provided directly in the operation as an `insert`, `update` or `upsert` into the specified database table. -* operation _(required)_ - must always be `csv_data_load` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* data _(required)_ - csv data to import into HarperDB +- operation _(required)_ - must always be `csv_data_load` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- data _(required)_ - csv data to import into HarperDB ### Body + ```json { - "operation": "csv_data_load", - "database": "dev", - "action": "insert", - "table": "breed", - "data": "id,name,section,country,image\n1,ENGLISH POINTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/001g07.jpg\n2,ENGLISH SETTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/002g07.jpg\n3,KERRY BLUE TERRIER,Large and medium sized Terriers,IRELAND,\n" + "operation": "csv_data_load", + "database": "dev", + "action": "insert", + "table": "breed", + "data": "id,name,section,country,image\n1,ENGLISH POINTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/001g07.jpg\n2,ENGLISH SETTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/002g07.jpg\n3,KERRY BLUE TERRIER,Large and medium sized Terriers,IRELAND,\n" } ``` ### Response: 200 + ```json - { - "message": "Starting job with id 2fe25039-566e-4670-8bb3-2db3d4e07e69", - "job_id": "2fe25039-566e-4670-8bb3-2db3d4e07e69" - } +{ + "message": "Starting job with id 2fe25039-566e-4670-8bb3-2db3d4e07e69", + "job_id": "2fe25039-566e-4670-8bb3-2db3d4e07e69" +} ``` --- ## CSV File Load -Ingests CSV data, provided via a path on the local filesystem, as an `insert`, `update` or `upsert` into the specified database table. + +Ingests CSV data, provided via a path on the local filesystem, as an `insert`, `update` or `upsert` into the specified database table. _Note: The CSV file must reside on the same machine on which HarperDB is running. For example, the path to a CSV on your computer will produce an error if your HarperDB instance is a cloud instance._ -* operation _(required)_ - must always be `csv_file_load` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* file_path _(required)_ - path to the csv file on the host running harperdb +- operation _(required)_ - must always be `csv_file_load` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- file*path *(required)\_ - path to the csv file on the host running harperdb ### Body + ```json { - "operation": "csv_file_load", - "action": "insert", - "database": "dev", - "table": "breed", - "file_path": "/home/user/imports/breeds.csv" + "operation": "csv_file_load", + "action": "insert", + "database": "dev", + "table": "breed", + "file_path": "/home/user/imports/breeds.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 3994d8e2-ec6a-43c4-8563-11c1df81870e", - "job_id": "3994d8e2-ec6a-43c4-8563-11c1df81870e" + "message": "Starting job with id 3994d8e2-ec6a-43c4-8563-11c1df81870e", + "job_id": "3994d8e2-ec6a-43c4-8563-11c1df81870e" } ``` --- ## CSV URL Load + Ingests CSV data, provided via URL, as an `insert`, `update` or `upsert` into the specified database table. -* operation _(required)_ - must always be `csv_url_load` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* csv_url _(required)_ - URL to the csv +- operation _(required)_ - must always be `csv_url_load` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- csv*url *(required)\_ - URL to the csv ### Body + ```json { - "operation": "csv_url_load", - "action": "insert", - "database": "dev", - "table": "breed", - "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" + "operation": "csv_url_load", + "action": "insert", + "database": "dev", + "table": "breed", + "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 332aa0a2-6833-46cd-88a6-ae375920436a", - "job_id": "332aa0a2-6833-46cd-88a6-ae375920436a" + "message": "Starting job with id 332aa0a2-6833-46cd-88a6-ae375920436a", + "job_id": "332aa0a2-6833-46cd-88a6-ae375920436a" } ``` --- ## Import from S3 + This operation allows users to import CSV or JSON files from an AWS S3 bucket as an `insert`, `update` or `upsert`. -* operation _(required)_ - must always be `import_from_s3` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* s3 _(required)_ - object containing required AWS S3 bucket info for operation: - * aws_access_key_id - AWS access key for authenticating into your S3 bucket - * aws_secret_access_key - AWS secret for authenticating into your S3 bucket - * bucket - AWS S3 bucket to import from - * key - the name of the file to import - _the file must include a valid file extension ('.csv' or '.json')_ - * region - the region of the bucket +- operation _(required)_ - must always be `import_from_s3` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- s3 _(required)_ - object containing required AWS S3 bucket info for operation: + - aws_access_key_id - AWS access key for authenticating into your S3 bucket + - aws_secret_access_key - AWS secret for authenticating into your S3 bucket + - bucket - AWS S3 bucket to import from + - key - the name of the file to import - _the file must include a valid file extension ('.csv' or '.json')_ + - region - the region of the bucket ### Body + ```json { - "operation": "import_from_s3", - "action": "insert", - "database": "dev", - "table": "dog", - "s3": { - "aws_access_key_id": "YOUR_KEY", - "aws_secret_access_key": "YOUR_SECRET_KEY", - "bucket": "BUCKET_NAME", - "key": "OBJECT_NAME", - "region": "BUCKET_REGION" - } + "operation": "import_from_s3", + "action": "insert", + "database": "dev", + "table": "dog", + "s3": { + "aws_access_key_id": "YOUR_KEY", + "aws_secret_access_key": "YOUR_SECRET_KEY", + "bucket": "BUCKET_NAME", + "key": "OBJECT_NAME", + "region": "BUCKET_REGION" + } } ``` ### Response: 200 + ```json { - "message": "Starting job with id 062a1892-6a0a-4282-9791-0f4c93b12e16", - "job_id": "062a1892-6a0a-4282-9791-0f4c93b12e16" + "message": "Starting job with id 062a1892-6a0a-4282-9791-0f4c93b12e16", + "job_id": "062a1892-6a0a-4282-9791-0f4c93b12e16" } -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.3/developers/operations-api/clustering.md b/site/versioned_docs/version-4.3/developers/operations-api/clustering.md index 300664c4..fcd1cdda 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/clustering.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/clustering.md @@ -1,429 +1,457 @@ --- -title: Clustering +title: Clustering --- -# Clustering +# Clustering ## Cluster Set Routes + Adds a route/routes to either the hub or leaf server cluster configuration. This operation behaves as a PATCH/upsert, meaning it will add new routes to the configuration while leaving existing routes untouched. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_set_routes` -* server _(required)_ - must always be `hub` or `leaf`, in most cases you should use `hub` here -* routes _(required)_ - must always be an objects array with a host and port: - * host - the host of the remote instance you are clustering to - * port - the clustering port of the remote instance you are clustering to, in most cases this is the value in `clustering.hubServer.cluster.network.port` on the remote instance `harperdb-config.yaml` +- operation _(required)_ - must always be `cluster_set_routes` +- server _(required)_ - must always be `hub` or `leaf`, in most cases you should use `hub` here +- routes _(required)_ - must always be an objects array with a host and port: + - host - the host of the remote instance you are clustering to + - port - the clustering port of the remote instance you are clustering to, in most cases this is the value in `clustering.hubServer.cluster.network.port` on the remote instance `harperdb-config.yaml` ### Body + ```json { - "operation": "cluster_set_routes", - "server": "hub", - "routes": [ - { - "host": "3.22.181.22", - "port": 12345 - }, - { - "host": "3.137.184.8", - "port": 12345 - }, - { - "host": "18.223.239.195", - "port": 12345 - }, - { - "host": "18.116.24.71", - "port": 12345 - } - ] + "operation": "cluster_set_routes", + "server": "hub", + "routes": [ + { + "host": "3.22.181.22", + "port": 12345 + }, + { + "host": "3.137.184.8", + "port": 12345 + }, + { + "host": "18.223.239.195", + "port": 12345 + }, + { + "host": "18.116.24.71", + "port": 12345 + } + ] } ``` ### Response: 200 + ```json { - "message": "cluster routes successfully set", - "set": [ - { - "host": "3.22.181.22", - "port": 12345 - }, - { - "host": "3.137.184.8", - "port": 12345 - }, - { - "host": "18.223.239.195", - "port": 12345 - }, - { - "host": "18.116.24.71", - "port": 12345 - } - ], - "skipped": [] + "message": "cluster routes successfully set", + "set": [ + { + "host": "3.22.181.22", + "port": 12345 + }, + { + "host": "3.137.184.8", + "port": 12345 + }, + { + "host": "18.223.239.195", + "port": 12345 + }, + { + "host": "18.116.24.71", + "port": 12345 + } + ], + "skipped": [] } ``` --- ## Cluster Get Routes + Gets all the hub and leaf server routes from the config file. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_get_routes` +- operation _(required)_ - must always be `cluster_get_routes` ### Body + ```json { - "operation": "cluster_get_routes" + "operation": "cluster_get_routes" } ``` ### Response: 200 + ```json { - "hub": [ - { - "host": "3.22.181.22", - "port": 12345 - }, - { - "host": "3.137.184.8", - "port": 12345 - }, - { - "host": "18.223.239.195", - "port": 12345 - }, - { - "host": "18.116.24.71", - "port": 12345 - } - ], - "leaf": [] + "hub": [ + { + "host": "3.22.181.22", + "port": 12345 + }, + { + "host": "3.137.184.8", + "port": 12345 + }, + { + "host": "18.223.239.195", + "port": 12345 + }, + { + "host": "18.116.24.71", + "port": 12345 + } + ], + "leaf": [] } ``` --- ## Cluster Delete Routes + Removes route(s) from hub and/or leaf server routes array in config file. Returns a deletion success message and arrays of deleted and skipped records. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_delete_routes` -* routes _required_ - Must be an array of route object(s) +- operation _(required)_ - must always be `cluster_delete_routes` +- routes _required_ - Must be an array of route object(s) ### Body ```json { - "operation": "cluster_delete_routes", - "routes": [ - { - "host": "18.116.24.71", - "port": 12345 - } - ] + "operation": "cluster_delete_routes", + "routes": [ + { + "host": "18.116.24.71", + "port": 12345 + } + ] } ``` ### Response: 200 + ```json { - "message": "cluster routes successfully deleted", - "deleted": [ - { - "host": "18.116.24.71", - "port": 12345 - } - ], - "skipped": [] + "message": "cluster routes successfully deleted", + "deleted": [ + { + "host": "18.116.24.71", + "port": 12345 + } + ], + "skipped": [] } ``` - --- ## Add Node + Registers an additional HarperDB instance with associated subscriptions. Learn more about [HarperDB clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_node` -* node_name _(required)_ - the node name of the remote node -* subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: - * schema - the schema to replicate from - * table - the table to replicate from - * subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish - a boolean which determines if transactions on the local table should be replicated on the remote table - * start_time _(optional)_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format - +- operation _(required)_ - must always be `add_node` +- node*name *(required)\_ - the node name of the remote node +- subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: + - schema - the schema to replicate from + - table - the table to replicate from + - subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish - a boolean which determines if transactions on the local table should be replicated on the remote table + - start*time *(optional)\_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format + ### Body + ```json { - "operation": "add_node", - "node_name": "ec2-3-22-181-22", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": false, - "publish": true, - "start_time": "2022-09-02T20:06:35.993Z" - } - ] + "operation": "add_node", + "node_name": "ec2-3-22-181-22", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": false, + "publish": true, + "start_time": "2022-09-02T20:06:35.993Z" + } + ] } ``` ### Response: 200 + ```json { - "message": "Successfully added 'ec2-3-22-181-22' to manifest" + "message": "Successfully added 'ec2-3-22-181-22' to manifest" } ``` --- ## Update Node -Modifies an existing HarperDB instance registration and associated subscriptions. This operation behaves as a PATCH/upsert, meaning it will insert or update the specified replication configurations while leaving other table replication configuration untouched. Learn more about [HarperDB clustering here](../clustering/). + +Modifies an existing HarperDB instance registration and associated subscriptions. This operation behaves as a PATCH/upsert, meaning it will insert or update the specified replication configurations while leaving other table replication configuration untouched. Learn more about [HarperDB clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `update_node` -* node_name _(required)_ - the node name of the remote node you are updating -* subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: - * schema - the schema to replicate from - * table - the table to replicate from - * subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish - a boolean which determines if transactions on the local table should be replicated on the remote table - * start_time _(optional)_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format +- operation _(required)_ - must always be `update_node` +- node*name *(required)\_ - the node name of the remote node you are updating +- subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: + - schema - the schema to replicate from + - table - the table to replicate from + - subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish - a boolean which determines if transactions on the local table should be replicated on the remote table + - start*time *(optional)\_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format ### Body + ```json { - "operation": "update_node", - "node_name": "ec2-18-223-239-195", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": false, - "start_time": "2022-09-02T20:06:35.993Z" - } - ] + "operation": "update_node", + "node_name": "ec2-18-223-239-195", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": false, + "start_time": "2022-09-02T20:06:35.993Z" + } + ] } ``` ### Response: 200 + ```json { - "message": "Successfully updated 'ec2-3-22-181-22'" + "message": "Successfully updated 'ec2-3-22-181-22'" } ``` --- ## Set Node Replication + A more adeptly named alias for add and update node. This operation behaves as a PATCH/upsert, meaning it will insert or update the specified replication configurations while leaving other table replication configuration untouched. The `database` (aka `schema`) parameter is optional, it will default to `data`. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_node_replication` -* node_name _(required)_ - the node name of the remote node you are updating -* subscriptions _(required)_ - The relationship created between nodes. Must be an object array and `table`, `subscribe` and `publish`: - * database *(optional)* - the database to replicate from - * table *(required)* - the table to replicate from - * subscribe *(required)* - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish *(required)* - a boolean which determines if transactions on the local table should be replicated on the remote table -* +- operation _(required)_ - must always be `set_node_replication` +- node*name *(required)\_ - the node name of the remote node you are updating +- subscriptions _(required)_ - The relationship created between nodes. Must be an object array and `table`, `subscribe` and `publish`: + - database _(optional)_ - the database to replicate from + - table _(required)_ - the table to replicate from + - subscribe _(required)_ - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish _(required)_ - a boolean which determines if transactions on the local table should be replicated on the remote table +- + ### Body + ```json { - "operation": "set_node_replication", - "node_name": "node1", - "subscriptions": [ - { - "table": "dog", - "subscribe": true, - "publish": true - } - ] + "operation": "set_node_replication", + "node_name": "node1", + "subscriptions": [ + { + "table": "dog", + "subscribe": true, + "publish": true + } + ] } ``` + ### Response: 200 + ```json { - "message": "Successfully updated 'ec2-3-22-181-22'" + "message": "Successfully updated 'ec2-3-22-181-22'" } ``` --- ## Cluster Status + Returns an array of status objects from a cluster. A status object will contain the clustering node name, whether or not clustering is enabled, and a list of possible connections. Learn more about [HarperDB clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_status` +- operation _(required)_ - must always be `cluster_status` ### Body + ```json { - "operation": "cluster_status" + "operation": "cluster_status" } ``` ### Response: 200 + ```json { - "node_name": "ec2-18-221-143-69", - "is_enabled": true, - "connections": [ - { - "node_name": "ec2-3-22-181-22", - "status": "open", - "ports": { - "clustering": 12345, - "operations_api": 9925 - }, - "latency_ms": 13, - "uptime": "30d 1h 18m 8s", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ] - } - ] + "node_name": "ec2-18-221-143-69", + "is_enabled": true, + "connections": [ + { + "node_name": "ec2-3-22-181-22", + "status": "open", + "ports": { + "clustering": 12345, + "operations_api": 9925 + }, + "latency_ms": 13, + "uptime": "30d 1h 18m 8s", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ] + } + ] } ``` - --- ## Cluster Network + Returns an object array of enmeshed nodes. Each node object will contain the name of the node, the amount of time (in milliseconds) it took for it to respond, the names of the nodes it is enmeshed with and the routes set in its config file. Learn more about [HarperDB clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_- must always be `cluster_network` -* timeout (_optional_) - the amount of time in milliseconds to wait for a response from the network. Must be a number -* connected_nodes (_optional_) - omit `connected_nodes` from the response. Must be a boolean. Defaults to `false` -* routes (_optional_) - omit `routes` from the response. Must be a boolean. Defaults to `false` +- operation _(required)_- must always be `cluster_network` +- timeout (_optional_) - the amount of time in milliseconds to wait for a response from the network. Must be a number +- connected*nodes (\_optional*) - omit `connected_nodes` from the response. Must be a boolean. Defaults to `false` +- routes (_optional_) - omit `routes` from the response. Must be a boolean. Defaults to `false` ### Body ```json { - "operation": "cluster_network" + "operation": "cluster_network" } ``` ### Response: 200 + ```json { - "nodes": [ - { - "name": "local_node", - "response_time": 4, - "connected_nodes": ["ec2-3-142-255-78"], - "routes": [ - { - "host": "3.142.255.78", - "port": 9932 - } - ] - }, - { - "name": "ec2-3-142-255-78", - "response_time": 57, - "connected_nodes": ["ec2-3-12-153-124", "ec2-3-139-236-138", "local_node"], - "routes": [] - } - ] + "nodes": [ + { + "name": "local_node", + "response_time": 4, + "connected_nodes": ["ec2-3-142-255-78"], + "routes": [ + { + "host": "3.142.255.78", + "port": 9932 + } + ] + }, + { + "name": "ec2-3-142-255-78", + "response_time": 57, + "connected_nodes": ["ec2-3-12-153-124", "ec2-3-139-236-138", "local_node"], + "routes": [] + } + ] } ``` --- ## Remove Node + Removes a HarperDB instance and associated subscriptions from the cluster. Learn more about [HarperDB clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `remove_node` -* name _(required)_ - The name of the node you are de-registering +- operation _(required)_ - must always be `remove_node` +- name _(required)_ - The name of the node you are de-registering ### Body + ```json { - "operation": "remove_node", - "node_name": "ec2-3-22-181-22" + "operation": "remove_node", + "node_name": "ec2-3-22-181-22" } ``` ### Response: 200 + ```json { - "message": "Successfully removed 'ec2-3-22-181-22' from manifest" + "message": "Successfully removed 'ec2-3-22-181-22' from manifest" } ``` --- ## Configure Cluster + Bulk create/remove subscriptions for any number of remote nodes. Resets and replaces any existing clustering setup. Learn more about [HarperDB clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `configure_cluster` -* connections _(required)_ - must be an object array with each object containing `node_name` and `subscriptions` for that node +- operation _(required)_ - must always be `configure_cluster` +- connections _(required)_ - must be an object array with each object containing `node_name` and `subscriptions` for that node ### Body + ```json { - "operation": "configure_cluster", - "connections": [ - { - "node_name": "ec2-3-137-184-8", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": false - } - ] - }, - { - "node_name": "ec2-18-223-239-195", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": true - } - ] - } - ] + "operation": "configure_cluster", + "connections": [ + { + "node_name": "ec2-3-137-184-8", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": false + } + ] + }, + { + "node_name": "ec2-18-223-239-195", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": true + } + ] + } + ] } ``` ### Response: 200 + ```json { - "message": "Cluster successfully configured." + "message": "Cluster successfully configured." } ``` @@ -435,23 +463,24 @@ Will purge messages from a stream _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `purge_stream` -* database _(required)_ - the name of the database where the streams table resides -* table _(required)_ - the name of the table that belongs to the stream -* options _(optional)_ - control how many messages get purged. Options are: - * `keep` - purge will keep this many most recent messages - * `seq` - purge all messages up to, but not including, this sequence +- operation _(required)_ - must always be `purge_stream` +- database _(required)_ - the name of the database where the streams table resides +- table _(required)_ - the name of the table that belongs to the stream +- options _(optional)_ - control how many messages get purged. Options are: + - `keep` - purge will keep this many most recent messages + - `seq` - purge all messages up to, but not including, this sequence ### Body + ```json { - "operation": "purge_stream", - "database": "dev", - "table": "dog", - "options": { - "keep": 100 - } + "operation": "purge_stream", + "database": "dev", + "table": "dog", + "options": { + "keep": 100 + } } ``` ---- \ No newline at end of file +--- diff --git a/site/versioned_docs/version-4.3/developers/operations-api/components.md b/site/versioned_docs/version-4.3/developers/operations-api/components.md index 3b5fcd1e..e8c9a236 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/components.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/components.md @@ -10,24 +10,28 @@ Creates a new component project in the component root directory using a predefin _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_component` -* project _(required)_ - the name of the project you wish to create +- operation _(required)_ - must always be `add_component` +- project _(required)_ - the name of the project you wish to create ### Body + ```json { - "operation": "add_component", - "project": "my-component" + "operation": "add_component", + "project": "my-component" } ``` ### Response: 200 + ```json { - "message": "Successfully added project: my-component" + "message": "Successfully added project: my-component" } ``` + --- + ## Deploy Component Will deploy a component using either a base64-encoded string representation of a `.tar` file (the output from `package_component`) or a package value, which can be any valid NPM reference, such as a GitHub repo, an NPM package, a tarball, a local directory or a website.\ @@ -35,52 +39,61 @@ Will deploy a component using either a base64-encoded string representation of a If deploying with the `payload` option, HarperDB will decrypt the base64-encoded string, reconstitute the .tar file of your project folder, and extract it to the component root project directory.\ If deploying with the `package` option, the package value will be written to `harperdb-config.yaml`. Then npm install will be utilized to install the component in the `node_modules` directory located in the hdb root. The value is a package reference, which should generally be a [URL reference, as described here](https://docs.npmjs.com/cli/v10/configuring-npm/package-json#urls-as-dependencies) (it is also possible to include NPM registerd packages and file paths). URL package references can directly reference tarballs that can be installed as a package. However, the most common and recommended usage is to install from a Git repository, which can be combined with a tag to deploy a specific version directly from versioned source control. When using tags, we highly recommend that you use the `semver` directive to ensure consistent and reliable installation by NPM. In addition to tags, you can also reference branches or commit numbers. Here is an example URL package reference to a (public) Git repository that doesn't require authentication: + ``` https://github.com/HarperDB/application-template#semver:v1.0.0 ``` + or this can be shortened to: + ``` HarperDB/application-template#semver:v1.0.0 ``` You can also install from private repository if you have an installed SSH keys on the server: + ``` git+ssh:/git@github.com:my-org/my-app.git#semver:v1.0.0 ``` + Or you can use a Github token: + ``` https://@github.com/my-org/my-app#semver:v1.0.0 ``` + Or you can use a GitLab Project Access Token: + ``` https://my-project:@gitlab.com/my-group/my-project#semver:v1.0.0 ``` + Note that your component will be installed by NPM. If your component has dependencies, NPM will attempt to download and install these as well. NPM normally uses the public registry.npmjs.org registry. If you are installing without network access to this, you may wish to define [custom registry locations](https://docs.npmjs.com/cli/v8/configuring-npm/npmrc) if you have any dependencies that need to be installed. NPM will install the deployed component and any dependencies in node_modules in the hdb root directory (typically `~/hdb/node_modules`). _Note: After deploying a component a restart may be required_ _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `deploy_component` -* project _(required)_ - the name of the project you wish to deploy -* package _(optional)_ - this can be any valid GitHub or NPM reference -* payload _(optional)_ - a base64-encoded string representation of the .tar file. Must be a string +- operation _(required)_ - must always be `deploy_component` +- project _(required)_ - the name of the project you wish to deploy +- package _(optional)_ - this can be any valid GitHub or NPM reference +- payload _(optional)_ - a base64-encoded string representation of the .tar file. Must be a string ### Body ```json { - "operation": "deploy_component", - "project": "my-component", - "payload": "A very large base64-encoded string representation of the .tar file" + "operation": "deploy_component", + "project": "my-component", + "payload": "A very large base64-encoded string representation of the .tar file" } ``` ```json { - "operation": "deploy_component", - "project": "my-component", - "package": "HarperDB/application-template" + "operation": "deploy_component", + "project": "my-component", + "package": "HarperDB/application-template" } ``` @@ -88,27 +101,29 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully deployed: my-component" + "message": "Successfully deployed: my-component" } ``` + --- + ## Package Component Creates a temporary `.tar` file of the specified project folder, then reads it into a base64-encoded string and returns an object with the string and the payload. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `package_component` -* project _(required)_ - the name of the project you wish to package -* skip_node_modules _(optional)_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean +- operation _(required)_ - must always be `package_component` +- project _(required)_ - the name of the project you wish to package +- skip*node_modules *(optional)\_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean ### Body ```json { - "operation": "package_component", - "project": "my-component", - "skip_node_modules": true + "operation": "package_component", + "project": "my-component", + "skip_node_modules": true } ``` @@ -116,11 +131,13 @@ _Operation is restricted to super_user roles only_ ```json { - "project": "my-component", - "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + "project": "my-component", + "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" } ``` + --- + ## Drop Component Deletes a file from inside the component project or deletes the complete project. @@ -129,17 +146,17 @@ Deletes a file from inside the component project or deletes the complete project _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_component` -* project _(required)_ - the name of the project you wish to delete or to delete from if using the `file` parameter -* file _(optional)_ - the path relative to your project folder of the file you wish to delete +- operation _(required)_ - must always be `drop_component` +- project _(required)_ - the name of the project you wish to delete or to delete from if using the `file` parameter +- file _(optional)_ - the path relative to your project folder of the file you wish to delete ### Body ```json { - "operation": "drop_component", - "project": "my-component", - "file": "utils/myUtils.js" + "operation": "drop_component", + "project": "my-component", + "file": "utils/myUtils.js" } ``` @@ -147,23 +164,25 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully dropped: my-component/utils/myUtils.js" + "message": "Successfully dropped: my-component/utils/myUtils.js" } ``` + --- + ## Get Components Gets all local component files and folders and any component config from `harperdb-config.yaml` _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_components` +- operation _(required)_ - must always be `get_components` ### Body ```json { - "operation": "get_components" + "operation": "get_components" } ``` @@ -171,83 +190,85 @@ _Operation is restricted to super_user roles only_ ```json { - "name": "components", - "entries": [ - { - "package": "HarperDB/application-template", - "name": "deploy-test-gh" - }, - { - "package": "@fastify/compress", - "name": "fast-compress" - }, - { - "name": "my-component", - "entries": [ - { - "name": "LICENSE", - "mtime": "2023-08-22T16:00:40.286Z", - "size": 1070 - }, - { - "name": "index.md", - "mtime": "2023-08-22T16:00:40.287Z", - "size": 1207 - }, - { - "name": "config.yaml", - "mtime": "2023-08-22T16:00:40.287Z", - "size": 1069 - }, - { - "name": "package.json", - "mtime": "2023-08-22T16:00:40.288Z", - "size": 145 - }, - { - "name": "resources.js", - "mtime": "2023-08-22T16:00:40.289Z", - "size": 583 - }, - { - "name": "schema.graphql", - "mtime": "2023-08-22T16:00:40.289Z", - "size": 466 - }, - { - "name": "utils", - "entries": [ - { - "name": "commonUtils.js", - "mtime": "2023-08-22T16:00:40.289Z", - "size": 583 - } - ] - } - ] - } - ] + "name": "components", + "entries": [ + { + "package": "HarperDB/application-template", + "name": "deploy-test-gh" + }, + { + "package": "@fastify/compress", + "name": "fast-compress" + }, + { + "name": "my-component", + "entries": [ + { + "name": "LICENSE", + "mtime": "2023-08-22T16:00:40.286Z", + "size": 1070 + }, + { + "name": "index.md", + "mtime": "2023-08-22T16:00:40.287Z", + "size": 1207 + }, + { + "name": "config.yaml", + "mtime": "2023-08-22T16:00:40.287Z", + "size": 1069 + }, + { + "name": "package.json", + "mtime": "2023-08-22T16:00:40.288Z", + "size": 145 + }, + { + "name": "resources.js", + "mtime": "2023-08-22T16:00:40.289Z", + "size": 583 + }, + { + "name": "schema.graphql", + "mtime": "2023-08-22T16:00:40.289Z", + "size": 466 + }, + { + "name": "utils", + "entries": [ + { + "name": "commonUtils.js", + "mtime": "2023-08-22T16:00:40.289Z", + "size": 583 + } + ] + } + ] + } + ] } ``` + --- + ## Get Component File Gets the contents of a file inside a component project. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_component_file` -* project _(required)_ - the name of the project where the file is located -* file _(required)_ - the path relative to your project folder of the file you wish to view -* encoding _(optional)_ - the encoding that will be passed to the read file call. Defaults to `utf8` +- operation _(required)_ - must always be `get_component_file` +- project _(required)_ - the name of the project where the file is located +- file _(required)_ - the path relative to your project folder of the file you wish to view +- encoding _(optional)_ - the encoding that will be passed to the read file call. Defaults to `utf8` ### Body ```json { - "operation": "get_component_file", - "project": "my-component", - "file": "resources.js" + "operation": "get_component_file", + "project": "my-component", + "file": "resources.js" } ``` @@ -255,30 +276,32 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "/**export class MyCustomResource extends tables.TableName {\n\t/ we can define our own custom POST handler\n\tpost(content) {\n\t\t/ do something with the incoming content;\n\t\treturn super.post(content);\n\t}\n\t/ or custom GET handler\n\tget() {\n\t\t/ we can modify this resource before returning\n\t\treturn super.get();\n\t}\n}\n */\n/ we can also define a custom resource without a specific table\nexport class Greeting extends Resource {\n\t/ a \"Hello, world!\" handler\n\tget() {\n\t\treturn { greeting: 'Hello, world!' };\n\t}\n}" + "message": "/**export class MyCustomResource extends tables.TableName {\n\t/ we can define our own custom POST handler\n\tpost(content) {\n\t\t/ do something with the incoming content;\n\t\treturn super.post(content);\n\t}\n\t/ or custom GET handler\n\tget() {\n\t\t/ we can modify this resource before returning\n\t\treturn super.get();\n\t}\n}\n */\n/ we can also define a custom resource without a specific table\nexport class Greeting extends Resource {\n\t/ a \"Hello, world!\" handler\n\tget() {\n\t\treturn { greeting: 'Hello, world!' };\n\t}\n}" } ``` + --- + ## Set Component File Creates or updates a file inside a component project. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_component_file` -* project _(required)_ - the name of the project the file is located in -* file _(required)_ - the path relative to your project folder of the file you wish to set -* payload _(required)_ - what will be written to the file -* encoding _(optional)_ - the encoding that will be passed to the write file call. Defaults to `utf8` +- operation _(required)_ - must always be `set_component_file` +- project _(required)_ - the name of the project the file is located in +- file _(required)_ - the path relative to your project folder of the file you wish to set +- payload _(required)_ - what will be written to the file +- encoding _(optional)_ - the encoding that will be passed to the write file call. Defaults to `utf8` ### Body ```json { - "operation": "set_component_file", - "project": "my-component", - "file": "test.js", - "payload": "console.log('hello world')" + "operation": "set_component_file", + "project": "my-component", + "file": "test.js", + "payload": "console.log('hello world')" } ``` @@ -286,6 +309,6 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully set component: test.js" + "message": "Successfully set component: test.js" } ``` diff --git a/site/versioned_docs/version-4.3/developers/operations-api/custom-functions.md b/site/versioned_docs/version-4.3/developers/operations-api/custom-functions.md index e6e8ef11..86f76157 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/custom-functions.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/custom-functions.md @@ -10,21 +10,23 @@ Returns the state of the Custom functions server. This includes whether it is en _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `custom_function_status` +- operation _(required)_ - must always be `custom_function_status` ### Body + ```json { - "operation": "custom_functions_status" + "operation": "custom_functions_status" } ``` ### Response: 200 + ```json { - "is_enabled": true, - "port": 9926, - "directory": "/Users/myuser/hdb/custom_functions" + "is_enabled": true, + "port": 9926, + "directory": "/Users/myuser/hdb/custom_functions" } ``` @@ -36,13 +38,13 @@ Returns an array of projects within the Custom Functions root project directory. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_custom_functions` +- operation _(required)_ - must always be `get_custom_functions` ### Body ```json { - "operation": "get_custom_functions" + "operation": "get_custom_functions" } ``` @@ -50,11 +52,11 @@ _Operation is restricted to super_user roles only_ ```json { - "dogs": { - "routes": ["examples"], - "helpers":["example"], - "static":3 - } + "dogs": { + "routes": ["examples"], + "helpers": ["example"], + "static": 3 + } } ``` @@ -66,19 +68,19 @@ Returns the content of the specified file as text. HarperDB Studio uses this cal _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_custom_function` -* project _(required)_ - the name of the project containing the file for which you wish to get content -* type _(required)_ - the name of the sub-folder containing the file for which you wish to get content - must be either routes or helpers -* file _(required)_ - The name of the file for which you wish to get content - should not include the file extension (which is always .js) +- operation _(required)_ - must always be `get_custom_function` +- project _(required)_ - the name of the project containing the file for which you wish to get content +- type _(required)_ - the name of the sub-folder containing the file for which you wish to get content - must be either routes or helpers +- file _(required)_ - The name of the file for which you wish to get content - should not include the file extension (which is always .js) ### Body ```json { - "operation": "get_custom_function", - "project": "dogs", - "type": "helpers", - "file": "example" + "operation": "get_custom_function", + "project": "dogs", + "type": "helpers", + "file": "example" } ``` @@ -86,7 +88,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" + "message": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" } ``` @@ -98,21 +100,21 @@ Updates the content of the specified file. HarperDB Studio uses this call to sav _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_custom_function` -* project _(required)_ - the name of the project containing the file for which you wish to set content -* type _(required)_ - the name of the sub-folder containing the file for which you wish to set content - must be either routes or helpers -* file _(required)_ - the name of the file for which you wish to set content - should not include the file extension (which is always .js) -* function_content _(required)_ - the content you wish to save into the specified file +- operation _(required)_ - must always be `set_custom_function` +- project _(required)_ - the name of the project containing the file for which you wish to set content +- type _(required)_ - the name of the sub-folder containing the file for which you wish to set content - must be either routes or helpers +- file _(required)_ - the name of the file for which you wish to set content - should not include the file extension (which is always .js) +- function*content *(required)\_ - the content you wish to save into the specified file ### Body ```json { - "operation": "set_custom_function", - "project": "dogs", - "type": "helpers", - "file": "example", - "function_content": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" + "operation": "set_custom_function", + "project": "dogs", + "type": "helpers", + "file": "example", + "function_content": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" } ``` @@ -120,7 +122,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully updated custom function: example.js" + "message": "Successfully updated custom function: example.js" } ``` @@ -132,19 +134,19 @@ Deletes the specified file. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_custom_function` -* project _(required)_ - the name of the project containing the file you wish to delete -* type _(required)_ - the name of the sub-folder containing the file you wish to delete. Must be either routes or helpers -* file _(required)_ - the name of the file you wish to delete. Should not include the file extension (which is always .js) +- operation _(required)_ - must always be `drop_custom_function` +- project _(required)_ - the name of the project containing the file you wish to delete +- type _(required)_ - the name of the sub-folder containing the file you wish to delete. Must be either routes or helpers +- file _(required)_ - the name of the file you wish to delete. Should not include the file extension (which is always .js) ### Body ```json { - "operation": "drop_custom_function", - "project": "dogs", - "type": "helpers", - "file": "example" + "operation": "drop_custom_function", + "project": "dogs", + "type": "helpers", + "file": "example" } ``` @@ -152,7 +154,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message":"Successfully deleted custom function: example.js" + "message": "Successfully deleted custom function: example.js" } ``` @@ -164,15 +166,15 @@ Creates a new project folder in the Custom Functions root project directory. It _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_custom_function_project` -* project _(required)_ - the name of the project you wish to create +- operation _(required)_ - must always be `add_custom_function_project` +- project _(required)_ - the name of the project you wish to create ### Body ```json { - "operation": "add_custom_function_project", - "project": "dogs" + "operation": "add_custom_function_project", + "project": "dogs" } ``` @@ -180,7 +182,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message":"Successfully created custom function project: dogs" + "message": "Successfully created custom function project: dogs" } ``` @@ -192,15 +194,15 @@ Deletes the specified project folder and all of its contents. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_custom_function_project` -* project _(required)_ - the name of the project you wish to delete +- operation _(required)_ - must always be `drop_custom_function_project` +- project _(required)_ - the name of the project you wish to delete ### Body ```json { - "operation": "drop_custom_function_project", - "project": "dogs" + "operation": "drop_custom_function_project", + "project": "dogs" } ``` @@ -208,7 +210,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully deleted project: dogs" + "message": "Successfully deleted project: dogs" } ``` @@ -220,17 +222,17 @@ Creates a .tar file of the specified project folder, then reads it into a base64 _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `package_custom_function_project` -* project _(required)_ - the name of the project you wish to package up for deployment -* skip_node_modules _(optional)_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean. +- operation _(required)_ - must always be `package_custom_function_project` +- project _(required)_ - the name of the project you wish to package up for deployment +- skip*node_modules *(optional)\_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean. ### Body ```json { - "operation": "package_custom_function_project", - "project": "dogs", - "skip_node_modules": true + "operation": "package_custom_function_project", + "project": "dogs", + "skip_node_modules": true } ``` @@ -238,9 +240,9 @@ _Operation is restricted to super_user roles only_ ```json { - "project": "dogs", - "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", - "file": "/tmp/d27f1154-5d82-43f0-a5fb-a3018f366081.tar" + "project": "dogs", + "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "file": "/tmp/d27f1154-5d82-43f0-a5fb-a3018f366081.tar" } ``` @@ -252,18 +254,17 @@ Takes the output of package_custom_function_project, decrypts the base64-encoded _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `deploy_custom_function_project` -* project _(required)_ - the name of the project you wish to deploy. Must be a string -* payload _(required)_ - a base64-encoded string representation of the .tar file. Must be a string - +- operation _(required)_ - must always be `deploy_custom_function_project` +- project _(required)_ - the name of the project you wish to deploy. Must be a string +- payload _(required)_ - a base64-encoded string representation of the .tar file. Must be a string ### Body ```json { - "operation": "deploy_custom_function_project", - "project": "dogs", - "payload": "A very large base64-encoded string represenation of the .tar file" + "operation": "deploy_custom_function_project", + "project": "dogs", + "payload": "A very large base64-encoded string represenation of the .tar file" } ``` @@ -271,6 +272,6 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully deployed project: dogs" + "message": "Successfully deployed project: dogs" } ``` diff --git a/site/versioned_docs/version-4.3/developers/operations-api/databases-and-tables.md b/site/versioned_docs/version-4.3/developers/operations-api/databases-and-tables.md index 68f30089..ec9b7d8c 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/databases-and-tables.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/databases-and-tables.md @@ -1,362 +1,386 @@ --- -title: Databases and Tables +title: Databases and Tables --- -# Databases and Tables +# Databases and Tables ## Describe All + Returns the definitions of all databases and tables within the database. Record counts about 5000 records are estimated, as determining the exact count can be expensive. When the record count is estimated, this is indicated by the inclusion of a confidence interval of `estimated_record_range`. If you need the exact count, you can include an `"exact_count": true` in the operation, but be aware that this requires a full table scan (may be expensive). -* operation _(required)_ - must always be `describe_all` +- operation _(required)_ - must always be `describe_all` ### Body + ```json { - "operation": "describe_all" + "operation": "describe_all" } ``` ### Response: 200 + ```json { - "dev": { - "dog": { - "schema": "dev", - "name": "dog", - "hash_attribute": "id", - "audit": true, - "schema_defined": false, - "attributes": [ - { - "attribute": "id", - "indexed": true, - "is_primary_key": true - }, - { - "attribute": "__createdtime__", - "indexed": true - }, - { - "attribute": "__updatedtime__", - "indexed": true - }, - { - "attribute": "type", - "indexed": true - } - ], - "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", - "record_count": 4000, - "estimated_record_range": [3976, 4033], - "last_updated_record": 1697658683698.4504 - } - } + "dev": { + "dog": { + "schema": "dev", + "name": "dog", + "hash_attribute": "id", + "audit": true, + "schema_defined": false, + "attributes": [ + { + "attribute": "id", + "indexed": true, + "is_primary_key": true + }, + { + "attribute": "__createdtime__", + "indexed": true + }, + { + "attribute": "__updatedtime__", + "indexed": true + }, + { + "attribute": "type", + "indexed": true + } + ], + "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", + "record_count": 4000, + "estimated_record_range": [3976, 4033], + "last_updated_record": 1697658683698.4504 + } + } } ``` --- ## Describe database + Returns the definitions of all tables within the specified database. -* operation _(required)_ - must always be `describe_database` -* database _(optional)_ - database where the table you wish to describe lives. The default is `data` +- operation _(required)_ - must always be `describe_database` +- database _(optional)_ - database where the table you wish to describe lives. The default is `data` ### Body + ```json { - "operation": "describe_database", - "database": "dev" + "operation": "describe_database", + "database": "dev" } ``` ### Response: 200 + ```json { - "dog": { - "schema": "dev", - "name": "dog", - "hash_attribute": "id", - "audit": true, - "schema_defined": false, - "attributes": [ - { - "attribute": "id", - "indexed": true, - "is_primary_key": true - }, - { - "attribute": "__createdtime__", - "indexed": true - }, - { - "attribute": "__updatedtime__", - "indexed": true - }, - { - "attribute": "type", - "indexed": true - } - ], - "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", - "record_count": 4000, - "estimated_record_range": [3976, 4033], - "last_updated_record": 1697658683698.4504 - } + "dog": { + "schema": "dev", + "name": "dog", + "hash_attribute": "id", + "audit": true, + "schema_defined": false, + "attributes": [ + { + "attribute": "id", + "indexed": true, + "is_primary_key": true + }, + { + "attribute": "__createdtime__", + "indexed": true + }, + { + "attribute": "__updatedtime__", + "indexed": true + }, + { + "attribute": "type", + "indexed": true + } + ], + "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", + "record_count": 4000, + "estimated_record_range": [3976, 4033], + "last_updated_record": 1697658683698.4504 + } } ``` --- ## Describe Table + Returns the definition of the specified table. -* operation _(required)_ - must always be `describe_table` -* table _(required)_ - table you wish to describe -* database _(optional)_ - database where the table you wish to describe lives. The default is `data` +- operation _(required)_ - must always be `describe_table` +- table _(required)_ - table you wish to describe +- database _(optional)_ - database where the table you wish to describe lives. The default is `data` ### Body + ```json { - "operation": "describe_table", - "table": "dog" + "operation": "describe_table", + "table": "dog" } ``` ### Response: 200 + ```json { - "schema": "dev", - "name": "dog", - "hash_attribute": "id", - "audit": true, - "schema_defined": false, - "attributes": [ - { - "attribute": "id", - "indexed": true, - "is_primary_key": true - }, - { - "attribute": "__createdtime__", - "indexed": true - }, - { - "attribute": "__updatedtime__", - "indexed": true - }, - { - "attribute": "type", - "indexed": true - } - ], - "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", - "record_count": 4000, - "estimated_record_range": [3976, 4033], - "last_updated_record": 1697658683698.4504 + "schema": "dev", + "name": "dog", + "hash_attribute": "id", + "audit": true, + "schema_defined": false, + "attributes": [ + { + "attribute": "id", + "indexed": true, + "is_primary_key": true + }, + { + "attribute": "__createdtime__", + "indexed": true + }, + { + "attribute": "__updatedtime__", + "indexed": true + }, + { + "attribute": "type", + "indexed": true + } + ], + "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", + "record_count": 4000, + "estimated_record_range": [3976, 4033], + "last_updated_record": 1697658683698.4504 } ``` --- ## Create database + Create a new database. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `create_database` -* database _(optional)_ - name of the database you are creating. The default is `data` +- operation _(required)_ - must always be `create_database` +- database _(optional)_ - name of the database you are creating. The default is `data` ### Body + ```json { - "operation": "create_database", - "database": "dev" + "operation": "create_database", + "database": "dev" } ``` ### Response: 200 + ```json { - "message": "database 'dev' successfully created" + "message": "database 'dev' successfully created" } ``` --- ## Drop database + Drop an existing database. NOTE: Dropping a database will delete all tables and all of their records in that database. _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `drop_database` -* database _(required)_ - name of the database you are dropping +- operation _(required)_ - this should always be `drop_database` +- database _(required)_ - name of the database you are dropping ### Body + ```json { - "operation": "drop_database", - "database": "dev" + "operation": "drop_database", + "database": "dev" } ``` ### Response: 200 + ```json { - "message": "successfully deleted 'dev'" + "message": "successfully deleted 'dev'" } ``` --- ## Create Table + Create a new table within a database. _Operation is restricted to super_user roles only_ - -* operation _(required)_ - must always be `create_table` -* database _(optional)_ - name of the database where you want your table to live. If the database does not exist, it will be created. If the `database` property is not provided it will default to `data`. -* table _(required)_ - name of the table you are creating -* primary_key _(required)_ - primary key for the table -* attributes _(optional)_ - an array of attributes that specifies the schema for the table, that is the set of attributes for the table. When attributes are supplied the table will not be considered a "dynamic schema" table, and attributes will not be auto-added when records with new properties are inserted. Each attribute is specified as: - * name _(required)_ - the name of the attribute - * indexed _(optional)_ - indicates if the attribute should be indexed - * type _(optional)_ - specifies the data type of the attribute (can be String, Int, Float, Date, ID, Any) -* expiration _(optional)_ - specifies the time-to-live or expiration of records in the table before they are evicted (records are not evicted on any timer if not specified). This is specified in seconds. +- operation _(required)_ - must always be `create_table` +- database _(optional)_ - name of the database where you want your table to live. If the database does not exist, it will be created. If the `database` property is not provided it will default to `data`. +- table _(required)_ - name of the table you are creating +- primary*key *(required)\_ - primary key for the table +- attributes _(optional)_ - an array of attributes that specifies the schema for the table, that is the set of attributes for the table. When attributes are supplied the table will not be considered a "dynamic schema" table, and attributes will not be auto-added when records with new properties are inserted. Each attribute is specified as: + - name _(required)_ - the name of the attribute + - indexed _(optional)_ - indicates if the attribute should be indexed + - type _(optional)_ - specifies the data type of the attribute (can be String, Int, Float, Date, ID, Any) +- expiration _(optional)_ - specifies the time-to-live or expiration of records in the table before they are evicted (records are not evicted on any timer if not specified). This is specified in seconds. ### Body + ```json { - "operation": "create_table", - "database": "dev", - "table": "dog", - "primary_key": "id" + "operation": "create_table", + "database": "dev", + "table": "dog", + "primary_key": "id" } ``` ### Response: 200 + ```json { - "message": "table 'dev.dog' successfully created." + "message": "table 'dev.dog' successfully created." } ``` --- ## Drop Table + Drop an existing database table. NOTE: Dropping a table will delete all associated records in that table. _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `drop_table` -* database _(optional)_ - database where the table you are dropping lives. The default is `data` -* table _(required)_ - name of the table you are dropping +- operation _(required)_ - this should always be `drop_table` +- database _(optional)_ - database where the table you are dropping lives. The default is `data` +- table _(required)_ - name of the table you are dropping ### Body ```json { - "operation": "drop_table", - "database": "dev", - "table": "dog" + "operation": "drop_table", + "database": "dev", + "table": "dog" } ``` ### Response: 200 + ```json { - "message": "successfully deleted table 'dev.dog'" + "message": "successfully deleted table 'dev.dog'" } ``` --- -## Create Attribute +## Create Attribute + Create a new attribute within the specified table. **The create_attribute operation can be used for admins wishing to pre-define database values for setting role-based permissions or for any other reason.** _Note: HarperDB will automatically create new attributes on insert and update if they do not already exist within the database._ -* operation _(required)_ - must always be `create_attribute` -* database _(optional)_ - name of the database of the table you want to add your attribute. The default is `data` -* table _(required)_ - name of the table where you want to add your attribute to live -* attribute _(required)_ - name for the attribute +- operation _(required)_ - must always be `create_attribute` +- database _(optional)_ - name of the database of the table you want to add your attribute. The default is `data` +- table _(required)_ - name of the table where you want to add your attribute to live +- attribute _(required)_ - name for the attribute ### Body + ```json { - "operation": "create_attribute", - "database": "dev", - "table": "dog", - "attribute": "is_adorable" + "operation": "create_attribute", + "database": "dev", + "table": "dog", + "attribute": "is_adorable" } ``` ### Response: 200 + ```json { - "message": "inserted 1 of 1 records", - "skipped_hashes": [], - "inserted_hashes": [ - "383c0bef-5781-4e1c-b5c8-987459ad0831" - ] + "message": "inserted 1 of 1 records", + "skipped_hashes": [], + "inserted_hashes": ["383c0bef-5781-4e1c-b5c8-987459ad0831"] } ``` --- ## Drop Attribute + Drop an existing attribute from the specified table. NOTE: Dropping an attribute will delete all associated attribute values in that table. _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `drop_attribute` -* database _(optional)_ - database where the table you are dropping lives. The default is `data` -* table _(required)_ - table where the attribute you are dropping lives -* attribute _(required)_ - attribute that you intend to drop +- operation _(required)_ - this should always be `drop_attribute` +- database _(optional)_ - database where the table you are dropping lives. The default is `data` +- table _(required)_ - table where the attribute you are dropping lives +- attribute _(required)_ - attribute that you intend to drop ### Body ```json { - "operation": "drop_attribute", - "database": "dev", - "table": "dog", - "attribute": "is_adorable" + "operation": "drop_attribute", + "database": "dev", + "table": "dog", + "attribute": "is_adorable" } ``` ### Response: 200 + ```json { - "message": "successfully deleted attribute 'is_adorable'" + "message": "successfully deleted attribute 'is_adorable'" } ``` --- ## Get Backup + This will return a snapshot of the requested database. This provides a means for backing up the database through the operations API. The response will be the raw database file (in binary format), which can later be restored as a database file by copying into the appropriate hdb/databases directory (with HarperDB not running). The returned file is a snapshot of the database at the moment in time that the get_backup operation begins. This also supports backing up individual tables in a database. However, this is a more expensive operation than backing up a database in whole, and will lose any transactional atomicity between writes across tables, so generally it is recommended that you backup the entire database. It is important to note that trying to copy a database file that is in use (HarperDB actively running and writing to the file) using standard file copying tools is not safe (the copied file will likely be corrupt), which is why using this snapshot operation is recommended for backups (volume snapshots are also a good way to backup HarperDB databases). _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `get_backup` -* database _(required)_ - this is the database that will be snapshotted and returned -* table _(optional)_ - this will specify a specific table to backup -* tables _(optional)_ - this will specify a specific set of tables to backup +- operation _(required)_ - this should always be `get_backup` +- database _(required)_ - this is the database that will be snapshotted and returned +- table _(optional)_ - this will specify a specific table to backup +- tables _(optional)_ - this will specify a specific set of tables to backup ### Body ```json { - "operation": "get_backup", - "database": "dev" + "operation": "get_backup", + "database": "dev" } ``` ### Response: 200 + ``` The database in raw binary data format ``` diff --git a/site/versioned_docs/version-4.3/developers/operations-api/index.md b/site/versioned_docs/version-4.3/developers/operations-api/index.md index e0f26443..44350290 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/index.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/index.md @@ -19,20 +19,20 @@ Content-Type: application/json The operations API reference is available below and categorized by topic: -* [Quick Start Examples](./quickstart-examples) -* [Databases and Tables](./databases-and-tables) -* [NoSQL Operations](./nosql-operations) -* [Bulk Operations](./bulk-operations) -* [Users and Roles](./users-and-roles) -* [Clustering](./clustering) -* [Components](./components) -* [Registration](./registration) -* [Jobs](./jobs) -* [Logs](./logs) -* [Utilities](./utilities) -* [Token Authentication](./token-authentication) -* [SQL Operations](./sql-operations) -* [Advanced JSON SQL Examples](./advanced-json-sql-examples) +- [Quick Start Examples](./quickstart-examples) +- [Databases and Tables](./databases-and-tables) +- [NoSQL Operations](./nosql-operations) +- [Bulk Operations](./bulk-operations) +- [Users and Roles](./users-and-roles) +- [Clustering](./clustering) +- [Components](./components) +- [Registration](./registration) +- [Jobs](./jobs) +- [Logs](./logs) +- [Utilities](./utilities) +- [Token Authentication](./token-authentication) +- [SQL Operations](./sql-operations) +- [Advanced JSON SQL Examples](./advanced-json-sql-examples) • [Past Release API Documentation](https://olddocs.harperdb.io) diff --git a/site/versioned_docs/version-4.3/developers/operations-api/jobs.md b/site/versioned_docs/version-4.3/developers/operations-api/jobs.md index 8b05357f..173125a1 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/jobs.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/jobs.md @@ -1,82 +1,87 @@ --- -title: Jobs +title: Jobs --- -# Jobs +# Jobs ## Get Job + Returns job status, metrics, and messages for the specified job ID. -* operation _(required)_ - must always be `get_job` -* id _(required)_ - the id of the job you wish to view +- operation _(required)_ - must always be `get_job` +- id _(required)_ - the id of the job you wish to view ### Body ```json { - "operation": "get_job", - "id": "4a982782-929a-4507-8794-26dae1132def" + "operation": "get_job", + "id": "4a982782-929a-4507-8794-26dae1132def" } ``` ### Response: 200 + ```json [ - { - "__createdtime__": 1611615798782, - "__updatedtime__": 1611615801207, - "created_datetime": 1611615798774, - "end_datetime": 1611615801206, - "id": "4a982782-929a-4507-8794-26dae1132def", - "job_body": null, - "message": "successfully loaded 350 of 350 records", - "start_datetime": 1611615798805, - "status": "COMPLETE", - "type": "csv_url_load", - "user": "HDB_ADMIN", - "start_datetime_converted": "2021-01-25T23:03:18.805Z", - "end_datetime_converted": "2021-01-25T23:03:21.206Z" - } + { + "__createdtime__": 1611615798782, + "__updatedtime__": 1611615801207, + "created_datetime": 1611615798774, + "end_datetime": 1611615801206, + "id": "4a982782-929a-4507-8794-26dae1132def", + "job_body": null, + "message": "successfully loaded 350 of 350 records", + "start_datetime": 1611615798805, + "status": "COMPLETE", + "type": "csv_url_load", + "user": "HDB_ADMIN", + "start_datetime_converted": "2021-01-25T23:03:18.805Z", + "end_datetime_converted": "2021-01-25T23:03:21.206Z" + } ] ``` --- ## Search Jobs By Start Date + Returns a list of job statuses, metrics, and messages for all jobs executed within the specified time window. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `search_jobs_by_start_date` -* from_date _(required)_ - the date you wish to start the search -* to_date _(required)_ - the date you wish to end the search +- operation _(required)_ - must always be `search_jobs_by_start_date` +- from*date *(required)\_ - the date you wish to start the search +- to*date *(required)\_ - the date you wish to end the search ### Body + ```json { - "operation": "search_jobs_by_start_date", - "from_date": "2021-01-25T22:05:27.464+0000", - "to_date": "2021-01-25T23:05:27.464+0000" + "operation": "search_jobs_by_start_date", + "from_date": "2021-01-25T22:05:27.464+0000", + "to_date": "2021-01-25T23:05:27.464+0000" } ``` ### Response: 200 + ```json [ - { - "id": "942dd5cb-2368-48a5-8a10-8770ff7eb1f1", - "user": "HDB_ADMIN", - "type": "csv_url_load", - "status": "COMPLETE", - "start_datetime": 1611613284781, - "end_datetime": 1611613287204, - "job_body": null, - "message": "successfully loaded 350 of 350 records", - "created_datetime": 1611613284764, - "__createdtime__": 1611613284767, - "__updatedtime__": 1611613287207, - "start_datetime_converted": "2021-01-25T22:21:24.781Z", - "end_datetime_converted": "2021-01-25T22:21:27.204Z" - } + { + "id": "942dd5cb-2368-48a5-8a10-8770ff7eb1f1", + "user": "HDB_ADMIN", + "type": "csv_url_load", + "status": "COMPLETE", + "start_datetime": 1611613284781, + "end_datetime": 1611613287204, + "job_body": null, + "message": "successfully loaded 350 of 350 records", + "created_datetime": 1611613284764, + "__createdtime__": 1611613284767, + "__updatedtime__": 1611613287207, + "start_datetime_converted": "2021-01-25T22:21:24.781Z", + "end_datetime_converted": "2021-01-25T22:21:27.204Z" + } ] -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.3/developers/operations-api/logs.md b/site/versioned_docs/version-4.3/developers/operations-api/logs.md index 82b7d252..06ad5555 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/logs.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/logs.md @@ -1,33 +1,34 @@ --- -title: Logs +title: Logs --- -# Logs +# Logs ## Read HarperDB Log + Returns log outputs from the primary HarperDB log based on the provided search criteria. Read more about HarperDB logging here: [https://docs.harperdb.io/docs/logging#read-logs-via-the-api](https://docs.harperdb.io/docs/logging#read-logs-via-the-api). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_Log` -* start _(optional)_ - result to start with. Default is 0, the first log in `hdb.log`. Must be a number -* limit _(optional)_ - number of results returned. Default behavior is 1000. Must be a number -* level _(optional)_ - error level to filter on. Default behavior is all levels. Must be `notify`, `error`, `warn`, `info`, `debug` or `trace` -* from _(optional)_ - date to begin showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss`. Default is first log in `hdb.log` -* until _(optional)_ - date to end showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss`. Default is last log in `hdb.log` -* order _(optional)_ - order to display logs desc or asc by timestamp. By default, will maintain `hdb.log` order +- operation _(required)_ - must always be `read_Log` +- start _(optional)_ - result to start with. Default is 0, the first log in `hdb.log`. Must be a number +- limit _(optional)_ - number of results returned. Default behavior is 1000. Must be a number +- level _(optional)_ - error level to filter on. Default behavior is all levels. Must be `notify`, `error`, `warn`, `info`, `debug` or `trace` +- from _(optional)_ - date to begin showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss`. Default is first log in `hdb.log` +- until _(optional)_ - date to end showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss`. Default is last log in `hdb.log` +- order _(optional)_ - order to display logs desc or asc by timestamp. By default, will maintain `hdb.log` order ### Body ```json { - "operation": "read_log", - "start": 0, - "limit": 1000, - "level": "error", - "from": "2021-01-25T22:05:27.464+0000", - "until": "2021-01-25T23:05:27.464+0000", - "order": "desc" + "operation": "read_log", + "start": 0, + "limit": 1000, + "level": "error", + "from": "2021-01-25T22:05:27.464+0000", + "until": "2021-01-25T23:05:27.464+0000", + "order": "desc" } ``` @@ -35,29 +36,28 @@ _Operation is restricted to super_user roles only_ ```json [ - { - "level": "notify", - "message": "Connected to cluster server.", - "timestamp": "2021-01-25T23:03:20.710Z", - "thread": "main/0", - "tags": [] - }, - { - "level": "warn", - "message": "Login failed", - "timestamp": "2021-01-25T22:24:45.113Z", - "thread": "http/9", - "tags": [] - }, - { - "level": "error", - "message": "unknown attribute 'name and breed'", - "timestamp": "2021-01-25T22:23:24.167Z", - "thread": "http/9", - "tags": [] - } + { + "level": "notify", + "message": "Connected to cluster server.", + "timestamp": "2021-01-25T23:03:20.710Z", + "thread": "main/0", + "tags": [] + }, + { + "level": "warn", + "message": "Login failed", + "timestamp": "2021-01-25T22:24:45.113Z", + "thread": "http/9", + "tags": [] + }, + { + "level": "error", + "message": "unknown attribute 'name and breed'", + "timestamp": "2021-01-25T22:23:24.167Z", + "thread": "http/9", + "tags": [] + } ] - ``` --- @@ -68,23 +68,23 @@ Returns all transactions logged for the specified database table. You may filter _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_transaction_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* from _(optional)_ - time format must be millisecond-based epoch in UTC -* to _(optional)_ - time format must be millisecond-based epoch in UTC -* limit _(optional)_ - max number of logs you want to receive. Must be a number +- operation _(required)_ - must always be `read_transaction_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- from _(optional)_ - time format must be millisecond-based epoch in UTC +- to _(optional)_ - time format must be millisecond-based epoch in UTC +- limit _(optional)_ - max number of logs you want to receive. Must be a number ### Body ```json { - "operation": "read_transaction_log", - "schema": "dev", - "table": "dog", - "from": 1560249020865, - "to": 1660585656639, - "limit": 10 + "operation": "read_transaction_log", + "schema": "dev", + "table": "dog", + "from": 1560249020865, + "to": 1660585656639, + "limit": 10 } ``` @@ -92,174 +92,174 @@ _Operation is restricted to super_user roles only_ ```json [ - { - "operation": "insert", - "user": "admin", - "timestamp": 1660165619736, - "records": [ - { - "id": 1, - "dog_name": "Penny", - "owner_name": "Kyle", - "breed_id": 154, - "age": 7, - "weight_lbs": 38, - "__updatedtime__": 1660165619688, - "__createdtime__": 1660165619688 - } - ] - }, - { - "operation": "insert", - "user": "admin", - "timestamp": 1660165619813, - "records": [ - { - "id": 2, - "dog_name": "Harper", - "owner_name": "Stephen", - "breed_id": 346, - "age": 7, - "weight_lbs": 55, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 3, - "dog_name": "Alby", - "owner_name": "Kaylan", - "breed_id": 348, - "age": 7, - "weight_lbs": 84, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 4, - "dog_name": "Billy", - "owner_name": "Zach", - "breed_id": 347, - "age": 6, - "weight_lbs": 60, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 5, - "dog_name": "Rose Merry", - "owner_name": "Zach", - "breed_id": 348, - "age": 8, - "weight_lbs": 15, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 6, - "dog_name": "Kato", - "owner_name": "Kyle", - "breed_id": 351, - "age": 6, - "weight_lbs": 32, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 7, - "dog_name": "Simon", - "owner_name": "Fred", - "breed_id": 349, - "age": 3, - "weight_lbs": 35, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 8, - "dog_name": "Gemma", - "owner_name": "Stephen", - "breed_id": 350, - "age": 5, - "weight_lbs": 55, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 9, - "dog_name": "Yeti", - "owner_name": "Jaxon", - "breed_id": 200, - "age": 5, - "weight_lbs": 55, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 10, - "dog_name": "Monkey", - "owner_name": "Aron", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 11, - "dog_name": "Bode", - "owner_name": "Margo", - "breed_id": 104, - "age": 8, - "weight_lbs": 75, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 12, - "dog_name": "Tucker", - "owner_name": "David", - "breed_id": 346, - "age": 2, - "weight_lbs": 60, - "adorable": true, - "__updatedtime__": 1660165619798, - "__createdtime__": 1660165619798 - }, - { - "id": 13, - "dog_name": "Jagger", - "owner_name": "Margo", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true, - "__updatedtime__": 1660165619798, - "__createdtime__": 1660165619798 - } - ] - }, - { - "operation": "update", - "user": "admin", - "timestamp": 1660165620040, - "records": [ - { - "id": 1, - "dog_name": "Penny B", - "__updatedtime__": 1660165620036 - } - ] - } + { + "operation": "insert", + "user": "admin", + "timestamp": 1660165619736, + "records": [ + { + "id": 1, + "dog_name": "Penny", + "owner_name": "Kyle", + "breed_id": 154, + "age": 7, + "weight_lbs": 38, + "__updatedtime__": 1660165619688, + "__createdtime__": 1660165619688 + } + ] + }, + { + "operation": "insert", + "user": "admin", + "timestamp": 1660165619813, + "records": [ + { + "id": 2, + "dog_name": "Harper", + "owner_name": "Stephen", + "breed_id": 346, + "age": 7, + "weight_lbs": 55, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 3, + "dog_name": "Alby", + "owner_name": "Kaylan", + "breed_id": 348, + "age": 7, + "weight_lbs": 84, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 4, + "dog_name": "Billy", + "owner_name": "Zach", + "breed_id": 347, + "age": 6, + "weight_lbs": 60, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 5, + "dog_name": "Rose Merry", + "owner_name": "Zach", + "breed_id": 348, + "age": 8, + "weight_lbs": 15, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 6, + "dog_name": "Kato", + "owner_name": "Kyle", + "breed_id": 351, + "age": 6, + "weight_lbs": 32, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 7, + "dog_name": "Simon", + "owner_name": "Fred", + "breed_id": 349, + "age": 3, + "weight_lbs": 35, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 8, + "dog_name": "Gemma", + "owner_name": "Stephen", + "breed_id": 350, + "age": 5, + "weight_lbs": 55, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 9, + "dog_name": "Yeti", + "owner_name": "Jaxon", + "breed_id": 200, + "age": 5, + "weight_lbs": 55, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 10, + "dog_name": "Monkey", + "owner_name": "Aron", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 11, + "dog_name": "Bode", + "owner_name": "Margo", + "breed_id": 104, + "age": 8, + "weight_lbs": 75, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 12, + "dog_name": "Tucker", + "owner_name": "David", + "breed_id": 346, + "age": 2, + "weight_lbs": 60, + "adorable": true, + "__updatedtime__": 1660165619798, + "__createdtime__": 1660165619798 + }, + { + "id": 13, + "dog_name": "Jagger", + "owner_name": "Margo", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true, + "__updatedtime__": 1660165619798, + "__createdtime__": 1660165619798 + } + ] + }, + { + "operation": "update", + "user": "admin", + "timestamp": 1660165620040, + "records": [ + { + "id": 1, + "dog_name": "Penny B", + "__updatedtime__": 1660165620036 + } + ] + } ] ``` @@ -271,19 +271,19 @@ Deletes transaction log data for the specified database table that is older than _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_transaction_log_before` -* schema _(required)_ - schema under which the transaction log resides. Must be a string -* table _(required)_ - table under which the transaction log resides. Must be a string -* timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC +- operation _(required)_ - must always be `delete_transaction_log_before` +- schema _(required)_ - schema under which the transaction log resides. Must be a string +- table _(required)_ - table under which the transaction log resides. Must be a string +- timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC ### Body ```json { - "operation": "delete_transaction_logs_before", - "schema": "dev", - "table": "dog", - "timestamp": 1598290282817 + "operation": "delete_transaction_logs_before", + "schema": "dev", + "table": "dog", + "timestamp": 1598290282817 } ``` @@ -291,7 +291,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Starting job with id 26a6d3a6-6d77-40f9-bee7-8d6ef479a126" + "message": "Starting job with id 26a6d3a6-6d77-40f9-bee7-8d6ef479a126" } ``` @@ -303,19 +303,19 @@ AuditLog must be enabled in the HarperDB configuration file to make this request _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search_type _(optional)_ - possibilities are `hash_value`, `timestamp` and `username` -* search_values _(optional)_ - an array of string or numbers relating to search_type +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search*type *(optional)\_ - possibilities are `hash_value`, `timestamp` and `username` +- search*values *(optional)\_ - an array of string or numbers relating to search_type ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog" + "operation": "read_audit_log", + "schema": "dev", + "table": "dog" } ``` @@ -323,78 +323,70 @@ _Operation is restricted to super_user roles only_ ```json [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585716133.01, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660585740558.415, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "fur_type": "coarse", - "__updatedtime__": 1660585740556 - } - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "delete", - "user_name": "admin", - "timestamp": 1660585759710.56, - "hash_values": [ - 444 - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585740556, - "__createdtime__": 1660585716128, - "fur_type": "coarse" - } - ] - } + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "hash_values": [318], + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585716133.01, + "hash_values": [444], + "records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660585740558.415, + "hash_values": [444], + "records": [ + { + "id": 444, + "fur_type": "coarse", + "__updatedtime__": 1660585740556 + } + ], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "delete", + "user_name": "admin", + "timestamp": 1660585759710.56, + "hash_values": [444], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585740556, + "__createdtime__": 1660585716128, + "fur_type": "coarse" + } + ] + } ] ``` @@ -406,27 +398,24 @@ AuditLog must be enabled in the HarperDB configuration file to make this request _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search_type _(optional)_ - timestamp -* search_values _(optional)_ - an array containing a maximum of two values [`from_timestamp`, `to_timestamp`] defining the range of transactions you would like to view. - * Timestamp format is millisecond-based epoch in UTC - * If no items are supplied then all transactions are returned - * If only one entry is supplied then all transactions after the supplied timestamp will be returned +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search*type *(optional)\_ - timestamp +- search*values *(optional)\_ - an array containing a maximum of two values [`from_timestamp`, `to_timestamp`] defining the range of transactions you would like to view. + - Timestamp format is millisecond-based epoch in UTC + - If no items are supplied then all transactions are returned + - If only one entry is supplied then all transactions after the supplied timestamp will be returned ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "timestamp", - "search_values": [ - 1660585740558, - 1660585759710.56 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "timestamp", + "search_values": [1660585740558, 1660585759710.56] } ``` @@ -434,101 +423,91 @@ _Operation is restricted to super_user roles only_ ```json [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585716133.01, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660585740558.415, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "fur_type": "coarse", - "__updatedtime__": 1660585740556 - } - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "delete", - "user_name": "admin", - "timestamp": 1660585759710.56, - "hash_values": [ - 444 - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585740556, - "__createdtime__": 1660585716128, - "fur_type": "coarse" - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660586298457.224, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "fur_type": "super fluffy", - "__updatedtime__": 1660586298455 - } - ], - "original_records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - } + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "hash_values": [318], + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585716133.01, + "hash_values": [444], + "records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660585740558.415, + "hash_values": [444], + "records": [ + { + "id": 444, + "fur_type": "coarse", + "__updatedtime__": 1660585740556 + } + ], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "delete", + "user_name": "admin", + "timestamp": 1660585759710.56, + "hash_values": [444], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585740556, + "__createdtime__": 1660585716128, + "fur_type": "coarse" + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660586298457.224, + "hash_values": [318], + "records": [ + { + "id": 318, + "fur_type": "super fluffy", + "__updatedtime__": 1660586298455 + } + ], + "original_records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + } ] ``` @@ -540,23 +519,21 @@ AuditLog must be enabled in the HarperDB configuration file to make this request _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search_type _(optional)_ - username -* search_values _(optional)_ - the HarperDB user for whom you would like to view transactions +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search*type *(optional)\_ - username +- search*values *(optional)\_ - the HarperDB user for whom you would like to view transactions ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "username", - "search_values": [ - "admin" - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "username", + "search_values": ["admin"] } ``` @@ -564,103 +541,93 @@ _Operation is restricted to super_user roles only_ ```json { - "admin": [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585716133.01, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660585740558.415, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "fur_type": "coarse", - "__updatedtime__": 1660585740556 - } - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "delete", - "user_name": "admin", - "timestamp": 1660585759710.56, - "hash_values": [ - 444 - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585740556, - "__createdtime__": 1660585716128, - "fur_type": "coarse" - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660586298457.224, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "fur_type": "super fluffy", - "__updatedtime__": 1660586298455 - } - ], - "original_records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - } - ] + "admin": [ + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "hash_values": [318], + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585716133.01, + "hash_values": [444], + "records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660585740558.415, + "hash_values": [444], + "records": [ + { + "id": 444, + "fur_type": "coarse", + "__updatedtime__": 1660585740556 + } + ], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "delete", + "user_name": "admin", + "timestamp": 1660585759710.56, + "hash_values": [444], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585740556, + "__createdtime__": 1660585716128, + "fur_type": "coarse" + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660586298457.224, + "hash_values": [318], + "records": [ + { + "id": 318, + "fur_type": "super fluffy", + "__updatedtime__": 1660586298455 + } + ], + "original_records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + } + ] } ``` @@ -672,94 +639,94 @@ AuditLog must be enabled in the HarperDB configuration file to make this request _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search_type _(optional)_ - hash_value -* search_values _(optional)_ - an array of hash_attributes for which you wish to see transaction logs +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search*type *(optional)\_ - hash_value +- search*values *(optional)\_ - an array of hash_attributes for which you wish to see transaction logs ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "hash_value", - "search_values": [ - 318 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "hash_value", + "search_values": [318] } ``` ### Response: 200 + ```json { - "318": [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660586298457.224, - "records": [ - { - "id": 318, - "fur_type": "super fluffy", - "__updatedtime__": 1660586298455 - } - ], - "original_records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - } - ] + "318": [ + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660586298457.224, + "records": [ + { + "id": 318, + "fur_type": "super fluffy", + "__updatedtime__": 1660586298455 + } + ], + "original_records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + } + ] } ``` --- ## Delete Audit Logs Before + AuditLog must be enabled in the HarperDB configuration file to make this request. Deletes audit log data for the specified database table that is older than the specified timestamp. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_audit_logs_before` -* schema _(required)_ - schema under which the transaction log resides. Must be a string -* table _(required)_ - table under which the transaction log resides. Must be a string -* timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC +- operation _(required)_ - must always be `delete_audit_logs_before` +- schema _(required)_ - schema under which the transaction log resides. Must be a string +- table _(required)_ - table under which the transaction log resides. Must be a string +- timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC ### Body + ```json { - "operation": "delete_audit_logs_before", - "schema": "dev", - "table": "dog", - "timestamp": 1660585759710.56 + "operation": "delete_audit_logs_before", + "schema": "dev", + "table": "dog", + "timestamp": 1660585759710.56 } ``` ### Response: 200 + ```json { - "message": "Starting job with id 7479e5f8-a86e-4fc9-add7-749493bc100f" + "message": "Starting job with id 7479e5f8-a86e-4fc9-add7-749493bc100f" } ``` - - diff --git a/site/versioned_docs/version-4.3/developers/operations-api/nosql-operations.md b/site/versioned_docs/version-4.3/developers/operations-api/nosql-operations.md index 47db9d1e..ddaa421d 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/nosql-operations.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/nosql-operations.md @@ -8,32 +8,32 @@ title: NoSQL Operations Adds one or more rows of data to a database table. Primary keys of the inserted JSON record may be supplied on insert. If a primary key is not provided, then a GUID will be generated for each record. -* operation _(required)_ - must always be `insert` -* database _(optional)_ - database where the table you are inserting records into lives. The default is `data` -* table _(required)_ - table where you want to insert records -* records _(required)_ - array of one or more records for insert +- operation _(required)_ - must always be `insert` +- database _(optional)_ - database where the table you are inserting records into lives. The default is `data` +- table _(required)_ - table where you want to insert records +- records _(required)_ - array of one or more records for insert ### Body ```json { - "operation": "insert", - "database": "dev", - "table": "dog", - "records": [ - { - "id": 8, - "dog_name": "Harper", - "breed_id": 346, - "age": 7 - }, - { - "id": 9, - "dog_name": "Penny", - "breed_id": 154, - "age": 7 - } - ] + "operation": "insert", + "database": "dev", + "table": "dog", + "records": [ + { + "id": 8, + "dog_name": "Harper", + "breed_id": 346, + "age": 7 + }, + { + "id": 9, + "dog_name": "Penny", + "breed_id": 154, + "age": 7 + } + ] } ``` @@ -41,12 +41,9 @@ Adds one or more rows of data to a database table. Primary keys of the inserted ```json { - "message": "inserted 2 of 2 records", - "inserted_hashes": [ - 8, - 9 - ], - "skipped_hashes": [] + "message": "inserted 2 of 2 records", + "inserted_hashes": [8, 9], + "skipped_hashes": [] } ``` @@ -56,29 +53,29 @@ Adds one or more rows of data to a database table. Primary keys of the inserted Changes the values of specified attributes in one or more rows in a database table as identified by the primary key. NOTE: Primary key of the updated JSON record(s) MUST be supplied on update. -* operation _(required)_ - must always be `update` -* database _(optional)_ - database of the table you are updating records in. The default is `data` -* table _(required)_ - table where you want to update records -* records _(required)_ - array of one or more records for update +- operation _(required)_ - must always be `update` +- database _(optional)_ - database of the table you are updating records in. The default is `data` +- table _(required)_ - table where you want to update records +- records _(required)_ - array of one or more records for update ### Body ```json { - "operation": "update", - "database": "dev", - "table": "dog", - "records": [ - { - "id": 1, - "weight_lbs": 55 - }, - { - "id": 2, - "owner": "Kyle B", - "weight_lbs": 35 - } - ] + "operation": "update", + "database": "dev", + "table": "dog", + "records": [ + { + "id": 1, + "weight_lbs": 55 + }, + { + "id": 2, + "owner": "Kyle B", + "weight_lbs": 35 + } + ] } ``` @@ -86,12 +83,9 @@ Changes the values of specified attributes in one or more rows in a database tab ```json { - "message": "updated 2 of 2 records", - "update_hashes": [ - 1, - 3 - ], - "skipped_hashes": [] + "message": "updated 2 of 2 records", + "update_hashes": [1, 3], + "skipped_hashes": [] } ``` @@ -101,37 +95,37 @@ Changes the values of specified attributes in one or more rows in a database tab Changes the values of specified attributes for rows with matching primary keys that exist in the table. Adds rows to the database table for primary keys that do not exist or are not provided. -* operation _(required)_ - must always be `upsert` -* database _(optional)_ - database of the table you are updating records in. The default is `data` -* table _(required)_ - table where you want to update records -* records _(required)_ - array of one or more records for update +- operation _(required)_ - must always be `upsert` +- database _(optional)_ - database of the table you are updating records in. The default is `data` +- table _(required)_ - table where you want to update records +- records _(required)_ - array of one or more records for update ### Body ```json { - "operation": "upsert", - "database": "dev", - "table": "dog", - "records": [ - { - "id": 8, - "weight_lbs": 155 - }, - { - "name": "Bill", - "breed": "Pit Bull", - "id": 10, - "Age": 11, - "weight_lbs": 155 - }, - { - "name": "Harper", - "breed": "Mutt", - "age": 5, - "weight_lbs": 155 - } - ] + "operation": "upsert", + "database": "dev", + "table": "dog", + "records": [ + { + "id": 8, + "weight_lbs": 155 + }, + { + "name": "Bill", + "breed": "Pit Bull", + "id": 10, + "Age": 11, + "weight_lbs": 155 + }, + { + "name": "Harper", + "breed": "Mutt", + "age": 5, + "weight_lbs": 155 + } + ] } ``` @@ -139,12 +133,8 @@ Changes the values of specified attributes for rows with matching primary keys t ```json { - "message": "upserted 3 of 3 records", - "upserted_hashes": [ - 8, - 10, - "ea06fc8e-717b-4c6c-b69d-b29014054ab7" - ] + "message": "upserted 3 of 3 records", + "upserted_hashes": [8, 10, "ea06fc8e-717b-4c6c-b69d-b29014054ab7"] } ``` @@ -154,22 +144,19 @@ Changes the values of specified attributes for rows with matching primary keys t Removes one or more rows of data from a specified table. -* operation _(required)_ - must always be `delete` -* database _(optional)_ - database where the table you are deleting records lives. The default is `data` -* table _(required)_ - table where you want to deleting records -* ids _(required)_ - array of one or more primary key values, which identifies records to delete +- operation _(required)_ - must always be `delete` +- database _(optional)_ - database where the table you are deleting records lives. The default is `data` +- table _(required)_ - table where you want to deleting records +- ids _(required)_ - array of one or more primary key values, which identifies records to delete ### Body ```json { - "operation": "delete", - "database": "dev", - "table": "dog", - "ids": [ - 1, - 2 - ] + "operation": "delete", + "database": "dev", + "table": "dog", + "ids": [1, 2] } ``` @@ -177,12 +164,9 @@ Removes one or more rows of data from a specified table. ```json { - "message": "2 of 2 records successfully deleted", - "deleted_hashes": [ - 1, - 2 - ], - "skipped_hashes": [] + "message": "2 of 2 records successfully deleted", + "deleted_hashes": [1, 2], + "skipped_hashes": [] } ``` @@ -192,27 +176,21 @@ Removes one or more rows of data from a specified table. Returns data from a table for one or more primary keys. -* operation _(required)_ - must always be `search_by_id` -* database _(optional)_ - database where the table you are searching lives. The default is `data` -* table _(required)_ - table you wish to search -* ids _(required)_ - array of primary keys to retrieve -* get_attributes _(required)_ - define which attributes you want returned. _Use `['*']` to return all attributes_ +- operation _(required)_ - must always be `search_by_id` +- database _(optional)_ - database where the table you are searching lives. The default is `data` +- table _(required)_ - table you wish to search +- ids _(required)_ - array of primary keys to retrieve +- get*attributes *(required)_ - define which attributes you want returned. \_Use `['*']` to return all attributes_ ### Body ```json { - "operation": "search_by_id", - "database": "dev", - "table": "dog", - "ids": [ - 1, - 2 - ], - "get_attributes": [ - "dog_name", - "breed_id" - ] + "operation": "search_by_id", + "database": "dev", + "table": "dog", + "ids": [1, 2], + "get_attributes": ["dog_name", "breed_id"] } ``` @@ -220,14 +198,14 @@ Returns data from a table for one or more primary keys. ```json [ - { - "dog_name": "Penny", - "breed_id": 154 - }, - { - "dog_name": "Harper", - "breed_id": 346 - } + { + "dog_name": "Penny", + "breed_id": 154 + }, + { + "dog_name": "Harper", + "breed_id": 346 + } ] ``` @@ -237,26 +215,23 @@ Returns data from a table for one or more primary keys. Returns data from a table for a matching value. -* operation _(required)_ - must always be `search_by_value` -* database _(optional)_ - database where the table you are searching lives. The default is `data` -* table _(required)_ - table you wish to search -* search_attribute _(required)_ - attribute you wish to search can be any attribute -* search_value _(required)_ - value you wish to search - wild cards are allowed -* get_attributes _(required)_ - define which attributes you want returned. Use `['*']` to return all attributes +- operation _(required)_ - must always be `search_by_value` +- database _(optional)_ - database where the table you are searching lives. The default is `data` +- table _(required)_ - table you wish to search +- search*attribute *(required)\_ - attribute you wish to search can be any attribute +- search*value *(required)\_ - value you wish to search - wild cards are allowed +- get*attributes *(required)\_ - define which attributes you want returned. Use `['*']` to return all attributes ### Body ```json { - "operation": "search_by_value", - "database": "dev", - "table": "dog", - "search_attribute": "owner_name", - "search_value": "Ky*", - "get_attributes": [ - "id", - "dog_name" - ] + "operation": "search_by_value", + "database": "dev", + "table": "dog", + "search_attribute": "owner_name", + "search_value": "Ky*", + "get_attributes": ["id", "dog_name"] } ``` @@ -264,12 +239,12 @@ Returns data from a table for a matching value. ```json [ - { - "dog_name": "Penny" - }, - { - "dog_name": "Kato" - } + { + "dog_name": "Penny" + }, + { + "dog_name": "Kato" + } ] ``` @@ -279,74 +254,70 @@ Returns data from a table for a matching value. Returns data from a table for one or more matching conditions. This supports grouping of conditions to indicate order of operations as well. -* operation _(required)_ - must always be `search_by_conditions` -* database _(optional)_ - database where the table you are searching lives. The default is `data` -* table _(required)_ - table you wish to search -* operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` -* offset _(optional)_ - the number of records that the query results will skip. The default is `0` -* limit _(optional)_ - the number of records that the query results will include. The default is `null`, resulting in no limit -* sort _optional_ - This is an object that indicates the sort order. It has the following properties: - * attribute _(required)_ - The attribute to sort by - * descending _(optional)_ - If true, will sort in descending order (defaults to ascending order) - * next _(optional)_ - This can define the next sort object that will be used to break ties for sorting when there are multiple records with the same value for the first attribute (follows the same structure as `sort`, and can recursive additional attributes). -* get_attributes _(required)_ - define which attributes you want returned. Use `['*']` to return all attributes -* conditions _(required)_ - the array of conditions objects, specified below, to filter by. Must include one or more object in the array that are a condition or a grouped set of conditions. A condition has the following properties: - * search_attribute _(required)_ - the attribute you wish to search, can be any attribute - * search_type _(required)_ - the type of search to perform - `equals`, `contains`, `starts_with`, `ends_with`, `greater_than`, `greater_than_equal`, `less_than`, `less_than_equal`, `between` - * search_value _(required)_ - case-sensitive value you wish to search. If the `search_type` is `between` then use an array of two values to search between - Or a set of grouped conditions has the following properties: - * operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` - * conditions _(required)_ - the array of conditions objects as described above. +- operation _(required)_ - must always be `search_by_conditions` +- database _(optional)_ - database where the table you are searching lives. The default is `data` +- table _(required)_ - table you wish to search +- operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` +- offset _(optional)_ - the number of records that the query results will skip. The default is `0` +- limit _(optional)_ - the number of records that the query results will include. The default is `null`, resulting in no limit +- sort _optional_ - This is an object that indicates the sort order. It has the following properties: + - attribute _(required)_ - The attribute to sort by + - descending _(optional)_ - If true, will sort in descending order (defaults to ascending order) + - next _(optional)_ - This can define the next sort object that will be used to break ties for sorting when there are multiple records with the same value for the first attribute (follows the same structure as `sort`, and can recursive additional attributes). +- get*attributes *(required)\_ - define which attributes you want returned. Use `['*']` to return all attributes +- conditions _(required)_ - the array of conditions objects, specified below, to filter by. Must include one or more object in the array that are a condition or a grouped set of conditions. A condition has the following properties: + - search*attribute *(required)\_ - the attribute you wish to search, can be any attribute + - search*type *(required)\_ - the type of search to perform - `equals`, `contains`, `starts_with`, `ends_with`, `greater_than`, `greater_than_equal`, `less_than`, `less_than_equal`, `between` + - search*value *(required)\_ - case-sensitive value you wish to search. If the `search_type` is `between` then use an array of two values to search between + Or a set of grouped conditions has the following properties: + - operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` + - conditions _(required)_ - the array of conditions objects as described above. + ### Body ```json { - "operation": "search_by_conditions", - "database": "dev", - "table": "dog", - "operator": "and", - "offset": 0, - "limit": 10, - "sort": { - "attribute": "id", - "next": { - "dog_name": "age", - "descending": true - } - }, - "get_attributes": [ - "*" - ], - "conditions": [ - { - "search_attribute": "age", - "search_type": "between", - "search_value": [ - 5, - 8 - ] - }, - { - "search_attribute": "weight_lbs", - "search_type": "greater_than", - "search_value": 40 - }, - { - "operator": "or", - "conditions": [ - { - "search_attribute": "adorable", - "search_type": "equals", - "search_value": true - }, - { - "search_attribute": "lovable", - "search_type": "equals", - "search_value": true - } - ] - } - ] + "operation": "search_by_conditions", + "database": "dev", + "table": "dog", + "operator": "and", + "offset": 0, + "limit": 10, + "sort": { + "attribute": "id", + "next": { + "dog_name": "age", + "descending": true + } + }, + "get_attributes": ["*"], + "conditions": [ + { + "search_attribute": "age", + "search_type": "between", + "search_value": [5, 8] + }, + { + "search_attribute": "weight_lbs", + "search_type": "greater_than", + "search_value": 40 + }, + { + "operator": "or", + "conditions": [ + { + "search_attribute": "adorable", + "search_type": "equals", + "search_value": true + }, + { + "search_attribute": "lovable", + "search_type": "equals", + "search_value": true + } + ] + } + ] } ``` @@ -354,60 +325,60 @@ Returns data from a table for one or more matching conditions. This supports gro ```json [ - { - "__createdtime__": 1620227719791, - "__updatedtime__": 1620227719791, - "adorable": true, - "age": 7, - "breed_id": 346, - "dog_name": "Harper", - "id": 2, - "owner_name": "Stephen", - "weight_lbs": 55 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 7, - "breed_id": 348, - "dog_name": "Alby", - "id": 3, - "owner_name": "Kaylan", - "weight_lbs": 84 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 6, - "breed_id": 347, - "dog_name": "Billy", - "id": 4, - "owner_name": "Zach", - "weight_lbs": 60 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 5, - "breed_id": 250, - "dog_name": "Gemma", - "id": 8, - "owner_name": "Stephen", - "weight_lbs": 55 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 8, - "breed_id": 104, - "dog_name": "Bode", - "id": 11, - "owner_name": "Margo", - "weight_lbs": 75 - } + { + "__createdtime__": 1620227719791, + "__updatedtime__": 1620227719791, + "adorable": true, + "age": 7, + "breed_id": 346, + "dog_name": "Harper", + "id": 2, + "owner_name": "Stephen", + "weight_lbs": 55 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 7, + "breed_id": 348, + "dog_name": "Alby", + "id": 3, + "owner_name": "Kaylan", + "weight_lbs": 84 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 6, + "breed_id": 347, + "dog_name": "Billy", + "id": 4, + "owner_name": "Zach", + "weight_lbs": 60 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 5, + "breed_id": 250, + "dog_name": "Gemma", + "id": 8, + "owner_name": "Stephen", + "weight_lbs": 55 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 8, + "breed_id": 104, + "dog_name": "Bode", + "id": 11, + "owner_name": "Margo", + "weight_lbs": 75 + } ] ``` diff --git a/site/versioned_docs/version-4.3/developers/operations-api/quickstart-examples.md b/site/versioned_docs/version-4.3/developers/operations-api/quickstart-examples.md index e007f35c..4d41ab4c 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/quickstart-examples.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/quickstart-examples.md @@ -4,13 +4,13 @@ title: Quick Start Examples # Quick Start Examples -HarperDB recommends utilizing [HarperDB Applications](../../developers/applications/) for defining databases, tables, and other functionality. However, this guide is a great way to get started using on the HarperDB Operations API. +HarperDB recommends utilizing [HarperDB Applications](../../developers/applications/) for defining databases, tables, and other functionality. However, this guide is a great way to get started using on the HarperDB Operations API. ## Create dog Table We first need to create a table. Since our company is named after our CEO's dog, lets create a table to store all our employees' dogs. We'll call this table, `dogs`. -Tables in HarperDB are schema-less, so we don't need to add any attributes other than a primary_key (in pre 4.2 versions this was referred to as the hash_attribute) to create this table. +Tables in HarperDB are schema-less, so we don't need to add any attributes other than a primary_key (in pre 4.2 versions this was referred to as the hash_attribute) to create this table. HarperDB does offer a `database` parameter that can be used to hold logical groupings of tables. The parameter is optional and if not provided the operation will default to using a database named `data`. @@ -20,9 +20,9 @@ If you receive an error response, make sure your Basic Authentication user and p ```json { - "operation": "create_table", - "table": "dog", - "primary_key": "id" + "operation": "create_table", + "table": "dog", + "primary_key": "id" } ``` @@ -30,22 +30,23 @@ If you receive an error response, make sure your Basic Authentication user and p ```json { - "message": "table 'data.dog' successfully created." + "message": "table 'data.dog' successfully created." } ``` --- ## Create breed Table + Now that we have a table to store our dog data, we also want to create a table to track known breeds. Just as with the dog table, the only attribute we need to specify is the `primary_key`. ### Body ```json { - "operation": "create_table", - "table": "breed", - "primary_key": "id" + "operation": "create_table", + "table": "breed", + "primary_key": "id" } ``` @@ -53,7 +54,7 @@ Now that we have a table to store our dog data, we also want to create a table t ```json { - "message": "table 'data.breed' successfully created." + "message": "table 'data.breed' successfully created." } ``` @@ -67,18 +68,18 @@ We're ready to add some dog data. Penny is our CTO's pup, so she gets ID 1 or we ```json { - "operation": "insert", - "table": "dog", - "records": [ - { - "id": 1, - "dog_name": "Penny", - "owner_name": "Kyle", - "breed_id": 154, - "age": 7, - "weight_lbs": 38 - } - ] + "operation": "insert", + "table": "dog", + "records": [ + { + "id": 1, + "dog_name": "Penny", + "owner_name": "Kyle", + "breed_id": 154, + "age": 7, + "weight_lbs": 38 + } + ] } ``` @@ -86,11 +87,9 @@ We're ready to add some dog data. Penny is our CTO's pup, so she gets ID 1 or we ```json { - "message": "inserted 1 of 1 records", - "inserted_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "inserted 1 of 1 records", + "inserted_hashes": [1], + "skipped_hashes": [] } ``` @@ -104,118 +103,118 @@ Let's add some more Harper doggies! We can add as many dog objects as we want in ```json { - "operation": "insert", - "table": "dog", - "records": [ - { - "id": 2, - "dog_name": "Harper", - "owner_name": "Stephen", - "breed_id": 346, - "age": 7, - "weight_lbs": 55, - "adorable": true - }, - { - "id": 3, - "dog_name": "Alby", - "owner_name": "Kaylan", - "breed_id": 348, - "age": 7, - "weight_lbs": 84, - "adorable": true - }, - { - "id": 4, - "dog_name": "Billy", - "owner_name": "Zach", - "breed_id": 347, - "age": 6, - "weight_lbs": 60, - "adorable": true - }, - { - "id": 5, - "dog_name": "Rose Merry", - "owner_name": "Zach", - "breed_id": 348, - "age": 8, - "weight_lbs": 15, - "adorable": true - }, - { - "id": 6, - "dog_name": "Kato", - "owner_name": "Kyle", - "breed_id": 351, - "age": 6, - "weight_lbs": 32, - "adorable": true - }, - { - "id": 7, - "dog_name": "Simon", - "owner_name": "Fred", - "breed_id": 349, - "age": 3, - "weight_lbs": 35, - "adorable": true - }, - { - "id": 8, - "dog_name": "Gemma", - "owner_name": "Stephen", - "breed_id": 350, - "age": 5, - "weight_lbs": 55, - "adorable": true - }, - { - "id": 9, - "dog_name": "Yeti", - "owner_name": "Jaxon", - "breed_id": 200, - "age": 5, - "weight_lbs": 55, - "adorable": true - }, - { - "id": 10, - "dog_name": "Monkey", - "owner_name": "Aron", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true - }, - { - "id": 11, - "dog_name": "Bode", - "owner_name": "Margo", - "breed_id": 104, - "age": 8, - "weight_lbs": 75, - "adorable": true - }, - { - "id": 12, - "dog_name": "Tucker", - "owner_name": "David", - "breed_id": 346, - "age": 2, - "weight_lbs": 60, - "adorable": true - }, - { - "id": 13, - "dog_name": "Jagger", - "owner_name": "Margo", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true - } - ] + "operation": "insert", + "table": "dog", + "records": [ + { + "id": 2, + "dog_name": "Harper", + "owner_name": "Stephen", + "breed_id": 346, + "age": 7, + "weight_lbs": 55, + "adorable": true + }, + { + "id": 3, + "dog_name": "Alby", + "owner_name": "Kaylan", + "breed_id": 348, + "age": 7, + "weight_lbs": 84, + "adorable": true + }, + { + "id": 4, + "dog_name": "Billy", + "owner_name": "Zach", + "breed_id": 347, + "age": 6, + "weight_lbs": 60, + "adorable": true + }, + { + "id": 5, + "dog_name": "Rose Merry", + "owner_name": "Zach", + "breed_id": 348, + "age": 8, + "weight_lbs": 15, + "adorable": true + }, + { + "id": 6, + "dog_name": "Kato", + "owner_name": "Kyle", + "breed_id": 351, + "age": 6, + "weight_lbs": 32, + "adorable": true + }, + { + "id": 7, + "dog_name": "Simon", + "owner_name": "Fred", + "breed_id": 349, + "age": 3, + "weight_lbs": 35, + "adorable": true + }, + { + "id": 8, + "dog_name": "Gemma", + "owner_name": "Stephen", + "breed_id": 350, + "age": 5, + "weight_lbs": 55, + "adorable": true + }, + { + "id": 9, + "dog_name": "Yeti", + "owner_name": "Jaxon", + "breed_id": 200, + "age": 5, + "weight_lbs": 55, + "adorable": true + }, + { + "id": 10, + "dog_name": "Monkey", + "owner_name": "Aron", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true + }, + { + "id": 11, + "dog_name": "Bode", + "owner_name": "Margo", + "breed_id": 104, + "age": 8, + "weight_lbs": 75, + "adorable": true + }, + { + "id": 12, + "dog_name": "Tucker", + "owner_name": "David", + "breed_id": 346, + "age": 2, + "weight_lbs": 60, + "adorable": true + }, + { + "id": 13, + "dog_name": "Jagger", + "owner_name": "Margo", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true + } + ] } ``` @@ -223,22 +222,9 @@ Let's add some more Harper doggies! We can add as many dog objects as we want in ```json { - "message": "inserted 12 of 12 records", - "inserted_hashes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13 - ], - "skipped_hashes": [] + "message": "inserted 12 of 12 records", + "inserted_hashes": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], + "skipped_hashes": [] } ``` @@ -254,9 +240,9 @@ Each header in a column will be considered as an attribute, and each row in the ```json { - "operation": "csv_url_load", - "table": "breed", - "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" + "operation": "csv_url_load", + "table": "breed", + "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" } ``` @@ -264,8 +250,8 @@ Each header in a column will be considered as an attribute, and each row in the ```json { - "message": "Starting job with id e77d63b9-70d5-499c-960f-6736718a4369", - "job_id": "e77d63b9-70d5-499c-960f-6736718a4369" + "message": "Starting job with id e77d63b9-70d5-499c-960f-6736718a4369", + "job_id": "e77d63b9-70d5-499c-960f-6736718a4369" } ``` @@ -279,14 +265,14 @@ HarperDB supports NoSQL and SQL commands. We're going to update the dog table to ```json { - "operation": "update", - "table": "dog", - "records": [ - { - "id": 1, - "dog_name": "Penny B" - } - ] + "operation": "update", + "table": "dog", + "records": [ + { + "id": 1, + "dog_name": "Penny B" + } + ] } ``` @@ -294,11 +280,9 @@ HarperDB supports NoSQL and SQL commands. We're going to update the dog table to ```json { - "message": "updated 1 of 1 records", - "update_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "updated 1 of 1 records", + "update_hashes": [1], + "skipped_hashes": [] } ``` @@ -312,8 +296,8 @@ Now we're going to use a simple SQL SELECT call to pull Penny's updated data. No ```json { - "operation": "sql", - "sql": "SELECT * FROM data.dog where id = 1" + "operation": "sql", + "sql": "SELECT * FROM data.dog where id = 1" } ``` @@ -321,17 +305,17 @@ Now we're going to use a simple SQL SELECT call to pull Penny's updated data. No ```json [ - { - "owner_name": "Kyle", - "adorable": null, - "breed_id": 154, - "__updatedtime__": 1610749428575, - "dog_name": "Penny B", - "weight_lbs": 38, - "id": 1, - "age": 7, - "__createdtime__": 1610749386566 - } + { + "owner_name": "Kyle", + "adorable": null, + "breed_id": 154, + "__updatedtime__": 1610749428575, + "dog_name": "Penny B", + "weight_lbs": 38, + "id": 1, + "age": 7, + "__createdtime__": 1610749386566 + } ] ``` @@ -345,8 +329,8 @@ Here's a more complex SQL command joining the breed table with the dog table. We ```json { - "operation": "sql", - "sql": "SELECT d.id, d.dog_name, d.owner_name, b.name, b.section FROM data.dog AS d INNER JOIN data.breed AS b ON d.breed_id = b.id WHERE d.owner_name IN ('Kyle', 'Zach', 'Stephen') AND b.section = 'Mutt' ORDER BY d.dog_name" + "operation": "sql", + "sql": "SELECT d.id, d.dog_name, d.owner_name, b.name, b.section FROM data.dog AS d INNER JOIN data.breed AS b ON d.breed_id = b.id WHERE d.owner_name IN ('Kyle', 'Zach', 'Stephen') AND b.section = 'Mutt' ORDER BY d.dog_name" } ``` @@ -354,34 +338,33 @@ Here's a more complex SQL command joining the breed table with the dog table. We ```json [ - { - "id": 4, - "dog_name": "Billy", - "owner_name": "Zach", - "name": "LABRADOR / GREAT DANE MIX", - "section": "Mutt" - }, - { - "id": 8, - "dog_name": "Gemma", - "owner_name": "Stephen", - "name": "SHORT HAIRED SETTER MIX", - "section": "Mutt" - }, - { - "id": 2, - "dog_name": "Harper", - "owner_name": "Stephen", - "name": "HUSKY MIX", - "section": "Mutt" - }, - { - "id": 5, - "dog_name": "Rose Merry", - "owner_name": "Zach", - "name": "TERRIER MIX", - "section": "Mutt" - } + { + "id": 4, + "dog_name": "Billy", + "owner_name": "Zach", + "name": "LABRADOR / GREAT DANE MIX", + "section": "Mutt" + }, + { + "id": 8, + "dog_name": "Gemma", + "owner_name": "Stephen", + "name": "SHORT HAIRED SETTER MIX", + "section": "Mutt" + }, + { + "id": 2, + "dog_name": "Harper", + "owner_name": "Stephen", + "name": "HUSKY MIX", + "section": "Mutt" + }, + { + "id": 5, + "dog_name": "Rose Merry", + "owner_name": "Zach", + "name": "TERRIER MIX", + "section": "Mutt" + } ] - ``` diff --git a/site/versioned_docs/version-4.3/developers/operations-api/registration.md b/site/versioned_docs/version-4.3/developers/operations-api/registration.md index 53d953af..f31f8370 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/registration.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/registration.md @@ -1,16 +1,17 @@ --- -title: Registration +title: Registration --- -# Registration - +# Registration ## Registration Info + Returns the registration data of the HarperDB instance. -* operation _(required)_ - must always be `registration_info` +- operation _(required)_ - must always be `registration_info` ### Body + ```json { "operation": "registration_info" @@ -18,50 +19,52 @@ Returns the registration data of the HarperDB instance. ``` ### Response: 200 + ```json { - "registered": true, - "version": "4.2.0", - "ram_allocation": 2048, - "license_expiration_date": "2022-01-15" + "registered": true, + "version": "4.2.0", + "ram_allocation": 2048, + "license_expiration_date": "2022-01-15" } ``` --- ## Get Fingerprint + Returns the HarperDB fingerprint, uniquely generated based on the machine, for licensing purposes. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_fingerprint` +- operation _(required)_ - must always be `get_fingerprint` ### Body ```json { - "operation": "get_fingerprint" + "operation": "get_fingerprint" } ``` --- ## Set License + Sets the HarperDB license as generated by HarperDB License Management software. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_license` -* key _(required)_ - your license key -* company _(required)_ - the company that was used in the license +- operation _(required)_ - must always be `set_license` +- key _(required)_ - your license key +- company _(required)_ - the company that was used in the license ### Body ```json { - "operation": "set_license", - "key": "", - "company": "" + "operation": "set_license", + "key": "", + "company": "" } ``` - diff --git a/site/versioned_docs/version-4.3/developers/operations-api/sql-operations.md b/site/versioned_docs/version-4.3/developers/operations-api/sql-operations.md index 5958805e..f5aef46a 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/sql-operations.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/sql-operations.md @@ -1,122 +1,127 @@ --- -title: SQL Operations +title: SQL Operations --- :::warning HarperDB encourages developers to utilize other querying tools over SQL for performance purposes. HarperDB SQL is intended for data investigation purposes and uses cases where performance is not a priority. SQL optimizations are on our roadmap for the future. ::: -# SQL Operations +# SQL Operations ## Select + Executes the provided SQL statement. The SELECT statement is used to query data from the database. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body ```json { - "operation": "sql", - "sql": "SELECT * FROM dev.dog WHERE id = 1" + "operation": "sql", + "sql": "SELECT * FROM dev.dog WHERE id = 1" } ``` ### Response: 200 + ```json [ - { - "id": 1, - "age": 7, - "dog_name": "Penny", - "weight_lbs": 38, - "breed_id": 154, - "owner_name": "Kyle", - "adorable": true, - "__createdtime__": 1611614106043, - "__updatedtime__": 1611614119507 - } + { + "id": 1, + "age": 7, + "dog_name": "Penny", + "weight_lbs": 38, + "breed_id": 154, + "owner_name": "Kyle", + "adorable": true, + "__createdtime__": 1611614106043, + "__updatedtime__": 1611614119507 + } ] ``` --- ## Insert + Executes the provided SQL statement. The INSERT statement is used to add one or more rows to a database table. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body ```json { - "operation": "sql", - "sql": "INSERT INTO dev.dog (id, dog_name) VALUE (22, 'Simon')" + "operation": "sql", + "sql": "INSERT INTO dev.dog (id, dog_name) VALUE (22, 'Simon')" } ``` ### Response: 200 + ```json { - "message": "inserted 1 of 1 records", - "inserted_hashes": [ - 22 - ], - "skipped_hashes": [] + "message": "inserted 1 of 1 records", + "inserted_hashes": [22], + "skipped_hashes": [] } ``` + --- ## Update + Executes the provided SQL statement. The UPDATE statement is used to change the values of specified attributes in one or more rows in a database table. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body + ```json { - "operation": "sql", - "sql": "UPDATE dev.dog SET dog_name = 'penelope' WHERE id = 1" + "operation": "sql", + "sql": "UPDATE dev.dog SET dog_name = 'penelope' WHERE id = 1" } ``` ### Response: 200 + ```json { - "message": "updated 1 of 1 records", - "update_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "updated 1 of 1 records", + "update_hashes": [1], + "skipped_hashes": [] } ``` --- ## Delete + Executes the provided SQL statement. The DELETE statement is used to remove one or more rows of data from a database table. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body + ```json { - "operation": "sql", - "sql": "DELETE FROM dev.dog WHERE id = 1" + "operation": "sql", + "sql": "DELETE FROM dev.dog WHERE id = 1" } ``` ### Response: 200 + ```json { - "message": "1 of 1 record successfully deleted", - "deleted_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "1 of 1 record successfully deleted", + "deleted_hashes": [1], + "skipped_hashes": [] } ``` diff --git a/site/versioned_docs/version-4.3/developers/operations-api/token-authentication.md b/site/versioned_docs/version-4.3/developers/operations-api/token-authentication.md index 161c69b5..b9ff5b31 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/token-authentication.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/token-authentication.md @@ -1,54 +1,60 @@ --- -title: Token Authentication +title: Token Authentication --- -# Token Authentication +# Token Authentication ## Create Authentication Tokens + Creates the tokens needed for authentication: operation & refresh token. _Note - this operation does not require authorization to be set_ -* operation _(required)_ - must always be `create_authentication_tokens` -* username _(required)_ - username of user to generate tokens for -* password _(required)_ - password of user to generate tokens for +- operation _(required)_ - must always be `create_authentication_tokens` +- username _(required)_ - username of user to generate tokens for +- password _(required)_ - password of user to generate tokens for ### Body + ```json { - "operation": "create_authentication_tokens", - "username": "", - "password": "" + "operation": "create_authentication_tokens", + "username": "", + "password": "" } ``` ### Response: 200 + ```json { - "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA1MTUwMzQ5LCJzdWIiOiJvcGVyYXRpb24ifQ.TlV93BqavQVQntXTt_WeY5IjAuCshfd6RzhihLWFWhu1qEKLHdwg9o5Z4ASaNmfuyKBqbFw65IbOYKd348EXeC_T6d0GO3yUhICYWXkqhQnxVW_T-ECKc7m5Bty9HTgfeaJ2e2yW55nbZYWG_gLtNgObUjCziX20-gGGR25sNTRm78mLQPYQkBJph6WXwAuyQrX704h0NfvNqyAZSwjxgtjuuEftTJ7FutLrQSLGIBIYq9nsHrFkheiDSn-C8_WKJ_zATa4YIofjqn9g5wA6o_7kSNaU2-gWnCm_jbcAcfvOmXh6rd89z8pwPqnC0f131qHIBps9UHaC1oozzmu_C6bsg7905OoAdFFY42Vojs98SMbfRApRvwaS4SprBsam3izODNI64ZUBREu3l4SZDalUf2kN8XPVWkI1LKq_mZsdtqr1r11Z9xslI1wVdxjunYeanjBhs7_j2HTX7ieVGn1a23cWceUk8F1HDGe_KEuPQs03R73V8acq_freh-kPhIa4eLqmcHeBw3WcyNGW8GuP8kyQRkGuO5sQSzZqbr_YSbZdSShZWTWDE6RYYC9ZV9KJtHVxhs0hexUpcoqO8OtJocyltRjtDjhSm9oUxszYRaALu-h8YadZT9dEKzsyQIt30d7LS9ETmmGWx4nKSTME2bV21PnDv_rEc5R6gnE", - "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA3NjU1OTQ5LCJzdWIiOiJyZWZyZXNoIn0.znhJhkdSROBPP_GLRzAxYdjgQ3BuqpAbQB7zMSSOQJ3s83HnmZ10Bnpw_3L2aF-tOFgz_t6HUAvn26fNOLsspJD2aOvHPcVS4yLKS5nagpA6ar_pqng9f6Ebfs8ohguLCfHnHRJ8poLxuWRvWW9_9pIlDiwsj4yo3Mbxi3mW8Bbtnk2MwiNHFxTksD12Ne8EWz8q2jic5MjArqBBgR373oYoWU1oxpTM6gIsZCBRowXcc9XFy2vyRoggEUU4ISRFQ4ZY9ayJ-_jleSDCUamJSNQsdb1OUTvc6CxeYlLjCoV0ijRUB6p2XWNVezFhDu8yGqOeyGFJzArhxbVc_pl4UYd5aUVxhrO9DdhG29cY_mHV0FqfXphR9QllK--LJFTP4aFqkCxnVr7HSa17hL0ZVK1HaKrx21PAdCkVNZpD6J3RtRbTkfnIB_C3Be9jhOV3vpTf7ZGn_Bs3CPJi_sL313Z1yKSDAS5rXTPceEOcTPHjzkMP9Wz19KfFq_0kuiZdDmeYNqJeFPAgGJ-S0tO51krzyGqLyCCA32_W104GR8OoQi2gEED6HIx2G0-1rnLnefN6eHQiY5r-Q3Oj9e2y3EvqqgWOmEDw88-SjPTwQVnMbBHYN2RfluU7EmvDh6Saoe79Lhlu8ZeSJ1x6ZgA8-Cirraz1_526Tn8v5FGDfrc" + "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA1MTUwMzQ5LCJzdWIiOiJvcGVyYXRpb24ifQ.TlV93BqavQVQntXTt_WeY5IjAuCshfd6RzhihLWFWhu1qEKLHdwg9o5Z4ASaNmfuyKBqbFw65IbOYKd348EXeC_T6d0GO3yUhICYWXkqhQnxVW_T-ECKc7m5Bty9HTgfeaJ2e2yW55nbZYWG_gLtNgObUjCziX20-gGGR25sNTRm78mLQPYQkBJph6WXwAuyQrX704h0NfvNqyAZSwjxgtjuuEftTJ7FutLrQSLGIBIYq9nsHrFkheiDSn-C8_WKJ_zATa4YIofjqn9g5wA6o_7kSNaU2-gWnCm_jbcAcfvOmXh6rd89z8pwPqnC0f131qHIBps9UHaC1oozzmu_C6bsg7905OoAdFFY42Vojs98SMbfRApRvwaS4SprBsam3izODNI64ZUBREu3l4SZDalUf2kN8XPVWkI1LKq_mZsdtqr1r11Z9xslI1wVdxjunYeanjBhs7_j2HTX7ieVGn1a23cWceUk8F1HDGe_KEuPQs03R73V8acq_freh-kPhIa4eLqmcHeBw3WcyNGW8GuP8kyQRkGuO5sQSzZqbr_YSbZdSShZWTWDE6RYYC9ZV9KJtHVxhs0hexUpcoqO8OtJocyltRjtDjhSm9oUxszYRaALu-h8YadZT9dEKzsyQIt30d7LS9ETmmGWx4nKSTME2bV21PnDv_rEc5R6gnE", + "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA3NjU1OTQ5LCJzdWIiOiJyZWZyZXNoIn0.znhJhkdSROBPP_GLRzAxYdjgQ3BuqpAbQB7zMSSOQJ3s83HnmZ10Bnpw_3L2aF-tOFgz_t6HUAvn26fNOLsspJD2aOvHPcVS4yLKS5nagpA6ar_pqng9f6Ebfs8ohguLCfHnHRJ8poLxuWRvWW9_9pIlDiwsj4yo3Mbxi3mW8Bbtnk2MwiNHFxTksD12Ne8EWz8q2jic5MjArqBBgR373oYoWU1oxpTM6gIsZCBRowXcc9XFy2vyRoggEUU4ISRFQ4ZY9ayJ-_jleSDCUamJSNQsdb1OUTvc6CxeYlLjCoV0ijRUB6p2XWNVezFhDu8yGqOeyGFJzArhxbVc_pl4UYd5aUVxhrO9DdhG29cY_mHV0FqfXphR9QllK--LJFTP4aFqkCxnVr7HSa17hL0ZVK1HaKrx21PAdCkVNZpD6J3RtRbTkfnIB_C3Be9jhOV3vpTf7ZGn_Bs3CPJi_sL313Z1yKSDAS5rXTPceEOcTPHjzkMP9Wz19KfFq_0kuiZdDmeYNqJeFPAgGJ-S0tO51krzyGqLyCCA32_W104GR8OoQi2gEED6HIx2G0-1rnLnefN6eHQiY5r-Q3Oj9e2y3EvqqgWOmEDw88-SjPTwQVnMbBHYN2RfluU7EmvDh6Saoe79Lhlu8ZeSJ1x6ZgA8-Cirraz1_526Tn8v5FGDfrc" } ``` --- ## Refresh Operation Token + This operation creates a new operation token. -* operation _(required)_ - must always be `refresh_operation_token` -* refresh_token _(required)_ - the refresh token that was provided when tokens were created +- operation _(required)_ - must always be `refresh_operation_token` +- refresh*token *(required)\_ - the refresh token that was provided when tokens were created ### Body + ```json { - "operation": "refresh_operation_token", - "refresh_token": "EXISTING_REFRESH_TOKEN" + "operation": "refresh_operation_token", + "refresh_token": "EXISTING_REFRESH_TOKEN" } ``` ### Response: 200 + ```json { - "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6eyJfX2NyZWF0ZWR0aW1lX18iOjE2MDQ1MTc4Nzk1MjMsIl9fdXBkYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMywiYWN0aXZlIjp0cnVlLCJhdXRoX3Rva2VuIjpudWxsLCJyb2xlIjp7Il9fY3JlYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMSwiX191cGRhdGVkdGltZV9fIjoxNjA0NTE3ODc5NTIxLCJpZCI6IjZhYmRjNGJhLWU5MjQtNDlhNi1iOGY0LWM1NWUxYmQ0OTYzZCIsInBlcm1pc3Npb24iOnsic3VwZXJfdXNlciI6dHJ1ZSwic3lzdGVtIjp7InRhYmxlcyI6eyJoZGJfdGFibGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9hdHRyaWJ1dGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9zY2hlbWEiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl91c2VyIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfcm9sZSI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2pvYiI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2xpY2Vuc2UiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9pbmZvIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfbm9kZXMiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl90ZW1wIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119fX19LCJyb2xlIjoic3VwZXJfdXNlciJ9LCJ1c2VybmFtZSI6IkhEQl9BRE1JTiJ9LCJpYXQiOjE2MDUwNjQ0MjMsImV4cCI6MTYwNTE1MDgyMywic3ViIjoib3BlcmF0aW9uIn0.VVZdhlh7_xFEaGPwhAh6VJ1d7eisiF3ok3ZwLTQAMWZB6umb2S7pPSTbXAmqAGHRlFAK3BYfnwT3YWt0gZbHvk24_0x3s_dej3PYJ8khIxzMjqpkR6qSjQIC2dhKqpwRPNtoqW_xnep9L-qf5iPtqkwsqWhF1c5VSN8nFouLWMZSuJ6Mag04soNhFvY0AF6QiTyzajMTb6uurRMWOnxk8hwMrY_5xtupabqtZheXP_0DV8l10B7GFi_oWf_lDLmwRmNbeUfW8ZyCIJMj36bjN3PsfVIxog87SWKKCwbWZWfJWw0KEph-HvU0ay35deyGWPIaDQmujuh2vtz-B0GoIAC58PJdXNyQRzES_nSb6Oqc_wGZsLM6EsNn_lrIp3mK_3a5jirZ8s6Z2SfcYKaLF2hCevdm05gRjFJ6ijxZrUSOR2S415wLxmqCCWCp_-sEUz8erUrf07_aj-Bv99GUub4b_znOsQF3uABKd4KKff2cNSMhAa-6sro5GDRRJg376dcLi2_9HOZbnSo90zrpVq8RNV900aydyzDdlXkZja8jdHBk4mxSSewYBvM7up6I0G4X-ZlzFOp30T7kjdLa6480Qp34iYRMMtq0Htpb5k2jPt8dNFnzW-Q2eRy1wNBbH3cCH0rd7_BIGuTCrl4hGU8QjlBiF7Gj0_-uJYhKnhg" + "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6eyJfX2NyZWF0ZWR0aW1lX18iOjE2MDQ1MTc4Nzk1MjMsIl9fdXBkYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMywiYWN0aXZlIjp0cnVlLCJhdXRoX3Rva2VuIjpudWxsLCJyb2xlIjp7Il9fY3JlYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMSwiX191cGRhdGVkdGltZV9fIjoxNjA0NTE3ODc5NTIxLCJpZCI6IjZhYmRjNGJhLWU5MjQtNDlhNi1iOGY0LWM1NWUxYmQ0OTYzZCIsInBlcm1pc3Npb24iOnsic3VwZXJfdXNlciI6dHJ1ZSwic3lzdGVtIjp7InRhYmxlcyI6eyJoZGJfdGFibGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9hdHRyaWJ1dGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9zY2hlbWEiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl91c2VyIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfcm9sZSI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2pvYiI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2xpY2Vuc2UiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9pbmZvIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfbm9kZXMiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl90ZW1wIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119fX19LCJyb2xlIjoic3VwZXJfdXNlciJ9LCJ1c2VybmFtZSI6IkhEQl9BRE1JTiJ9LCJpYXQiOjE2MDUwNjQ0MjMsImV4cCI6MTYwNTE1MDgyMywic3ViIjoib3BlcmF0aW9uIn0.VVZdhlh7_xFEaGPwhAh6VJ1d7eisiF3ok3ZwLTQAMWZB6umb2S7pPSTbXAmqAGHRlFAK3BYfnwT3YWt0gZbHvk24_0x3s_dej3PYJ8khIxzMjqpkR6qSjQIC2dhKqpwRPNtoqW_xnep9L-qf5iPtqkwsqWhF1c5VSN8nFouLWMZSuJ6Mag04soNhFvY0AF6QiTyzajMTb6uurRMWOnxk8hwMrY_5xtupabqtZheXP_0DV8l10B7GFi_oWf_lDLmwRmNbeUfW8ZyCIJMj36bjN3PsfVIxog87SWKKCwbWZWfJWw0KEph-HvU0ay35deyGWPIaDQmujuh2vtz-B0GoIAC58PJdXNyQRzES_nSb6Oqc_wGZsLM6EsNn_lrIp3mK_3a5jirZ8s6Z2SfcYKaLF2hCevdm05gRjFJ6ijxZrUSOR2S415wLxmqCCWCp_-sEUz8erUrf07_aj-Bv99GUub4b_znOsQF3uABKd4KKff2cNSMhAa-6sro5GDRRJg376dcLi2_9HOZbnSo90zrpVq8RNV900aydyzDdlXkZja8jdHBk4mxSSewYBvM7up6I0G4X-ZlzFOp30T7kjdLa6480Qp34iYRMMtq0Htpb5k2jPt8dNFnzW-Q2eRy1wNBbH3cCH0rd7_BIGuTCrl4hGU8QjlBiF7Gj0_-uJYhKnhg" } ``` diff --git a/site/versioned_docs/version-4.3/developers/operations-api/users-and-roles.md b/site/versioned_docs/version-4.3/developers/operations-api/users-and-roles.md index f5f35d56..908a03b4 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/users-and-roles.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/users-and-roles.md @@ -5,480 +5,504 @@ title: Users and Roles # Users and Roles ## List Roles + Returns a list of all roles. [Learn more about HarperDB roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `list_roles` +- operation _(required)_ - must always be `list_roles` ### Body + ```json { - "operation": "list_roles" + "operation": "list_roles" } ``` ### Response: 200 + ```json [ - { - "__createdtime__": 1611615061106, - "__updatedtime__": 1611615061106, - "id": "05c2ffcd-f780-40b1-9432-cfe8ba5ad890", - "permission": { - "super_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": true, - "insert": true, - "update": true - } - ] - } - } - } - }, - "role": "developer" - }, - { - "__createdtime__": 1610749235614, - "__updatedtime__": 1610749235614, - "id": "136f03fa-a0e9-46c3-bd5d-7f3e7dd5b564", - "permission": { - "cluster_user": true - }, - "role": "cluster_user" - }, - { - "__createdtime__": 1610749235609, - "__updatedtime__": 1610749235609, - "id": "745b3138-a7cf-455a-8256-ac03722eef12", - "permission": { - "super_user": true - }, - "role": "super_user" - } + { + "__createdtime__": 1611615061106, + "__updatedtime__": 1611615061106, + "id": "05c2ffcd-f780-40b1-9432-cfe8ba5ad890", + "permission": { + "super_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": true, + "insert": true, + "update": true + } + ] + } + } + } + }, + "role": "developer" + }, + { + "__createdtime__": 1610749235614, + "__updatedtime__": 1610749235614, + "id": "136f03fa-a0e9-46c3-bd5d-7f3e7dd5b564", + "permission": { + "cluster_user": true + }, + "role": "cluster_user" + }, + { + "__createdtime__": 1610749235609, + "__updatedtime__": 1610749235609, + "id": "745b3138-a7cf-455a-8256-ac03722eef12", + "permission": { + "super_user": true + }, + "role": "super_user" + } ] ``` --- ## Add Role + Creates a new role with the specified permissions. [Learn more about HarperDB roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_role` -* role _(required)_ - name of role you are defining -* permission _(required)_ - object defining permissions for users associated with this role: - * super_user _(optional)_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. - * structure_user (optional) - boolean OR array of database names (as strings). If boolean, user can create new databases and tables. If array of strings, users can only manage tables within the specified databases. This overrides any individual table permissions for specified databases, or for all databases if the value is true. +- operation _(required)_ - must always be `add_role` +- role _(required)_ - name of role you are defining +- permission _(required)_ - object defining permissions for users associated with this role: + - super*user *(optional)\_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. + - structure_user (optional) - boolean OR array of database names (as strings). If boolean, user can create new databases and tables. If array of strings, users can only manage tables within the specified databases. This overrides any individual table permissions for specified databases, or for all databases if the value is true. ### Body + ```json { - "operation": "add_role", - "role": "developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": true, - "insert": true, - "update": true - } - ] - } - } - } - } + "operation": "add_role", + "role": "developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": true, + "insert": true, + "update": true + } + ] + } + } + } + } } ``` ### Response: 200 + ```json { - "role": "developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": true, - "insert": true, - "update": true - } - ] - } - } - } - }, - "id": "0a9368b0-bd81-482f-9f5a-8722e3582f96", - "__updatedtime__": 1598549532897, - "__createdtime__": 1598549532897 + "role": "developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": true, + "insert": true, + "update": true + } + ] + } + } + } + }, + "id": "0a9368b0-bd81-482f-9f5a-8722e3582f96", + "__updatedtime__": 1598549532897, + "__createdtime__": 1598549532897 } ``` --- ## Alter Role + Modifies an existing role with the specified permissions. updates permissions from an existing role. [Learn more about HarperDB roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `alter_role` -* id _(required)_ - the id value for the role you are altering -* role _(optional)_ - name value to update on the role you are altering -* permission _(required)_ - object defining permissions for users associated with this role: - * super_user _(optional)_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. - * structure_user (optional) - boolean OR array of database names (as strings). If boolean, user can create new databases and tables. If array of strings, users can only manage tables within the specified databases. This overrides any individual table permissions for specified databases, or for all databases if the value is true. +- operation _(required)_ - must always be `alter_role` +- id _(required)_ - the id value for the role you are altering +- role _(optional)_ - name value to update on the role you are altering +- permission _(required)_ - object defining permissions for users associated with this role: + - super*user *(optional)\_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. + - structure_user (optional) - boolean OR array of database names (as strings). If boolean, user can create new databases and tables. If array of strings, users can only manage tables within the specified databases. This overrides any individual table permissions for specified databases, or for all databases if the value is true. ### Body ```json { - "operation": "alter_role", - "id": "f92162e2-cd17-450c-aae0-372a76859038", - "role": "another_developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": false, - "insert": true, - "update": true - } - ] - } - } - } - } + "operation": "alter_role", + "id": "f92162e2-cd17-450c-aae0-372a76859038", + "role": "another_developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": false, + "insert": true, + "update": true + } + ] + } + } + } + } } ``` ### Response: 200 + ```json { - "id": "a7cb91e9-32e4-4dbf-a327-fab4fa9191ea", - "role": "developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": false, - "insert": true, - "update": true - } - ] - } - } - } - }, - "__updatedtime__": 1598549996106 + "id": "a7cb91e9-32e4-4dbf-a327-fab4fa9191ea", + "role": "developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": false, + "insert": true, + "update": true + } + ] + } + } + } + }, + "__updatedtime__": 1598549996106 } ``` --- ## Drop Role + Deletes an existing role from the database. NOTE: Role with associated users cannot be dropped. [Learn more about HarperDB roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - this must always be `drop_role` -* id _(required)_ - this is the id of the role you are dropping +- operation _(required)_ - this must always be `drop_role` +- id _(required)_ - this is the id of the role you are dropping ### Body + ```json { - "operation": "drop_role", - "id": "developer" + "operation": "drop_role", + "id": "developer" } ``` ### Response: 200 + ```json { - "message": "developer successfully deleted" + "message": "developer successfully deleted" } ``` --- ## List Users + Returns a list of all users. [Learn more about HarperDB roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `list_users` +- operation _(required)_ - must always be `list_users` ### Body + ```json { - "operation": "list_users" + "operation": "list_users" } ``` ### Response: 200 + ```json [ - { - "__createdtime__": 1635520961165, - "__updatedtime__": 1635520961165, - "active": true, - "role": { - "__createdtime__": 1635520961161, - "__updatedtime__": 1635520961161, - "id": "7c78ef13-c1f3-4063-8ea3-725127a78279", - "permission": { - "super_user": true, - "system": { - "tables": { - "hdb_table": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_attribute": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_schema": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_user": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_role": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_job": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_license": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_info": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_nodes": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_temp": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - } - } - } - }, - "role": "super_user" - }, - "username": "HDB_ADMIN" - } + { + "__createdtime__": 1635520961165, + "__updatedtime__": 1635520961165, + "active": true, + "role": { + "__createdtime__": 1635520961161, + "__updatedtime__": 1635520961161, + "id": "7c78ef13-c1f3-4063-8ea3-725127a78279", + "permission": { + "super_user": true, + "system": { + "tables": { + "hdb_table": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_attribute": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_schema": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_user": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_role": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_job": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_license": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_info": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_nodes": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_temp": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + } + } + } + }, + "role": "super_user" + }, + "username": "HDB_ADMIN" + } ] ``` --- ## User Info + Returns user data for the associated user credentials. -* operation _(required)_ - must always be `user_info` +- operation _(required)_ - must always be `user_info` ### Body + ```json { - "operation": "user_info" + "operation": "user_info" } ``` ### Response: 200 + ```json { - "__createdtime__": 1610749235611, - "__updatedtime__": 1610749235611, - "active": true, - "role": { - "__createdtime__": 1610749235609, - "__updatedtime__": 1610749235609, - "id": "745b3138-a7cf-455a-8256-ac03722eef12", - "permission": { - "super_user": true - }, - "role": "super_user" - }, - "username": "HDB_ADMIN" + "__createdtime__": 1610749235611, + "__updatedtime__": 1610749235611, + "active": true, + "role": { + "__createdtime__": 1610749235609, + "__updatedtime__": 1610749235609, + "id": "745b3138-a7cf-455a-8256-ac03722eef12", + "permission": { + "super_user": true + }, + "role": "super_user" + }, + "username": "HDB_ADMIN" } ``` --- ## Add User + Creates a new user with the specified role and credentials. [Learn more about HarperDB roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_user` -* role _(required)_ - 'role' name value of the role you wish to assign to the user. See `add_role` for more detail -* username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash -* password _(required)_ - clear text for password. HarperDB will encrypt the password upon receipt -* active _(required)_ - boolean value for status of user's access to your HarperDB instance. If set to false, user will not be able to access your instance of HarperDB. +- operation _(required)_ - must always be `add_user` +- role _(required)_ - 'role' name value of the role you wish to assign to the user. See `add_role` for more detail +- username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash +- password _(required)_ - clear text for password. HarperDB will encrypt the password upon receipt +- active _(required)_ - boolean value for status of user's access to your HarperDB instance. If set to false, user will not be able to access your instance of HarperDB. ### Body + ```json { - "operation": "add_user", - "role": "role_name", - "username": "hdb_user", - "password": "password", - "active": true + "operation": "add_user", + "role": "role_name", + "username": "hdb_user", + "password": "password", + "active": true } ``` ### Response: 200 + ```json { - "message": "hdb_user successfully added" + "message": "hdb_user successfully added" } ``` --- ## Alter User + Modifies an existing user's role and/or credentials. [Learn more about HarperDB roles here.](../security/users-and-roles) -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ - * operation _(required)_ - must always be `alter_user` - * username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash. - * password _(optional)_ - clear text for password. HarperDB will encrypt the password upon receipt - * role _(optional)_ - `role` name value of the role you wish to assign to the user. See `add_role` for more detail - * active _(optional)_ - status of user's access to your HarperDB instance. See `add_role` for more detail +- operation _(required)_ - must always be `alter_user` +- username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash. +- password _(optional)_ - clear text for password. HarperDB will encrypt the password upon receipt +- role _(optional)_ - `role` name value of the role you wish to assign to the user. See `add_role` for more detail +- active _(optional)_ - status of user's access to your HarperDB instance. See `add_role` for more detail ### Body + ```json { - "operation": "alter_user", - "role": "role_name", - "username": "hdb_user", - "password": "password", - "active": true + "operation": "alter_user", + "role": "role_name", + "username": "hdb_user", + "password": "password", + "active": true } ``` ### Response: 200 + ```json { - "message": "updated 1 of 1 records", - "new_attributes": [], - "txn_time": 1611615114397.988, - "update_hashes": [ - "hdb_user" - ], - "skipped_hashes": [] + "message": "updated 1 of 1 records", + "new_attributes": [], + "txn_time": 1611615114397.988, + "update_hashes": ["hdb_user"], + "skipped_hashes": [] } ``` --- ## Drop User + Deletes an existing user by username. [Learn more about HarperDB roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_user` -* username _(required)_ - username assigned to the user +- operation _(required)_ - must always be `drop_user` +- username _(required)_ - username assigned to the user ### Body + ```json { - "operation": "drop_user", - "username": "sgoldberg" + "operation": "drop_user", + "username": "sgoldberg" } ``` ### Response: 200 + ```json { - "message": "sgoldberg successfully deleted" + "message": "sgoldberg successfully deleted" } ``` diff --git a/site/versioned_docs/version-4.3/developers/operations-api/utilities.md b/site/versioned_docs/version-4.3/developers/operations-api/utilities.md index 2c22dcaa..cf552ec8 100644 --- a/site/versioned_docs/version-4.3/developers/operations-api/utilities.md +++ b/site/versioned_docs/version-4.3/developers/operations-api/utilities.md @@ -5,63 +5,73 @@ title: Utilities # Utilities ## Restart + Restarts the HarperDB instance. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `restart` +- operation _(required)_ - must always be `restart` ### Body + ```json { - "operation": "restart" + "operation": "restart" } ``` ### Response: 200 + ```json { - "message": "Restarting HarperDB. This may take up to 60 seconds." + "message": "Restarting HarperDB. This may take up to 60 seconds." } ``` + --- ## Restart Service + Restarts servers for the specified HarperDB service. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `restart_service` -* service _(required)_ - must be one of: `http_workers`, `clustering_config` or `clustering` +- operation _(required)_ - must always be `restart_service` +- service _(required)_ - must be one of: `http_workers`, `clustering_config` or `clustering` ### Body + ```json { - "operation": "restart_service", - "service": "http_workers" + "operation": "restart_service", + "service": "http_workers" } ``` ### Response: 200 + ```json { - "message": "Restarting http_workers" + "message": "Restarting http_workers" } ``` --- + ## System Information + Returns detailed metrics on the host system. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `system_information` -* attributes _(optional)_ - string array of top level attributes desired in the response, if no value is supplied all attributes will be returned. Available attributes are: ['system', 'time', 'cpu', 'memory', 'disk', 'network', 'harperdb_processes', 'table_size', 'replication'] +- operation _(required)_ - must always be `system_information` +- attributes _(optional)_ - string array of top level attributes desired in the response, if no value is supplied all attributes will be returned. Available attributes are: ['system', 'time', 'cpu', 'memory', 'disk', 'network', 'harperdb_processes', 'table_size', 'replication'] ### Body + ```json { - "operation": "system_information" + "operation": "system_information" } ``` @@ -73,117 +83,124 @@ Delete data before the specified timestamp on the specified database table exclu _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_records_before` -* date _(required)_ - records older than this date will be deleted. Supported format looks like: `YYYY-MM-DDThh:mm:ss.sZ` -* schema _(required)_ - name of the schema where you are deleting your data -* table _(required)_ - name of the table where you are deleting your data +- operation _(required)_ - must always be `delete_records_before` +- date _(required)_ - records older than this date will be deleted. Supported format looks like: `YYYY-MM-DDThh:mm:ss.sZ` +- schema _(required)_ - name of the schema where you are deleting your data +- table _(required)_ - name of the table where you are deleting your data ### Body + ```json { - "operation": "delete_records_before", - "date": "2021-01-25T23:05:27.464", - "schema": "dev", - "table": "breed" + "operation": "delete_records_before", + "date": "2021-01-25T23:05:27.464", + "schema": "dev", + "table": "breed" } ``` ### Response: 200 + ```json { - "message": "Starting job with id d3aed926-e9fe-4ec1-aea7-0fb4451bd373", - "job_id": "d3aed926-e9fe-4ec1-aea7-0fb4451bd373" + "message": "Starting job with id d3aed926-e9fe-4ec1-aea7-0fb4451bd373", + "job_id": "d3aed926-e9fe-4ec1-aea7-0fb4451bd373" } ``` --- ## Export Local + Exports data based on a given search operation to a local file in JSON or CSV format. -* operation _(required)_ - must always be `export_local` -* format _(required)_ - the format you wish to export the data, options are `json` & `csv` -* path _(required)_ - path local to the server to export the data -* search_operation _(required)_ - search_operation of `search_by_hash`, `search_by_value`, `search_by_conditions` or `sql` -* filename _(optional)_ - the name of the file where your export will be written to (do not include extension in filename). If one is not provided it will be autogenerated based on the epoch. +- operation _(required)_ - must always be `export_local` +- format _(required)_ - the format you wish to export the data, options are `json` & `csv` +- path _(required)_ - path local to the server to export the data +- search*operation *(required)\_ - search_operation of `search_by_hash`, `search_by_value`, `search_by_conditions` or `sql` +- filename _(optional)_ - the name of the file where your export will be written to (do not include extension in filename). If one is not provided it will be autogenerated based on the epoch. ### Body + ```json { - "operation": "export_local", - "format": "json", - "path": "/data/", - "search_operation": { - "operation": "sql", - "sql": "SELECT * FROM dev.breed" - } + "operation": "export_local", + "format": "json", + "path": "/data/", + "search_operation": { + "operation": "sql", + "sql": "SELECT * FROM dev.breed" + } } ``` ### Response: 200 + ```json { - "message": "Starting job with id 6fc18eaa-3504-4374-815c-44840a12e7e5" + "message": "Starting job with id 6fc18eaa-3504-4374-815c-44840a12e7e5" } ``` --- ## Export To S3 + Exports data based on a given search operation from table to AWS S3 in JSON or CSV format. -* operation _(required)_ - must always be `export_to_s3` -* format _(required)_ - the format you wish to export the data, options are `json` & `csv` -* s3 _(required)_ - details your access keys, bucket, bucket region and key for saving the data to S3 -* search_operation _(required)_ - search_operation of `search_by_hash`, `search_by_value`, `search_by_conditions` or `sql` +- operation _(required)_ - must always be `export_to_s3` +- format _(required)_ - the format you wish to export the data, options are `json` & `csv` +- s3 _(required)_ - details your access keys, bucket, bucket region and key for saving the data to S3 +- search*operation *(required)\_ - search_operation of `search_by_hash`, `search_by_value`, `search_by_conditions` or `sql` ### Body + ```json { - "operation": "export_to_s3", - "format": "json", - "s3": { - "aws_access_key_id": "YOUR_KEY", - "aws_secret_access_key": "YOUR_SECRET_KEY", - "bucket": "BUCKET_NAME", - "key": "OBJECT_NAME", - "region": "BUCKET_REGION" - }, - "search_operation": { - "operation": "sql", - "sql": "SELECT * FROM dev.dog" - } + "operation": "export_to_s3", + "format": "json", + "s3": { + "aws_access_key_id": "YOUR_KEY", + "aws_secret_access_key": "YOUR_SECRET_KEY", + "bucket": "BUCKET_NAME", + "key": "OBJECT_NAME", + "region": "BUCKET_REGION" + }, + "search_operation": { + "operation": "sql", + "sql": "SELECT * FROM dev.dog" + } } ``` ### Response: 200 + ```json { - "message": "Starting job with id 9fa85968-4cb1-4008-976e-506c4b13fc4a", - "job_id": "9fa85968-4cb1-4008-976e-506c4b13fc4a" + "message": "Starting job with id 9fa85968-4cb1-4008-976e-506c4b13fc4a", + "job_id": "9fa85968-4cb1-4008-976e-506c4b13fc4a" } ``` --- ## Install Node Modules + Executes npm install against specified custom function projects. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `install_node_modules` -* projects _(required)_ - must ba an array of custom functions projects. -* dry_run _(optional)_ - refers to the npm --dry-run flag: [https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run](https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run). Defaults to false. +- operation _(required)_ - must always be `install_node_modules` +- projects _(required)_ - must ba an array of custom functions projects. +- dry*run *(optional)\_ - refers to the npm --dry-run flag: [https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run](https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run). Defaults to false. ### Body + ```json { - "operation": "install_node_modules", - "projects": [ - "dogs", - "cats" - ], - "dry_run": true + "operation": "install_node_modules", + "projects": ["dogs", "cats"], + "dry_run": true } ``` @@ -195,165 +212,166 @@ Modifies the HarperDB configuration file parameters. Must follow with a restart _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_configuration` -* logging_level _(example/optional)_ - one or more configuration keywords to be updated in the HarperDB configuration file -* clustering_enabled _(example/optional)_ - one or more configuration keywords to be updated in the HarperDB configuration file +- operation _(required)_ - must always be `set_configuration` +- logging*level *(example/optional)\_ - one or more configuration keywords to be updated in the HarperDB configuration file +- clustering*enabled *(example/optional)\_ - one or more configuration keywords to be updated in the HarperDB configuration file ### Body + ```json { - "operation": "set_configuration", - "logging_level": "trace", - "clustering_enabled": true + "operation": "set_configuration", + "logging_level": "trace", + "clustering_enabled": true } ``` ### Response: 200 + ```json { - "message": "Configuration successfully set. You must restart HarperDB for new config settings to take effect." + "message": "Configuration successfully set. You must restart HarperDB for new config settings to take effect." } ``` --- ## Get Configuration + Returns the HarperDB configuration parameters. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_configuration` +- operation _(required)_ - must always be `get_configuration` ### Body + ```json { - "operation": "get_configuration" + "operation": "get_configuration" } ``` ### Response: 200 + ```json { - "http": { - "compressionThreshold": 1200, - "cors": false, - "corsAccessList": [ - null - ], - "keepAliveTimeout": 30000, - "port": 9926, - "securePort": null, - "timeout": 120000 - }, - "threads": 11, - "authentication": { - "cacheTTL": 30000, - "enableSessions": true, - "operationTokenTimeout": "1d", - "refreshTokenTimeout": "30d" - }, - "analytics": { - "aggregatePeriod": 60 - }, - "clustering": { - "enabled": true, - "hubServer": { - "cluster": { - "name": "harperdb", - "network": { - "port": 12345, - "routes": null - } - }, - "leafNodes": { - "network": { - "port": 9931 - } - }, - "network": { - "port": 9930 - } - }, - "leafServer": { - "network": { - "port": 9940, - "routes": null - }, - "streams": { - "maxAge": null, - "maxBytes": null, - "maxMsgs": null, - "path": "/Users/hdb/clustering/leaf" - } - }, - "logLevel": "info", - "nodeName": "node1", - "republishMessages": false, - "databaseLevel": false, - "tls": { - "certificate": "/Users/hdb/keys/certificate.pem", - "certificateAuthority": "/Users/hdb/keys/ca.pem", - "privateKey": "/Users/hdb/keys/privateKey.pem", - "insecure": true, - "verify": true - }, - "user": "cluster_user" - }, - "componentsRoot": "/Users/hdb/components", - "localStudio": { - "enabled": false - }, - "logging": { - "auditAuthEvents": { - "logFailed": false, - "logSuccessful": false - }, - "auditLog": true, - "auditRetention": "3d", - "file": true, - "level": "error", - "root": "/Users/hdb/log", - "rotation": { - "enabled": false, - "compress": false, - "interval": null, - "maxSize": null, - "path": "/Users/hdb/log" - }, - "stdStreams": false - }, - "mqtt": { - "network": { - "port": 1883, - "securePort": 8883 - }, - "webSocket": true, - "requireAuthentication": true - }, - "operationsApi": { - "network": { - "cors": true, - "corsAccessList": [ - "*" - ], - "domainSocket": "/Users/hdb/operations-server", - "port": 9925, - "securePort": null - } - }, - "rootPath": "/Users/hdb", - "storage": { - "writeAsync": false, - "caching": true, - "compression": false, - "noReadAhead": true, - "path": "/Users/hdb/database", - "prefetchWrites": true - }, - "tls": { - "certificate": "/Users/hdb/keys/certificate.pem", - "certificateAuthority": "/Users/hdb/keys/ca.pem", - "privateKey": "/Users/hdb/keys/privateKey.pem" - } + "http": { + "compressionThreshold": 1200, + "cors": false, + "corsAccessList": [null], + "keepAliveTimeout": 30000, + "port": 9926, + "securePort": null, + "timeout": 120000 + }, + "threads": 11, + "authentication": { + "cacheTTL": 30000, + "enableSessions": true, + "operationTokenTimeout": "1d", + "refreshTokenTimeout": "30d" + }, + "analytics": { + "aggregatePeriod": 60 + }, + "clustering": { + "enabled": true, + "hubServer": { + "cluster": { + "name": "harperdb", + "network": { + "port": 12345, + "routes": null + } + }, + "leafNodes": { + "network": { + "port": 9931 + } + }, + "network": { + "port": 9930 + } + }, + "leafServer": { + "network": { + "port": 9940, + "routes": null + }, + "streams": { + "maxAge": null, + "maxBytes": null, + "maxMsgs": null, + "path": "/Users/hdb/clustering/leaf" + } + }, + "logLevel": "info", + "nodeName": "node1", + "republishMessages": false, + "databaseLevel": false, + "tls": { + "certificate": "/Users/hdb/keys/certificate.pem", + "certificateAuthority": "/Users/hdb/keys/ca.pem", + "privateKey": "/Users/hdb/keys/privateKey.pem", + "insecure": true, + "verify": true + }, + "user": "cluster_user" + }, + "componentsRoot": "/Users/hdb/components", + "localStudio": { + "enabled": false + }, + "logging": { + "auditAuthEvents": { + "logFailed": false, + "logSuccessful": false + }, + "auditLog": true, + "auditRetention": "3d", + "file": true, + "level": "error", + "root": "/Users/hdb/log", + "rotation": { + "enabled": false, + "compress": false, + "interval": null, + "maxSize": null, + "path": "/Users/hdb/log" + }, + "stdStreams": false + }, + "mqtt": { + "network": { + "port": 1883, + "securePort": 8883 + }, + "webSocket": true, + "requireAuthentication": true + }, + "operationsApi": { + "network": { + "cors": true, + "corsAccessList": ["*"], + "domainSocket": "/Users/hdb/operations-server", + "port": 9925, + "securePort": null + } + }, + "rootPath": "/Users/hdb", + "storage": { + "writeAsync": false, + "caching": true, + "compression": false, + "noReadAhead": true, + "path": "/Users/hdb/database", + "prefetchWrites": true + }, + "tls": { + "certificate": "/Users/hdb/keys/certificate.pem", + "certificateAuthority": "/Users/hdb/keys/ca.pem", + "privateKey": "/Users/hdb/keys/privateKey.pem" + } } -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.3/developers/real-time.md b/site/versioned_docs/version-4.3/developers/real-time.md index 5e9ab20a..be29cd6a 100644 --- a/site/versioned_docs/version-4.3/developers/real-time.md +++ b/site/versioned_docs/version-4.3/developers/real-time.md @@ -9,9 +9,11 @@ title: Real-Time HarperDB provides real-time access to data and messaging. This allows clients to monitor and subscribe to data for changes in real-time as well as handling data-oriented messaging. HarperDB supports multiple standardized protocols to facilitate diverse standards-based client interaction. HarperDB real-time communication is based around database tables. Declared tables are the basis for monitoring data, and defining "topics" for publishing and subscribing to messages. Declaring a table that establishes a topic can be as simple as adding a table with no attributes to your [schema.graphql in a HarperDB application folder](./applications/): + ``` type MyTopic @table @export ``` + You can then subscribe to records or sub-topics in this topic/namespace, as well as save data and publish messages, with the protocols discussed below. ### Content Negotiation @@ -130,7 +132,7 @@ eventSource.onmessage = (event) => { ### MQTT Feature Support Matrix | Feature | Support | -|--------------------------------------------------------------------|----------------------------------------------------------------| +| ------------------------------------------------------------------ | -------------------------------------------------------------- | | Connections, protocol negotiation, and acknowledgement with v3.1.1 | :heavy_check_mark: | | Connections, protocol negotiation, and acknowledgement with v5 | :heavy_check_mark: | | Secure MQTTS | :heavy_check_mark: | @@ -144,17 +146,17 @@ eventSource.onmessage = (event) => { | QoS 0 | :heavy_check_mark: | | QoS 1 | :heavy_check_mark: | | QoS 2 | Not fully supported, can perform conversation but does persist | -| Keep-Alive monitoring | | -| Clean session | :heavy_check_mark: | -| Durable session | :heavy_check_mark: | -| Distributed durable session | | -| Will | :heavy_check_mark: | -| MQTT V5 User properties | | -| MQTT V5 Will properties | | -| MQTT V5 Connection properties | | -| MQTT V5 Connection acknowledgement properties | | -| MQTT V5 Publish properties | | -| MQTT V5 Subscribe properties | | -| MQTT V5 Ack properties | | -| MQTT V5 AUTH command | | -| MQTT V5 Shared Subscriptions | | \ No newline at end of file +| Keep-Alive monitoring | | +| Clean session | :heavy_check_mark: | +| Durable session | :heavy_check_mark: | +| Distributed durable session | | +| Will | :heavy_check_mark: | +| MQTT V5 User properties | | +| MQTT V5 Will properties | | +| MQTT V5 Connection properties | | +| MQTT V5 Connection acknowledgement properties | | +| MQTT V5 Publish properties | | +| MQTT V5 Subscribe properties | | +| MQTT V5 Ack properties | | +| MQTT V5 AUTH command | | +| MQTT V5 Shared Subscriptions | | diff --git a/site/versioned_docs/version-4.3/developers/rest.md b/site/versioned_docs/version-4.3/developers/rest.md index 2b260782..7f9e1313 100644 --- a/site/versioned_docs/version-4.3/developers/rest.md +++ b/site/versioned_docs/version-4.3/developers/rest.md @@ -10,11 +10,11 @@ Resources, including tables, can be configured as RESTful endpoints. Make sure y The default path structure provides access to resources at several levels: -* `/my-resource` - The root path of a resource usually has a description of the resource (like a describe operation for a table). -* `/my-resource/` - The trailing slash in a path indicates it is a collection of the records. The root collection for a table represents all the records in a table, and usually you will append query parameters to query and search for more specific records. -* `/my-resource/record-id` - This resource locator represents a specific record, referenced by its id. This is typically how you can retrieve, update, and delete individual records. -* `/my-resource/record-id/` - Again, a trailing slash indicates a collection; here it is the collection of the records that begin with the specified id prefix. -* `/my-resource/record-id/with/multiple/parts` - A record id can consist of multiple path segments. +- `/my-resource` - The root path of a resource usually has a description of the resource (like a describe operation for a table). +- `/my-resource/` - The trailing slash in a path indicates it is a collection of the records. The root collection for a table represents all the records in a table, and usually you will append query parameters to query and search for more specific records. +- `/my-resource/record-id` - This resource locator represents a specific record, referenced by its id. This is typically how you can retrieve, update, and delete individual records. +- `/my-resource/record-id/` - Again, a trailing slash indicates a collection; here it is the collection of the records that begin with the specified id prefix. +- `/my-resource/record-id/with/multiple/parts` - A record id can consist of multiple path segments. ## GET @@ -79,13 +79,13 @@ Generally the POST method can be used for custom actions since POST has the broa This is handled by the Resource method `post(data)`, which is a good method to extend to make various other types of modifications. Also, with a table you can create a new record without specifying a primary key, for example: -````http +`````http ````http POST /MyTable/ Content-Type: application/json `{ "name": "some data" }` -```` +````` This will create a new record, auto-assigning a primary key, which will be returned in the `Location` header. @@ -264,7 +264,7 @@ When selecting properties from a related table without any constraints on the re ### Many-to-many Relationships (Array of Foreign Keys) -Many-to-many relationships are also supported, and can easily be created using an array of foreign key values, without requiring the traditional use of a junction table. This can be done by simply creating a relationship on an array-typed property that references a local array of foreign keys. For example, we could create a relationship to the resellers of a product (each product can have multiple resellers, each ) +Many-to-many relationships are also supported, and can easily be created using an array of foreign key values, without requiring the traditional use of a junction table. This can be done by simply creating a relationship on an array-typed property that references a local array of foreign keys. For example, we could create a relationship to the resellers of a product (each product can have multiple resellers, each ) ```graphql type Product @table @export { @@ -289,7 +289,7 @@ PUT /Product/123 Content-Type: application/json { "id": "123", "resellerIds": ["first-reseller-id", "second-reseller-id", "last-reseller-id"], -...} +...} ``` ### Type Conversion @@ -355,3 +355,4 @@ Content-Type: image/gif ...image data... ``` +```` diff --git a/site/versioned_docs/version-4.3/developers/security/basic-auth.md b/site/versioned_docs/version-4.3/developers/security/basic-auth.md index 7e5fbcaa..b7e19131 100644 --- a/site/versioned_docs/version-4.3/developers/security/basic-auth.md +++ b/site/versioned_docs/version-4.3/developers/security/basic-auth.md @@ -6,7 +6,7 @@ title: Basic Authentication HarperDB uses Basic Auth and JSON Web Tokens (JWTs) to secure our HTTP requests. In the context of an HTTP transaction, **basic access authentication** is a method for an HTTP user agent to provide a username and password when making a request. -** _**You do not need to log in separately. Basic Auth is added to each HTTP request like create\_database, create\_table, insert etc… via headers.**_ ** +** \_**You do not need to log in separately. Basic Auth is added to each HTTP request like create_database, create_table, insert etc… via headers.**\_ ** A header is added to each HTTP request. The header key is **“Authorization”** the header value is **“Basic <<your username and password buffer token>>”** @@ -17,46 +17,41 @@ In the below code sample, you can see where we add the authorization header to t _Note: This function uses btoa. Learn about_ [_btoa here_](https://developer.mozilla.org/en-US/docs/Web/API/btoa)_._ ```javascript -function callHarperDB(call_object, operation, callback){ - - const options = { - "method": "POST", - "hostname": call_object.endpoint_url, - "port": call_object.endpoint_port, - "path": "/", - "headers": { - "content-type": "application/json", - "authorization": "Basic " + btoa(call_object.username + ':' + call_object.password), - "cache-control": "no-cache" - - } - }; - - const http_req = http.request(options, function (hdb_res) { - let chunks = []; - - hdb_res.on("data", function (chunk) { - chunks.push(chunk); - }); - - hdb_res.on("end", function () { - const body = Buffer.concat(chunks); - if (isJson(body)) { - return callback(null, JSON.parse(body)); - } else { - return callback(body, null); - - } - - }); - }); - - http_req.on("error", function (chunk) { - return callback("Failed to connect", null); - }); - - http_req.write(JSON.stringify(operation)); - http_req.end(); - +function callHarperDB(call_object, operation, callback) { + const options = { + method: 'POST', + hostname: call_object.endpoint_url, + port: call_object.endpoint_port, + path: '/', + headers: { + 'content-type': 'application/json', + 'authorization': 'Basic ' + btoa(call_object.username + ':' + call_object.password), + 'cache-control': 'no-cache', + }, + }; + + const http_req = http.request(options, function (hdb_res) { + let chunks = []; + + hdb_res.on('data', function (chunk) { + chunks.push(chunk); + }); + + hdb_res.on('end', function () { + const body = Buffer.concat(chunks); + if (isJson(body)) { + return callback(null, JSON.parse(body)); + } else { + return callback(body, null); + } + }); + }); + + http_req.on('error', function (chunk) { + return callback('Failed to connect', null); + }); + + http_req.write(JSON.stringify(operation)); + http_req.end(); } ``` diff --git a/site/versioned_docs/version-4.3/developers/security/certificate-management.md b/site/versioned_docs/version-4.3/developers/security/certificate-management.md index 12b56eda..d15abc04 100644 --- a/site/versioned_docs/version-4.3/developers/security/certificate-management.md +++ b/site/versioned_docs/version-4.3/developers/security/certificate-management.md @@ -28,9 +28,9 @@ To replace the certificates, either replace the contents of the existing certifi ```yaml tls: - certificate: ~/hdb/keys/certificate.pem - certificateAuthority: ~/hdb/keys/ca.pem - privateKey: ~/hdb/keys/privateKey.pem + certificate: ~/hdb/keys/certificate.pem + certificateAuthority: ~/hdb/keys/ca.pem + privateKey: ~/hdb/keys/privateKey.pem ``` `operationsApi.tls` configuration is optional. If it is not set HarperDB will default to the values in the `tls` section. diff --git a/site/versioned_docs/version-4.3/developers/security/configuration.md b/site/versioned_docs/version-4.3/developers/security/configuration.md index f5feb51b..c8134aac 100644 --- a/site/versioned_docs/version-4.3/developers/security/configuration.md +++ b/site/versioned_docs/version-4.3/developers/security/configuration.md @@ -8,18 +8,19 @@ HarperDB was set up to require very minimal configuration to work out of the box ## CORS -HarperDB allows for managing [cross-origin HTTP requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access\_control\_CORS). By default, HarperDB enables CORS for all domains if you need to disable CORS completely or set up an access list of domains you can do the following: +HarperDB allows for managing [cross-origin HTTP requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS). By default, HarperDB enables CORS for all domains if you need to disable CORS completely or set up an access list of domains you can do the following: 1. Open the harperdb-config.yaml file, which can be found in \, the location you specified during install. 1. In harperdb-config.yaml there should be 2 entries under `operationsApi.network`: cors and corsAccessList. - * `cors` + - `cors` 1. To turn off, change to: `cors: false` 1. To turn on, change to: `cors: true` - * `corsAccessList` + - `corsAccessList` 1. The `corsAccessList` will only be recognized by the system when `cors` is `true` 1. To create an access list you set `corsAccessList` to a comma-separated list of domains. - i.e. `corsAccessList` is `https://harperdb.io,https://products.harperdb.io` + i.e. `corsAccessList` is `https://harperdb.io,https://products.harperdb.io` + 1. To clear out the access list and allow all domains: `corsAccessList` is `[null]` ## SSL diff --git a/site/versioned_docs/version-4.3/developers/security/index.md b/site/versioned_docs/version-4.3/developers/security/index.md index 6f3ab721..6c9540c2 100644 --- a/site/versioned_docs/version-4.3/developers/security/index.md +++ b/site/versioned_docs/version-4.3/developers/security/index.md @@ -6,8 +6,8 @@ title: Security HarperDB uses role-based, attribute-level security to ensure that users can only gain access to the data they’re supposed to be able to access. Our granular permissions allow for unparalleled flexibility and control, and can actually lower the total cost of ownership compared to other database solutions, since you no longer have to replicate subsets of your data to isolate use cases. -* [JWT Authentication](./jwt-auth) -* [Basic Authentication](./basic-auth) -* [mTLS Authentication](./mtls-auth) -* [Configuration](./configuration) -* [Users and Roles](./users-and-roles) +- [JWT Authentication](./jwt-auth) +- [Basic Authentication](./basic-auth) +- [mTLS Authentication](./mtls-auth) +- [Configuration](./configuration) +- [Users and Roles](./users-and-roles) diff --git a/site/versioned_docs/version-4.3/developers/security/jwt-auth.md b/site/versioned_docs/version-4.3/developers/security/jwt-auth.md index 18072f70..cd37119d 100644 --- a/site/versioned_docs/version-4.3/developers/security/jwt-auth.md +++ b/site/versioned_docs/version-4.3/developers/security/jwt-auth.md @@ -8,8 +8,8 @@ HarperDB uses token based authentication with JSON Web Tokens, JWTs. This consists of two primary operations `create_authentication_tokens` and `refresh_operation_token`. These generate two types of tokens, as follows: -* The `operation_token` which is used to authenticate all HarperDB operations in the Bearer Token Authorization Header. The default expiry is one day. -* The `refresh_token` which is used to generate a new `operation_token` upon expiry. This token is used in the Bearer Token Authorization Header for the `refresh_operation_token` operation only. The default expiry is thirty days. +- The `operation_token` which is used to authenticate all HarperDB operations in the Bearer Token Authorization Header. The default expiry is one day. +- The `refresh_token` which is used to generate a new `operation_token` upon expiry. This token is used in the Bearer Token Authorization Header for the `refresh_operation_token` operation only. The default expiry is thirty days. The `create_authentication_tokens` operation can be used at any time to refresh both tokens in the event that both have expired or been lost. @@ -19,9 +19,9 @@ Users must initially create tokens using their HarperDB credentials. The followi ```json { - "operation": "create_authentication_tokens", - "username": "username", - "password": "password" + "operation": "create_authentication_tokens", + "username": "username", + "password": "password" } ``` @@ -41,8 +41,8 @@ An example expected return object is: ```json { - "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDUwNjQ2MDAsInN1YiI6Im9wZXJhdGlvbiJ9.MpQA-9CMjA-mn-7mHyUXSuSC_-kqMqJXp_NDiKLFtbtMRbodCuY3DzH401rvy_4vb0yCELf0B5EapLVY1545sv80nxSl6FoZFxQaDWYXycoia6zHpiveR8hKlmA6_XTWHJbY2FM1HAFrdtt3yUTiF-ylkdNbPG7u7fRjTmHfsZ78gd2MNWIDkHoqWuFxIyqk8XydQpsjULf2Uacirt9FmHfkMZ-Jr_rRpcIEW0FZyLInbm6uxLfseFt87wA0TbZ0ofImjAuaW_3mYs-3H48CxP152UJ0jByPb0kHsk1QKP7YHWx1-Wce9NgNADfG5rfgMHANL85zvkv8sJmIGZIoSpMuU3CIqD2rgYnMY-L5dQN1fgfROrPMuAtlYCRK7r-IpjvMDQtRmCiNG45nGsM4DTzsa5GyDrkGssd5OBhl9gr9z9Bb5HQVYhSKIOiy72dK5dQNBklD4eGLMmo-u322zBITmE0lKaBcwYGJw2mmkYcrjDOmsDseU6Bf_zVUd9WF3FqwNkhg4D7nrfNSC_flalkxPHckU5EC_79cqoUIX2ogufBW5XgYbU4WfLloKcIpb51YTZlZfwBHlHPSyaq_guaXFaeCUXKq39_i1n0HRF_mRaxNru0cNDFT9Fm3eD7V8axFijSVAMDyQs_JR7SY483YDKUfN4l-vw-EVynImr4", - "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDc1NzAyMDAsInN1YiI6InJlZnJlc2gifQ.acaCsk-CJWIMLGDZdGnsthyZsJfQ8ihXLyE8mTji8PgGkpbwhs7e1O0uitMgP_pGjHq2tey1BHSwoeCL49b18WyMIB10hK-q2BXGKQkykltjTrQbg7VsdFi0h57mGfO0IqAwYd55_hzHZNnyJMh4b0iPQFDwU7iTD7x9doHhZAvzElpkWbc_NKVw5_Mw3znjntSzbuPN105zlp4Niurin-_5BnukwvoJWLEJ-ZlF6hE4wKhaMB1pWTJjMvJQJE8khTTvlUN8tGxmzoaDYoe1aCGNxmDEQnx8Y5gKzVd89sylhqi54d2nQrJ2-ElfEDsMoXpR01Ps6fNDFtLTuPTp7ixj8LvgL2nCjAg996Ga3PtdvXJAZPDYCqqvaBkZZcsiqOgqLV0vGo3VVlfrcgJXQImMYRr_Inu0FCe47A93IAWuQTs-KplM1KdGJsHSnNBV6oe6QEkROJT5qZME-8xhvBYvOXqp9Znwg39bmiBCMxk26Ce66_vw06MNgoa3D5AlXPWemfdVKPZDnj_aLVjZSs0gAfFElcVn7l9yjWJOaT2Muk26U8bJl-2BEq_DSclqKHODuYM5kkPKIdE4NFrsqsDYuGxcA25rlNETFyl0q-UXj1aoz_joy5Hdnr4mFELmjnoo4jYQuakufP9xeGPsj1skaodKl0mmoGcCD6v1F60" + "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDUwNjQ2MDAsInN1YiI6Im9wZXJhdGlvbiJ9.MpQA-9CMjA-mn-7mHyUXSuSC_-kqMqJXp_NDiKLFtbtMRbodCuY3DzH401rvy_4vb0yCELf0B5EapLVY1545sv80nxSl6FoZFxQaDWYXycoia6zHpiveR8hKlmA6_XTWHJbY2FM1HAFrdtt3yUTiF-ylkdNbPG7u7fRjTmHfsZ78gd2MNWIDkHoqWuFxIyqk8XydQpsjULf2Uacirt9FmHfkMZ-Jr_rRpcIEW0FZyLInbm6uxLfseFt87wA0TbZ0ofImjAuaW_3mYs-3H48CxP152UJ0jByPb0kHsk1QKP7YHWx1-Wce9NgNADfG5rfgMHANL85zvkv8sJmIGZIoSpMuU3CIqD2rgYnMY-L5dQN1fgfROrPMuAtlYCRK7r-IpjvMDQtRmCiNG45nGsM4DTzsa5GyDrkGssd5OBhl9gr9z9Bb5HQVYhSKIOiy72dK5dQNBklD4eGLMmo-u322zBITmE0lKaBcwYGJw2mmkYcrjDOmsDseU6Bf_zVUd9WF3FqwNkhg4D7nrfNSC_flalkxPHckU5EC_79cqoUIX2ogufBW5XgYbU4WfLloKcIpb51YTZlZfwBHlHPSyaq_guaXFaeCUXKq39_i1n0HRF_mRaxNru0cNDFT9Fm3eD7V8axFijSVAMDyQs_JR7SY483YDKUfN4l-vw-EVynImr4", + "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDc1NzAyMDAsInN1YiI6InJlZnJlc2gifQ.acaCsk-CJWIMLGDZdGnsthyZsJfQ8ihXLyE8mTji8PgGkpbwhs7e1O0uitMgP_pGjHq2tey1BHSwoeCL49b18WyMIB10hK-q2BXGKQkykltjTrQbg7VsdFi0h57mGfO0IqAwYd55_hzHZNnyJMh4b0iPQFDwU7iTD7x9doHhZAvzElpkWbc_NKVw5_Mw3znjntSzbuPN105zlp4Niurin-_5BnukwvoJWLEJ-ZlF6hE4wKhaMB1pWTJjMvJQJE8khTTvlUN8tGxmzoaDYoe1aCGNxmDEQnx8Y5gKzVd89sylhqi54d2nQrJ2-ElfEDsMoXpR01Ps6fNDFtLTuPTp7ixj8LvgL2nCjAg996Ga3PtdvXJAZPDYCqqvaBkZZcsiqOgqLV0vGo3VVlfrcgJXQImMYRr_Inu0FCe47A93IAWuQTs-KplM1KdGJsHSnNBV6oe6QEkROJT5qZME-8xhvBYvOXqp9Znwg39bmiBCMxk26Ce66_vw06MNgoa3D5AlXPWemfdVKPZDnj_aLVjZSs0gAfFElcVn7l9yjWJOaT2Muk26U8bJl-2BEq_DSclqKHODuYM5kkPKIdE4NFrsqsDYuGxcA25rlNETFyl0q-UXj1aoz_joy5Hdnr4mFELmjnoo4jYQuakufP9xeGPsj1skaodKl0mmoGcCD6v1F60" } ``` @@ -90,7 +90,7 @@ The `refresh_token` also expires at a set interval, but a longer interval. Once Token timeouts are configurable in [harperdb-config.yaml](../../deployments/configuration) with the following parameters: -* `operationsApi.authentication.operationTokenTimeout`: Defines the length of time until the operation\_token expires (default 1d). -* `operationsApi.authentication.refreshTokenTimeout`: Defines the length of time until the refresh\_token expires (default 30d). +- `operationsApi.authentication.operationTokenTimeout`: Defines the length of time until the operation_token expires (default 1d). +- `operationsApi.authentication.refreshTokenTimeout`: Defines the length of time until the refresh_token expires (default 30d). A full list of valid values for both parameters can be found [here](https://github.com/vercel/ms). diff --git a/site/versioned_docs/version-4.3/developers/security/mtls-auth.md b/site/versioned_docs/version-4.3/developers/security/mtls-auth.md index 8c063693..be5cc5a6 100644 --- a/site/versioned_docs/version-4.3/developers/security/mtls-auth.md +++ b/site/versioned_docs/version-4.3/developers/security/mtls-auth.md @@ -4,4 +4,4 @@ title: mTLS Authentication # mTLS Authentication -HarperDB supports mTLS authentication for incoming connections. When enabled in the [HTTP config settings](../../deployments/configuration#http) the client certificate will be checked against the certificate authority specified with `tls.certificateAuthority`. If the certificate can be properly verified, the connection will authenticate users where the user's id/username is specified by the `CN` (common name) from the client certificate's `subject`, by default. The [HTTP config settings](../../deployments/configuration#http) allow you to determine if mTLS is required for all connections or optional. \ No newline at end of file +HarperDB supports mTLS authentication for incoming connections. When enabled in the [HTTP config settings](../../deployments/configuration#http) the client certificate will be checked against the certificate authority specified with `tls.certificateAuthority`. If the certificate can be properly verified, the connection will authenticate users where the user's id/username is specified by the `CN` (common name) from the client certificate's `subject`, by default. The [HTTP config settings](../../deployments/configuration#http) allow you to determine if mTLS is required for all connections or optional. diff --git a/site/versioned_docs/version-4.3/developers/security/users-and-roles.md b/site/versioned_docs/version-4.3/developers/security/users-and-roles.md index fa1bc5e7..96acae53 100644 --- a/site/versioned_docs/version-4.3/developers/security/users-and-roles.md +++ b/site/versioned_docs/version-4.3/developers/security/users-and-roles.md @@ -19,65 +19,66 @@ Role permissions in HarperDB are broken into two categories – permissions arou **Built-In Roles** -There are three built-in roles within HarperDB. See full breakdown of operations restricted to only super\_user roles [here](./users-and-roles#role-based-operation-restrictions). +There are three built-in roles within HarperDB. See full breakdown of operations restricted to only super_user roles [here](./users-and-roles#role-based-operation-restrictions). -* `super_user` - This role provides full access to all operations and methods within a HarperDB instance, this can be considered the admin role. - * This role provides full access to all Database Definition operations and the ability to run Database Manipulation operations across the entire database schema with no restrictions. -* `cluster_user` - This role is an internal system role type that is managed internally to allow clustered instances to communicate with one another. - * This role is an internally managed role to facilitate communication between clustered instances. -* `structure_user` - This role provides specific access for creation and deletion of data. - * When defining this role type you can either assign a value of true which will allow the role to create and drop databases & tables. Alternatively the role type can be assigned a string array. The values in this array are databases and allows the role to only create and drop tables in the designated databases. +- `super_user` - This role provides full access to all operations and methods within a HarperDB instance, this can be considered the admin role. + - This role provides full access to all Database Definition operations and the ability to run Database Manipulation operations across the entire database schema with no restrictions. +- `cluster_user` - This role is an internal system role type that is managed internally to allow clustered instances to communicate with one another. + - This role is an internally managed role to facilitate communication between clustered instances. +- `structure_user` - This role provides specific access for creation and deletion of data. + - When defining this role type you can either assign a value of true which will allow the role to create and drop databases & tables. Alternatively the role type can be assigned a string array. The values in this array are databases and allows the role to only create and drop tables in the designated databases. **User-Defined Roles** -In addition to built-in roles, admins (i.e. users assigned to the super\_user role) can create customized roles for other users to interact with and manipulate the data within explicitly defined tables and attributes. +In addition to built-in roles, admins (i.e. users assigned to the super_user role) can create customized roles for other users to interact with and manipulate the data within explicitly defined tables and attributes. -* Unless the user-defined role is given `super_user` permissions, permissions must be defined explicitly within the request body JSON. -* Describe operations will return metadata for all databases, tables, and attributes that a user-defined role has CRUD permissions for. +- Unless the user-defined role is given `super_user` permissions, permissions must be defined explicitly within the request body JSON. +- Describe operations will return metadata for all databases, tables, and attributes that a user-defined role has CRUD permissions for. **Role Permissions** When creating a new, user-defined role in a HarperDB instance, you must provide a role name and the permissions to assign to that role. _Reminder, only super users can create and manage roles._ -* `role` name used to easily identify the role assigned to individual users. +- `role` name used to easily identify the role assigned to individual users. - _Roles can be altered/dropped based on the role name used in and returned from a successful `add_role` , `alter_role`, or `list_roles` operation._ -* `permissions` used to explicitly define CRUD access to existing table data. + _Roles can be altered/dropped based on the role name used in and returned from a successful `add_role` , `alter_role`, or `list_roles` operation._ + +- `permissions` used to explicitly define CRUD access to existing table data. Example JSON for `add_role` request ```json { - "operation":"add_role", - "role":"software_developer", - "permission":{ - "super_user":false, - "database_name":{ - "tables": { - "table_name1": { - "read":true, - "insert":true, - "update":true, - "delete":false, - "attribute_permissions":[ - { - "attribute_name":"attribute1", - "read":true, - "insert":true, - "update":true - } - ] - }, - "table_name2": { - "read":true, - "insert":true, - "update":true, - "delete":false, - "attribute_permissions":[] - } - } - } - } + "operation": "add_role", + "role": "software_developer", + "permission": { + "super_user": false, + "database_name": { + "tables": { + "table_name1": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "attribute1", + "read": true, + "insert": true, + "update": true + } + ] + }, + "table_name2": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [] + } + } + } + } } ``` @@ -85,12 +86,13 @@ Example JSON for `add_role` request There are two parts to a permissions set: -* `super_user` – boolean value indicating if role should be provided super\_user access. +- `super_user` – boolean value indicating if role should be provided super_user access. + + _If `super_user` is set to true, there should be no additional database-specific permissions values included since the role will have access to the entire database schema. If permissions are included in the body of the operation, they will be stored within HarperDB, but ignored, as super_users have full access to the database._ - _If `super_user` is set to true, there should be no additional database-specific permissions values included since the role will have access to the entire database schema. If permissions are included in the body of the operation, they will be stored within HarperDB, but ignored, as super\_users have full access to the database._ -* `permissions`: Database tables that a role should have specific CRUD access to should be included in the final, database-specific `permissions` JSON. +- `permissions`: Database tables that a role should have specific CRUD access to should be included in the final, database-specific `permissions` JSON. - _For user-defined roles (i.e. non-super\_user roles, blank permissions will result in the user being restricted from accessing any of the database schema._ + _For user-defined roles (i.e. non-super_user roles, blank permissions will result in the user being restricted from accessing any of the database schema._ **Table Permissions JSON** @@ -124,139 +126,142 @@ Each table that a role should be given some level of CRUD permissions to must be 1. If there are attribute-specific CRUD permissions that need to be enforced on a table, those need to be explicitly described in the `attribute_permissions` array. 1. If a non-hash attribute is given some level of CRUD access, that same access will be assigned to the table’s `hash_attribute` (also referred to as the `primary_key`), even if it is not explicitly defined in the permissions JSON. - _See table\_name1’s permission set for an example of this – even though the table’s hash attribute is not specifically defined in the attribute\_permissions array, because the role has CRUD access to ‘attribute1’, the role will have the same access to the table’s hash attribute._ -1. If attribute-level permissions are set – _i.e. attribute\_permissions.length > 0_ – any table attribute not explicitly included will be assumed to have not CRUD access (with the exception of the `hash_attribute` described in #2). + _See table_name1’s permission set for an example of this – even though the table’s hash attribute is not specifically defined in the attribute_permissions array, because the role has CRUD access to ‘attribute1’, the role will have the same access to the table’s hash attribute._ + +1. If attribute-level permissions are set – _i.e. attribute_permissions.length > 0_ – any table attribute not explicitly included will be assumed to have not CRUD access (with the exception of the `hash_attribute` described in #2). + + _See table_name1’s permission set for an example of this – in this scenario, the role will have the ability to create, insert and update ‘attribute1’ and the table’s hash attribute but no other attributes on that table._ - _See table\_name1’s permission set for an example of this – in this scenario, the role will have the ability to create, insert and update ‘attribute1’ and the table’s hash attribute but no other attributes on that table._ 1. If an `attribute_permissions` array is empty, the role’s access to a table’s attributes will be based on the table-level CRUD permissions. - _See table\_name2’s permission set for an example of this._ + _See table_name2’s permission set for an example of this._ + 1. The `__createdtime__` and `__updatedtime__` attributes that HarperDB manages internally can have read perms set but, if set, all other attribute-level permissions will be ignored. 1. Please note that DELETE permissions are not included as a part of an individual attribute-level permission set. That is because it is not possible to delete individual attributes from a row, rows must be deleted in full. - * If a role needs the ability to delete rows from a table, that permission should be set on the table-level. - * The practical approach to deleting an individual attribute of a row would be to set that attribute to null via an update statement. + - If a role needs the ability to delete rows from a table, that permission should be set on the table-level. + - The practical approach to deleting an individual attribute of a row would be to set that attribute to null via an update statement. ## `Role-Based Operation Restrictions ` -The table below includes all API operations available in HarperDB and indicates whether or not the operation is restricted to super\_user roles. - -_Keep in mind that non-super\_user roles will also be restricted within the operations they do have access to by the database-level CRUD permissions set for the roles._ - -| Databases and Tables | Restricted to Super\_Users | -|----------------------| :------------------------: | -| describe\_all | | -| describe\_database | | -| describe\_table | | -| create\_database | X | -| drop\_database | X | -| create\_table | X | -| drop\_table | X | -| create\_attribute | | -| drop\_attribute | X | - -| NoSQL Operations | Restricted to Super\_Users | -| ---------------------- | :------------------------: | -| insert | | -| update | | -| upsert | | -| delete | | -| search\_by\_hash | | -| search\_by\_value | | -| search\_by\_conditions | | - -| SQL Operations | Restricted to Super\_Users | -| -------------- | :------------------------: | -| select | | -| insert | | -| update | | -| delete | | - -| Bulk Operations | Restricted to Super\_Users | -| ---------------- | :------------------------: | -| csv\_data\_load | | -| csv\_file\_load | | -| csv\_url\_load | | -| import\_from\_s3 | | - -| Users and Roles | Restricted to Super\_Users | -| --------------- | :------------------------: | -| list\_roles | X | -| add\_role | X | -| alter\_role | X | -| drop\_role | X | -| list\_users | X | -| user\_info | | -| add\_user | X | -| alter\_user | X | -| drop\_user | X | - -| Clustering | Restricted to Super\_Users | -| ----------------------- | :------------------------: | -| cluster\_set\_routes | X | -| cluster\_get\_routes | X | -| cluster\_delete\_routes | X | -| add\_node | X | -| update\_node | X | -| cluster\_status | X | -| remove\_node | X | -| configure\_cluster | X | - -| Components | Restricted to Super\_Users | -| -------------------- | :------------------------: | -| get\_components | X | -| get\_component\_file | X | -| set\_component\_file | X | -| drop\_component | X | -| add\_component | X | -| package\_component | X | -| deploy\_component | X | - -| Custom Functions | Restricted to Super\_Users | -| ---------------------------------- | :------------------------: | -| custom\_functions\_status | X | -| get\_custom\_functions | X | -| get\_custom\_function | X | -| set\_custom\_function | X | -| drop\_custom\_function | X | -| add\_custom\_function\_project | X | -| drop\_custom\_function\_project | X | -| package\_custom\_function\_project | X | -| deploy\_custom\_function\_project | X | - -| Registration | Restricted to Super\_Users | -| ------------------ | :------------------------: | -| registration\_info | | -| get\_fingerprint | X | -| set\_license | X | - -| Jobs | Restricted to Super\_Users | -| ----------------------------- | :------------------------: | -| get\_job | | -| search\_jobs\_by\_start\_date | X | - -| Logs | Restricted to Super\_Users | -| --------------------------------- | :------------------------: | -| read\_log | X | -| read\_transaction\_log | X | -| delete\_transaction\_logs\_before | X | -| read\_audit\_log | X | -| delete\_audit\_logs\_before | X | - -| Utilities | Restricted to Super\_Users | -| ----------------------- | :------------------------: | -| delete\_records\_before | X | -| export\_local | X | -| export\_to\_s3 | X | -| system\_information | X | -| restart | X | -| restart\_service | X | -| get\_configuration | X | -| configure\_cluster | X | - -| Token Authentication | Restricted to Super\_Users | -| ------------------------------ | :------------------------: | -| create\_authentication\_tokens | | -| refresh\_operation\_token | | +The table below includes all API operations available in HarperDB and indicates whether or not the operation is restricted to super_user roles. + +_Keep in mind that non-super_user roles will also be restricted within the operations they do have access to by the database-level CRUD permissions set for the roles._ + +| Databases and Tables | Restricted to Super_Users | +| -------------------- | :-----------------------: | +| describe_all | | +| describe_database | | +| describe_table | | +| create_database | X | +| drop_database | X | +| create_table | X | +| drop_table | X | +| create_attribute | | +| drop_attribute | X | + +| NoSQL Operations | Restricted to Super_Users | +| -------------------- | :-----------------------: | +| insert | | +| update | | +| upsert | | +| delete | | +| search_by_hash | | +| search_by_value | | +| search_by_conditions | | + +| SQL Operations | Restricted to Super_Users | +| -------------- | :-----------------------: | +| select | | +| insert | | +| update | | +| delete | | + +| Bulk Operations | Restricted to Super_Users | +| --------------- | :-----------------------: | +| csv_data_load | | +| csv_file_load | | +| csv_url_load | | +| import_from_s3 | | + +| Users and Roles | Restricted to Super_Users | +| --------------- | :-----------------------: | +| list_roles | X | +| add_role | X | +| alter_role | X | +| drop_role | X | +| list_users | X | +| user_info | | +| add_user | X | +| alter_user | X | +| drop_user | X | + +| Clustering | Restricted to Super_Users | +| --------------------- | :-----------------------: | +| cluster_set_routes | X | +| cluster_get_routes | X | +| cluster_delete_routes | X | +| add_node | X | +| update_node | X | +| cluster_status | X | +| remove_node | X | +| configure_cluster | X | + +| Components | Restricted to Super_Users | +| ------------------ | :-----------------------: | +| get_components | X | +| get_component_file | X | +| set_component_file | X | +| drop_component | X | +| add_component | X | +| package_component | X | +| deploy_component | X | + +| Custom Functions | Restricted to Super_Users | +| ------------------------------- | :-----------------------: | +| custom_functions_status | X | +| get_custom_functions | X | +| get_custom_function | X | +| set_custom_function | X | +| drop_custom_function | X | +| add_custom_function_project | X | +| drop_custom_function_project | X | +| package_custom_function_project | X | +| deploy_custom_function_project | X | + +| Registration | Restricted to Super_Users | +| ----------------- | :-----------------------: | +| registration_info | | +| get_fingerprint | X | +| set_license | X | + +| Jobs | Restricted to Super_Users | +| ------------------------- | :-----------------------: | +| get_job | | +| search_jobs_by_start_date | X | + +| Logs | Restricted to Super_Users | +| ------------------------------ | :-----------------------: | +| read_log | X | +| read_transaction_log | X | +| delete_transaction_logs_before | X | +| read_audit_log | X | +| delete_audit_logs_before | X | + +| Utilities | Restricted to Super_Users | +| --------------------- | :-----------------------: | +| delete_records_before | X | +| export_local | X | +| export_to_s3 | X | +| system_information | X | +| restart | X | +| restart_service | X | +| get_configuration | X | +| configure_cluster | X | + +| Token Authentication | Restricted to Super_Users | +| ---------------------------- | :-----------------------: | +| create_authentication_tokens | | +| refresh_operation_token | | ## Error: Must execute as User @@ -264,4 +269,4 @@ _Keep in mind that non-super\_user roles will also be restricted within the oper This means that you installed HarperDB as `<>`. Because HarperDB stores files natively on the operating system, we only allow the HarperDB executable to be run by a single user. This prevents permissions issues on files. -For example if you installed as user\_a, but later wanted to run as user\_b. User\_b may not have access to the hdb files HarperDB needs. This also keeps HarperDB more secure as it allows you to lock files down to a specific user and prevents other users from accessing your files. +For example if you installed as user_a, but later wanted to run as user_b. User_b may not have access to the hdb files HarperDB needs. This also keeps HarperDB more secure as it allows you to lock files down to a specific user and prevents other users from accessing your files. diff --git a/site/versioned_docs/version-4.3/developers/sql-guide/date-functions.md b/site/versioned_docs/version-4.3/developers/sql-guide/date-functions.md index b6a79ed1..99a782b8 100644 --- a/site/versioned_docs/version-4.3/developers/sql-guide/date-functions.md +++ b/site/versioned_docs/version-4.3/developers/sql-guide/date-functions.md @@ -44,6 +44,7 @@ Referencing this variable will evaluate as the current Unix Timestamp in millise "current_timestamp_result": 1587568845765 } ``` + ### DATE([date_string]) Formats and returns the date_string argument in UTC in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. @@ -68,9 +69,8 @@ If a date_string is not provided, the function will return the current UTC date/ Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. - | Key | Shorthand | -|--------------|-----------| +| ------------ | --------- | | years | y | | quarters | Q | | months | M | @@ -81,7 +81,6 @@ Adds the defined amount of time to the date provided in UTC and returns the resu | seconds | s | | milliseconds | ms | - ``` "SELECT DATE_ADD(1587568845765, 1, 'days') AS date_add_result" AND "SELECT DATE_ADD(1587568845765, 1, 'd') AS date_add_result" both return @@ -103,13 +102,14 @@ AS date_add_result2" returns Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. Accepted interval values: -* years -* months -* weeks -* days -* hours -* minutes -* seconds + +- years +- months +- weeks +- days +- hours +- minutes +- seconds ``` "SELECT DATE_DIFF(CURRENT_TIMESTAMP, 1650643129017, 'hours') @@ -136,7 +136,7 @@ AS date_format_result" returns Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date_sub interval values- Either string value (key or shorthand) can be passed as the interval argument. | Key | Shorthand | -|--------------|-----------| +| ------------ | --------- | | years | y | | quarters | Q | | months | M | @@ -147,7 +147,6 @@ Subtracts the defined amount of time from the date provided in UTC and returns t | seconds | s | | milliseconds | ms | - ``` "SELECT DATE_SUB(1587568845765, 2, 'years') AS date_sub_result" returns { @@ -159,15 +158,15 @@ Subtracts the defined amount of time from the date provided in UTC and returns t Extracts and returns the date_part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” -| date_part | Example return value* | -|--------------|------------------------| -| year | “2020” | -| month | “3” | -| day | “26” | - | hour | “15” | -| minute | “13” | -| second | “2” | -| millisecond | “41” | +| date_part | Example return value\* | +| ----------- | ---------------------- | +| year | “2020” | +| month | “3” | +| day | “26” | +| hour | “15” | +| minute | “13” | +| second | “2” | +| millisecond | “41” | ``` "SELECT EXTRACT(1587568845765, 'year') AS extract_result" returns @@ -188,6 +187,7 @@ Returns the current Unix Timestamp in milliseconds. ``` ### GET_SERVER_TIME() + Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. ``` @@ -198,6 +198,7 @@ Returns the current date/time value based on the server’s timezone in `YYYY-MM ``` ### OFFSET_UTC(date, offset) + Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. ``` @@ -215,6 +216,7 @@ Returns the UTC date time value with the offset provided included in the return ``` ### NOW() + Returns the current Unix Timestamp in milliseconds. ``` @@ -223,4 +225,3 @@ Returns the current Unix Timestamp in milliseconds. "now_result": 1587568845765 } ``` - diff --git a/site/versioned_docs/version-4.3/developers/sql-guide/features-matrix.md b/site/versioned_docs/version-4.3/developers/sql-guide/features-matrix.md index 63539ac3..e4175b9a 100644 --- a/site/versioned_docs/version-4.3/developers/sql-guide/features-matrix.md +++ b/site/versioned_docs/version-4.3/developers/sql-guide/features-matrix.md @@ -10,78 +10,77 @@ HarperDB encourages developers to utilize other querying tools over SQL for perf HarperDB provides access to most SQL functions, and we’re always expanding that list. Check below to see if we cover what you need. If not, feel free to [add a Feature Request](https://feedback.harperdb.io/). - | INSERT | | -|------------------------------------|-----| -| Values - multiple values supported | ✔ | +| ---------------------------------- | --- | +| Values - multiple values supported | ✔ | | Sub-SELECT | ✗ | -| UPDATE | | -|-----------------|-----| -| SET | ✔ | -| Sub-SELECT | ✗ | -| Conditions | ✔ | -| Date Functions* | ✔ | -| Math Functions | ✔ | +| UPDATE | | +| ---------------- | --- | +| SET | ✔ | +| Sub-SELECT | ✗ | +| Conditions | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | | DELETE | | -|------------|-----| -| FROM | ✔ | +| ---------- | --- | +| FROM | ✔ | | Sub-SELECT | ✗ | -| Conditions | ✔ | +| Conditions | ✔ | -| SELECT | | -|-----------------------|-----| -| Column SELECT | ✔ | -| Aliases | ✔ | -| Aggregator Functions | ✔ | -| Date Functions* | ✔ | -| Math Functions | ✔ | -| Constant Values | ✔ | -| Distinct | ✔ | -| Sub-SELECT | ✗ | +| SELECT | | +| -------------------- | --- | +| Column SELECT | ✔ | +| Aliases | ✔ | +| Aggregator Functions | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | +| Constant Values | ✔ | +| Distinct | ✔ | +| Sub-SELECT | ✗ | -| FROM | | -|-------------------|-----| -| Multi-table JOIN | ✔ | -| INNER JOIN | ✔ | -| LEFT OUTER JOIN | ✔ | -| LEFT INNER JOIN | ✔ | -| RIGHT OUTER JOIN | ✔ | -| RIGHT INNER JOIN | ✔ | -| FULL JOIN | ✔ | -| UNION | ✗ | -| Sub-SELECT | ✗ | -| TOP | ✔ | +| FROM | | +| ---------------- | --- | +| Multi-table JOIN | ✔ | +| INNER JOIN | ✔ | +| LEFT OUTER JOIN | ✔ | +| LEFT INNER JOIN | ✔ | +| RIGHT OUTER JOIN | ✔ | +| RIGHT INNER JOIN | ✔ | +| FULL JOIN | ✔ | +| UNION | ✗ | +| Sub-SELECT | ✗ | +| TOP | ✔ | | WHERE | | -|----------------------------|-----| -| Multi-Conditions | ✔ | -| Wildcards | ✔ | -| IN | ✔ | -| LIKE | ✔ | -| Bit-wise Operators AND, OR | ✔ | -| Bit-wise Operators NOT | ✔ | -| NULL | ✔ | -| BETWEEN | ✔ | -| EXISTS,ANY,ALL | ✔ | -| Compare columns | ✔ | -| Compare constants | ✔ | -| Date Functions* | ✔ | -| Math Functions | ✔ | -| Sub-SELECT | ✗ | +| -------------------------- | --- | +| Multi-Conditions | ✔ | +| Wildcards | ✔ | +| IN | ✔ | +| LIKE | ✔ | +| Bit-wise Operators AND, OR | ✔ | +| Bit-wise Operators NOT | ✔ | +| NULL | ✔ | +| BETWEEN | ✔ | +| EXISTS,ANY,ALL | ✔ | +| Compare columns | ✔ | +| Compare constants | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | +| Sub-SELECT | ✗ | | GROUP BY | | -|-----------------------|-----| -| Multi-Column GROUP BY | ✔ | +| --------------------- | --- | +| Multi-Column GROUP BY | ✔ | -| HAVING | | -|--------------------------------|-----| -| Aggregate function conditions | ✔ | +| HAVING | | +| ----------------------------- | --- | +| Aggregate function conditions | ✔ | | ORDER BY | | -|-----------------------|-----| -| Multi-Column ORDER BY | ✔ | -| Aliases | ✔ | -| Date Functions* | ✔ | -| Math Functions | ✔ | \ No newline at end of file +| --------------------- | --- | +| Multi-Column ORDER BY | ✔ | +| Aliases | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | diff --git a/site/versioned_docs/version-4.3/developers/sql-guide/functions.md b/site/versioned_docs/version-4.3/developers/sql-guide/functions.md index 480f46f4..852ac9b5 100644 --- a/site/versioned_docs/version-4.3/developers/sql-guide/functions.md +++ b/site/versioned_docs/version-4.3/developers/sql-guide/functions.md @@ -11,147 +11,149 @@ HarperDB encourages developers to utilize other querying tools over SQL for perf This SQL keywords reference contains the SQL functions available in HarperDB. ## Functions + ### Aggregate -| Keyword | Syntax | Description | -|-----------------|---------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| -| AVG | AVG(_expression_) | Returns the average of a given numeric expression. | -| COUNT | SELECT COUNT(_column_name_) FROM _database.table_ WHERE _condition_ | Returns the number records that match the given criteria. Nulls are not counted. | -| GROUP_CONCAT | GROUP_CONCAT(_expression_) | Returns a string with concatenated values that are comma separated and that are non-null from a group. Will return null when there are non-null values. | -| MAX | SELECT MAX(_column_name_) FROM _database.table_ WHERE _condition_ | Returns largest value in a specified column. | -| MIN | SELECT MIN(_column_name_) FROM _database.table_ WHERE _condition_ | Returns smallest value in a specified column. | -| SUM | SUM(_column_name_) | Returns the sum of the numeric values provided. | -| ARRAY* | ARRAY(_expression_) | Returns a list of data as a field. | -| DISTINCT_ARRAY* | DISTINCT_ARRAY(_expression_) | When placed around a standard ARRAY() function, returns a distinct (deduplicated) results set. | +| Keyword | Syntax | Description | +| ---------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| AVG | AVG(_expression_) | Returns the average of a given numeric expression. | +| COUNT | SELECT COUNT(_column_name_) FROM _database.table_ WHERE _condition_ | Returns the number records that match the given criteria. Nulls are not counted. | +| GROUP_CONCAT | GROUP*CONCAT(\_expression*) | Returns a string with concatenated values that are comma separated and that are non-null from a group. Will return null when there are non-null values. | +| MAX | SELECT MAX(_column_name_) FROM _database.table_ WHERE _condition_ | Returns largest value in a specified column. | +| MIN | SELECT MIN(_column_name_) FROM _database.table_ WHERE _condition_ | Returns smallest value in a specified column. | +| SUM | SUM(_column_name_) | Returns the sum of the numeric values provided. | +| ARRAY\* | ARRAY(_expression_) | Returns a list of data as a field. | +| DISTINCT_ARRAY\* | DISTINCT*ARRAY(\_expression*) | When placed around a standard ARRAY() function, returns a distinct (deduplicated) results set. | -*For more information on ARRAY() and DISTINCT_ARRAY() see [this blog](https://www.harperdb.io/post/sql-queries-to-complex-objects). +\*For more information on ARRAY() and DISTINCT_ARRAY() see [this blog](https://www.harperdb.io/post/sql-queries-to-complex-objects). ### Conversion -| Keyword | Syntax | Description | -|---------|--------------------------------------------------|------------------------------------------------------------------------| -| CAST | CAST(_expression AS datatype(length)_) | Converts a value to a specified datatype. | -| CONVERT | CONVERT(_data_type(length), expression, style_) | Converts a value from one datatype to a different, specified datatype. | - +| Keyword | Syntax | Description | +| ------- | ----------------------------------------------- | ---------------------------------------------------------------------- | +| CAST | CAST(_expression AS datatype(length)_) | Converts a value to a specified datatype. | +| CONVERT | CONVERT(_data_type(length), expression, style_) | Converts a value from one datatype to a different, specified datatype. | ### Date & Time -| Keyword | Syntax | Description | -|-------------------|-----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CURRENT_DATE | CURRENT_DATE() | Returns the current date in UTC in “YYYY-MM-DD” String format. | -| CURRENT_TIME | CURRENT_TIME() | Returns the current time in UTC in “HH:mm:ss.SSS” string format. | -| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | Referencing this variable will evaluate as the current Unix Timestamp in milliseconds. For more information, go here. | +| Keyword | Syntax | Description | +| ----------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------- | +| CURRENT_DATE | CURRENT_DATE() | Returns the current date in UTC in “YYYY-MM-DD” String format. | +| CURRENT_TIME | CURRENT_TIME() | Returns the current time in UTC in “HH:mm:ss.SSS” string format. | +| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | Referencing this variable will evaluate as the current Unix Timestamp in milliseconds. For more information, go here. | + | -| DATE | DATE([_date_string_]) | Formats and returns the date_string argument in UTC in ‘YYYY-MM-DDTHH:mm:ss.SSSZZ’ string format. If a date_string is not provided, the function will return the current UTC date/time value in the return format defined above. For more information, go here. | +| DATE | DATE([_date_string_]) | Formats and returns the date*string argument in UTC in ‘YYYY-MM-DDTHH:mm:ss.SSSZZ’ string format. If a date_string is not provided, the function will return the current UTC date/time value in the return format defined above. For more information, go here. | | -| DATE_ADD | DATE_ADD(_date, value, interval_) | Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | +| DATE_ADD | DATE_ADD(\_date, value, interval*) | Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | | -| DATE_DIFF | DATEDIFF(_date_1, date_2[, interval]_) | Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. For more information, go here. | +| DATE*DIFF | DATEDIFF(\_date_1, date_2[, interval]*) | Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. For more information, go here. | | -| DATE_FORMAT | DATE_FORMAT(_date, format_) | Formats and returns a date value in the String format provided. Find more details on accepted format values in the moment.js docs. For more information, go here. | +| DATE*FORMAT | DATE_FORMAT(\_date, format*) | Formats and returns a date value in the String format provided. Find more details on accepted format values in the moment.js docs. For more information, go here. | | -| DATE_SUB | DATE_SUB(_date, format_) | Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date_sub interval values- Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | +| DATE*SUB | DATE_SUB(\_date, format*) | Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date*sub interval values- Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | | -| DAY | DAY(_date_) | Return the day of the month for the given date. | +| DAY | DAY(\_date*) | Return the day of the month for the given date. | | -| DAYOFWEEK | DAYOFWEEK(_date_) | Returns the numeric value of the weekday of the date given(“YYYY-MM-DD”).NOTE: 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, and 6=Saturday. | -| EXTRACT | EXTRACT(_date, date_part_) | Extracts and returns the date_part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” For more information, go here. | +| DAYOFWEEK | DAYOFWEEK(_date_) | Returns the numeric value of the weekday of the date given(“YYYY-MM-DD”).NOTE: 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, and 6=Saturday. | +| EXTRACT | EXTRACT(_date, date_part_) | Extracts and returns the date*part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” For more information, go here. | | -| GETDATE | GETDATE() | Returns the current Unix Timestamp in milliseconds. | -| GET_SERVER_TIME | GET_SERVER_TIME() | Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. | -| OFFSET_UTC | OFFSET_UTC(_date, offset_) | Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. | -| NOW | NOW() | Returns the current Unix Timestamp in milliseconds. | +| GETDATE | GETDATE() | Returns the current Unix Timestamp in milliseconds. | +| GET_SERVER_TIME | GET_SERVER_TIME() | Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. | +| OFFSET_UTC | OFFSET_UTC(\_date, offset*) | Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. | +| NOW | NOW() | Returns the current Unix Timestamp in milliseconds. | | -| HOUR | HOUR(_datetime_) | Returns the hour part of a given date in range of 0 to 838. | +| HOUR | HOUR(_datetime_) | Returns the hour part of a given date in range of 0 to 838. | | -| MINUTE | MINUTE(_datetime_) | Returns the minute part of a time/datetime in range of 0 to 59. | +| MINUTE | MINUTE(_datetime_) | Returns the minute part of a time/datetime in range of 0 to 59. | | -| MONTH | MONTH(_date_) | Returns month part for a specified date in range of 1 to 12. | +| MONTH | MONTH(_date_) | Returns month part for a specified date in range of 1 to 12. | | -| SECOND | SECOND(_datetime_) | Returns the seconds part of a time/datetime in range of 0 to 59. | -| YEAR | YEAR(_date_) | Returns the year part for a specified date. | +| SECOND | SECOND(_datetime_) | Returns the seconds part of a time/datetime in range of 0 to 59. | +| YEAR | YEAR(_date_) | Returns the year part for a specified date. | | ### Logical -| Keyword | Syntax | Description | -|---------|--------------------------------------------------|--------------------------------------------------------------------------------------------| -| IF | IF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | -| IIF | IIF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | -| IFNULL | IFNULL(_expression, alt_value_) | Returns a specified value if the expression is null. | -| NULLIF | NULLIF(_expression_1, expression_2_) | Returns null if expression_1 is equal to expression_2, if not equal, returns expression_1. | +| Keyword | Syntax | Description | +| ------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------ | +| IF | IF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | +| IIF | IIF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | +| IFNULL | IFNULL(_expression, alt_value_) | Returns a specified value if the expression is null. | +| NULLIF | NULLIF(_expression_1, expression_2_) | Returns null if expression_1 is equal to expression_2, if not equal, returns expression_1. | ### Mathematical -| Keyword | Syntax | Description | -|---------|---------------------------------|-----------------------------------------------------------------------------------------------------| -| ABS | ABS(_expression_) | Returns the absolute value of a given numeric expression. | -| CEIL | CEIL(_number_) | Returns integer ceiling, the smallest integer value that is bigger than or equal to a given number. | -| EXP | EXP(_number_) | Returns e to the power of a specified number. | -| FLOOR | FLOOR(_number_) | Returns the largest integer value that is smaller than, or equal to, a given number. | -| RANDOM | RANDOM(_seed_) | Returns a pseudo random number. | -| ROUND | ROUND(_number,decimal_places_) | Rounds a given number to a specified number of decimal places. | -| SQRT | SQRT(_expression_) | Returns the square root of an expression. | - +| Keyword | Syntax | Description | +| ------- | ------------------------------ | --------------------------------------------------------------------------------------------------- | +| ABS | ABS(_expression_) | Returns the absolute value of a given numeric expression. | +| CEIL | CEIL(_number_) | Returns integer ceiling, the smallest integer value that is bigger than or equal to a given number. | +| EXP | EXP(_number_) | Returns e to the power of a specified number. | +| FLOOR | FLOOR(_number_) | Returns the largest integer value that is smaller than, or equal to, a given number. | +| RANDOM | RANDOM(_seed_) | Returns a pseudo random number. | +| ROUND | ROUND(_number,decimal_places_) | Rounds a given number to a specified number of decimal places. | +| SQRT | SQRT(_expression_) | Returns the square root of an expression. | ### String -| Keyword | Syntax | Description | -|-------------|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CONCAT | CONCAT(_string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together, resulting in a single string. | -| CONCAT_WS | CONCAT_WS(_separator, string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together with a separator, resulting in a single string. | -| INSTR | INSTR(_string_1, string_2_) | Returns the first position, as an integer, of string_2 within string_1. | -| LEN | LEN(_string_) | Returns the length of a string. | -| LOWER | LOWER(_string_) | Converts a string to lower-case. | -| REGEXP | SELECT _column_name_ FROM _database.table_ WHERE _column_name_ REGEXP _pattern_ | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | -| REGEXP_LIKE | SELECT _column_name_ FROM _database.table_ WHERE REGEXP_LIKE(_column_name, pattern_) | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | -| REPLACE | REPLACE(_string, old_string, new_string_) | Replaces all instances of old_string within new_string, with string. | -| SUBSTRING | SUBSTRING(_string, string_position, length_of_substring_) | Extracts a specified amount of characters from a string. | -| TRIM | TRIM([_character(s) FROM_] _string_) | Removes leading and trailing spaces, or specified character(s), from a string. | -| UPPER | UPPER(_string_) | Converts a string to upper-case. | +| Keyword | Syntax | Description | +| ----------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| CONCAT | CONCAT(_string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together, resulting in a single string. | +| CONCAT_WS | CONCAT*WS(\_separator, string_1, string_2, ...., string_n*) | Concatenates, or joins, two or more strings together with a separator, resulting in a single string. | +| INSTR | INSTR(_string_1, string_2_) | Returns the first position, as an integer, of string_2 within string_1. | +| LEN | LEN(_string_) | Returns the length of a string. | +| LOWER | LOWER(_string_) | Converts a string to lower-case. | +| REGEXP | SELECT _column_name_ FROM _database.table_ WHERE _column_name_ REGEXP _pattern_ | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | +| REGEXP_LIKE | SELECT _column_name_ FROM _database.table_ WHERE REGEXP*LIKE(\_column_name, pattern*) | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | +| REPLACE | REPLACE(_string, old_string, new_string_) | Replaces all instances of old_string within new_string, with string. | +| SUBSTRING | SUBSTRING(_string, string_position, length_of_substring_) | Extracts a specified amount of characters from a string. | +| TRIM | TRIM([_character(s) FROM_] _string_) | Removes leading and trailing spaces, or specified character(s), from a string. | +| UPPER | UPPER(_string_) | Converts a string to upper-case. | ## Operators + ### Logical Operators -| Keyword | Syntax | Description | -|----------|--------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------| -| BETWEEN | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ BETWEEN _value_1_ AND _value_2_ | (inclusive) Returns values(numbers, text, or dates) within a given range. | -| IN | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IN(_value(s)_) | Used to specify multiple values in a WHERE clause. | -| LIKE | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_n_ LIKE _pattern_ | Searches for a specified pattern within a WHERE clause. | +| Keyword | Syntax | Description | +| ------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| BETWEEN | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ BETWEEN _value_1_ AND _value_2_ | (inclusive) Returns values(numbers, text, or dates) within a given range. | +| IN | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IN(_value(s)_) | Used to specify multiple values in a WHERE clause. | +| LIKE | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_n_ LIKE _pattern_ | Searches for a specified pattern within a WHERE clause. | ## Queries + ### General -| Keyword | Syntax | Description | -|-----------|--------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------| -| DISTINCT | SELECT DISTINCT _column_name(s)_ FROM _database.table_ | Returns only unique values, eliminating duplicate records. | -| FROM | FROM _database.table_ | Used to list the database(s), table(s), and any joins required for a SQL statement. | -| GROUP BY | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ GROUP BY _column_name(s)_ ORDER BY _column_name(s)_ | Groups rows that have the same values into summary rows. | -| HAVING | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ GROUP BY _column_name(s)_ HAVING _condition_ ORDER BY _column_name(s)_ | Filters data based on a group or aggregate function. | -| SELECT | SELECT _column_name(s)_ FROM _database.table_ | Selects data from table. | -| WHERE | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ | Extracts records based on a defined condition. | +| Keyword | Syntax | Description | +| -------- | -------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| DISTINCT | SELECT DISTINCT _column_name(s)_ FROM _database.table_ | Returns only unique values, eliminating duplicate records. | +| FROM | FROM _database.table_ | Used to list the database(s), table(s), and any joins required for a SQL statement. | +| GROUP BY | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ GROUP BY _column_name(s)_ ORDER BY _column_name(s)_ | Groups rows that have the same values into summary rows. | +| HAVING | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ GROUP BY _column_name(s)_ HAVING _condition_ ORDER BY _column_name(s)_ | Filters data based on a group or aggregate function. | +| SELECT | SELECT _column_name(s)_ FROM _database.table_ | Selects data from table. | +| WHERE | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ | Extracts records based on a defined condition. | ### Joins -| Keyword | Syntax | Description | -|---------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CROSS JOIN | SELECT _column_name(s)_ FROM _database.table_1_ CROSS JOIN _database.table_2_ | Returns a paired combination of each row from _table_1_ with row from _table_2_. _Note: CROSS JOIN can return very large result sets and is generally considered bad practice._ | -| FULL OUTER | SELECT _column_name(s)_ FROM _database.table_1_ FULL OUTER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ WHERE _condition_ | Returns all records when there is a match in either _table_1_ (left table) or _table_2_ (right table). | -| [INNER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ INNER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return only matching records from _table_1_ (left table) and _table_2_ (right table). The INNER keyword is optional and does not affect the result. | -| LEFT [OUTER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ LEFT OUTER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return all records from _table_1_ (left table) and matching data from _table_2_ (right table). The OUTER keyword is optional and does not affect the result. | -| RIGHT [OUTER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ RIGHT OUTER JOIN _database.table_2_ ON _table_1.column_name = table_2.column_name_ | Return all records from _table_2_ (right table) and matching data from _table_1_ (left table). The OUTER keyword is optional and does not affect the result. | +| Keyword | Syntax | Description | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| CROSS JOIN | SELECT _column_name(s)_ FROM _database.table_1_ CROSS JOIN _database.table_2_ | Returns a paired combination of each row from _table_1_ with row from _table_2_. _Note: CROSS JOIN can return very large result sets and is generally considered bad practice._ | +| FULL OUTER | SELECT _column_name(s)_ FROM _database.table_1_ FULL OUTER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ WHERE _condition_ | Returns all records when there is a match in either _table_1_ (left table) or _table_2_ (right table). | +| [INNER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ INNER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return only matching records from _table_1_ (left table) and _table_2_ (right table). The INNER keyword is optional and does not affect the result. | +| LEFT [OUTER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ LEFT OUTER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return all records from _table_1_ (left table) and matching data from _table_2_ (right table). The OUTER keyword is optional and does not affect the result. | +| RIGHT [OUTER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ RIGHT OUTER JOIN _database.table_2_ ON _table_1.column_name = table_2.column_name_ | Return all records from _table_2_ (right table) and matching data from _table_1_ (left table). The OUTER keyword is optional and does not affect the result. | ### Predicates -| Keyword | Syntax | Description | -|--------------|------------------------------------------------------------------------------|----------------------------| -| IS NOT NULL | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IS NOT NULL | Tests for non-null values. | -| IS NULL | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IS NULL | Tests for null values. | +| Keyword | Syntax | Description | +| ----------- | ----------------------------------------------------------------------------- | -------------------------- | +| IS NOT NULL | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IS NOT NULL | Tests for non-null values. | +| IS NULL | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IS NULL | Tests for null values. | ### Statements -| Keyword | Syntax | Description | -|---------|---------------------------------------------------------------------------------------------|-------------------------------------| +| Keyword | Syntax | Description | +| ------- | --------------------------------------------------------------------------------------------- | ----------------------------------- | | DELETE | DELETE FROM _database.table_ WHERE condition | Deletes existing data from a table. | | INSERT | INSERT INTO _database.table(column_name(s))_ VALUES(_value(s)_) | Inserts new records into a table. | | UPDATE | UPDATE _database.table_ SET _column_1 = value_1, column_2 = value_2, ....,_ WHERE _condition_ | Alters existing records in a table. | diff --git a/site/versioned_docs/version-4.3/developers/sql-guide/index.md b/site/versioned_docs/version-4.3/developers/sql-guide/index.md index ae274bd3..9d5246c1 100644 --- a/site/versioned_docs/version-4.3/developers/sql-guide/index.md +++ b/site/versioned_docs/version-4.3/developers/sql-guide/index.md @@ -72,9 +72,9 @@ DELETE FROM dev.dog HarperDB allows developers to join any number of tables and currently supports the following join types: -* INNER JOIN LEFT -* INNER JOIN LEFT -* OUTER JOIN +- INNER JOIN LEFT +- INNER JOIN LEFT +- OUTER JOIN Here’s a basic example joining two tables from our Get Started example- joining a dogs table with a breeds table: diff --git a/site/versioned_docs/version-4.3/developers/sql-guide/json-search.md b/site/versioned_docs/version-4.3/developers/sql-guide/json-search.md index c22cf74f..94905614 100644 --- a/site/versioned_docs/version-4.3/developers/sql-guide/json-search.md +++ b/site/versioned_docs/version-4.3/developers/sql-guide/json-search.md @@ -8,11 +8,11 @@ HarperDB encourages developers to utilize other querying tools over SQL for perf # SQL JSON Search -HarperDB automatically indexes all top level attributes in a row / object written to a table. However, any attributes which hold JSON data do not have their nested attributes indexed. In order to make searching and/or transforming these JSON documents easy, HarperDB offers a special SQL function called SEARCH\_JSON. The SEARCH\_JSON function works in SELECT & WHERE clauses allowing queries to perform powerful filtering on any element of your JSON by implementing the [JSONata library](https://docs.jsonata.org/overview.html) into our SQL engine. +HarperDB automatically indexes all top level attributes in a row / object written to a table. However, any attributes which hold JSON data do not have their nested attributes indexed. In order to make searching and/or transforming these JSON documents easy, HarperDB offers a special SQL function called SEARCH_JSON. The SEARCH_JSON function works in SELECT & WHERE clauses allowing queries to perform powerful filtering on any element of your JSON by implementing the [JSONata library](https://docs.jsonata.org/overview.html) into our SQL engine. ## Syntax -SEARCH\_JSON(_expression, attribute_) +SEARCH_JSON(_expression, attribute_) Executes the supplied string _expression_ against data of the defined top level _attribute_ for each row. The expression both filters and defines output from the JSON document. @@ -24,14 +24,14 @@ Here are two records in the database: ```json [ - { - "id": 1, - "name": ["Harper", "Penny"] - }, - { - "id": 2, - "name": ["Penny"] - } + { + "id": 1, + "name": ["Harper", "Penny"] + }, + { + "id": 2, + "name": ["Penny"] + } ] ``` @@ -64,37 +64,37 @@ A sample of this data from the movie The Avengers looks like ```json [ - { - "cast_id": 46, - "character": "Tony Stark / Iron Man", - "credit_id": "52fe4495c3a368484e02b251", - "gender": "male", - "id": 3223, - "name": "Robert Downey Jr.", - "order": 0 - }, - { - "cast_id": 2, - "character": "Steve Rogers / Captain America", - "credit_id": "52fe4495c3a368484e02b19b", - "gender": "male", - "id": 16828, - "name": "Chris Evans", - "order": 1 - }, - { - "cast_id": 307, - "character": "Bruce Banner / The Hulk", - "credit_id": "5e85e8083344c60015411cfa", - "gender": "male", - "id": 103, - "name": "Mark Ruffalo", - "order": 2 - } + { + "cast_id": 46, + "character": "Tony Stark / Iron Man", + "credit_id": "52fe4495c3a368484e02b251", + "gender": "male", + "id": 3223, + "name": "Robert Downey Jr.", + "order": 0 + }, + { + "cast_id": 2, + "character": "Steve Rogers / Captain America", + "credit_id": "52fe4495c3a368484e02b19b", + "gender": "male", + "id": 16828, + "name": "Chris Evans", + "order": 1 + }, + { + "cast_id": 307, + "character": "Bruce Banner / The Hulk", + "credit_id": "5e85e8083344c60015411cfa", + "gender": "male", + "id": 103, + "name": "Mark Ruffalo", + "order": 2 + } ] ``` -Let’s break down the SEARCH\_JSON function call in the SELECT: +Let’s break down the SEARCH_JSON function call in the SELECT: ``` SEARCH_JSON( @@ -117,7 +117,7 @@ SEARCH_JSON( ) ``` -The first argument passed to SEARCH\_JSON is the expression to execute against the second argument which is the cast attribute on the credits table. This expression will execute for every row. Looking into the expression it starts with “$\[…]” this tells the expression to iterate all elements of the cast array. +The first argument passed to SEARCH_JSON is the expression to execute against the second argument which is the cast attribute on the credits table. This expression will execute for every row. Looking into the expression it starts with “$\[…]” this tells the expression to iterate all elements of the cast array. Then the expression tells the function to only return entries where the name attribute matches any of the actors defined in the array: @@ -131,22 +131,22 @@ So far, we’ve iterated the array and filtered out rows, but we also want the r ```json [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - } + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + } ] ``` -Just having the SEARCH\_JSON function in our SELECT is powerful, but given our criteria it would still return every other movie that doesn’t have our matching actors, in order to filter out the movies we do not want we also use SEARCH\_JSON in the WHERE clause. +Just having the SEARCH_JSON function in our SELECT is powerful, but given our criteria it would still return every other movie that doesn’t have our matching actors, in order to filter out the movies we do not want we also use SEARCH_JSON in the WHERE clause. This function call in the WHERE clause is similar, but we don’t need to perform the same transformation as occurred in the SELECT: @@ -172,6 +172,6 @@ SEARCH_JSON( As seen above we execute the same name filter against the cast array, the primary difference is we are wrapping the filtered results in $count(…). As it looks this returns a count of the results back which we then use against our SQL comparator of >= 2. -To see further SEARCH\_JSON examples in action view our Postman Collection that provides a [sample database & data with query examples](../operations-api/advanced-json-sql-examples). +To see further SEARCH_JSON examples in action view our Postman Collection that provides a [sample database & data with query examples](../operations-api/advanced-json-sql-examples). To learn more about how to build expressions check out the JSONata documentation: [https://docs.jsonata.org/overview](https://docs.jsonata.org/overview) diff --git a/site/versioned_docs/version-4.3/developers/sql-guide/reserved-word.md b/site/versioned_docs/version-4.3/developers/sql-guide/reserved-word.md index 3794a7ae..40019b59 100644 --- a/site/versioned_docs/version-4.3/developers/sql-guide/reserved-word.md +++ b/site/versioned_docs/version-4.3/developers/sql-guide/reserved-word.md @@ -8,7 +8,7 @@ HarperDB encourages developers to utilize other querying tools over SQL for perf # HarperDB SQL Reserved Words -This is a list of reserved words in the SQL Parser. Use of these words or symbols may result in unexpected behavior or inaccessible tables/attributes. If any of these words must be used, any SQL call referencing a database, table, or attribute must have backticks (`…`) or brackets ([…]) around the variable. +This is a list of reserved words in the SQL Parser. Use of these words or symbols may result in unexpected behavior or inaccessible tables/attributes. If any of these words must be used, any SQL call referencing a database, table, or attribute must have backticks (`…`) or brackets ([…]) around the variable. For Example, for a table called `ASSERT` in the `data` database, a SQL select on that table would look like: @@ -24,184 +24,184 @@ SELECT * from data.[ASSERT] ### RESERVED WORD LIST -* ABSOLUTE -* ACTION -* ADD -* AGGR -* ALL -* ALTER -* AND -* ANTI -* ANY -* APPLY -* ARRAY -* AS -* ASSERT -* ASC -* ATTACH -* AUTOINCREMENT -* AUTO_INCREMENT -* AVG -* BEGIN -* BETWEEN -* BREAK -* BY -* CALL -* CASE -* CAST -* CHECK -* CLASS -* CLOSE -* COLLATE -* COLUMN -* COLUMNS -* COMMIT -* CONSTRAINT -* CONTENT -* CONTINUE -* CONVERT -* CORRESPONDING -* COUNT -* CREATE -* CROSS -* CUBE -* CURRENT_TIMESTAMP -* CURSOR -* DATABASE -* DECLARE -* DEFAULT -* DELETE -* DELETED -* DESC -* DETACH -* DISTINCT -* DOUBLEPRECISION -* DROP -* ECHO -* EDGE -* END -* ENUM -* ELSE -* EXCEPT -* EXISTS -* EXPLAIN -* FALSE -* FETCH -* FIRST -* FOREIGN -* FROM -* GO -* GRAPH -* GROUP -* GROUPING -* HAVING -* HDB_HASH -* HELP -* IF -* IDENTITY -* IS -* IN -* INDEX -* INNER -* INSERT -* INSERTED -* INTERSECT -* INTO -* JOIN -* KEY -* LAST -* LET -* LEFT -* LIKE -* LIMIT -* LOOP -* MATCHED -* MATRIX -* MAX -* MERGE -* MIN -* MINUS -* MODIFY -* NATURAL -* NEXT -* NEW -* NOCASE -* NO -* NOT -* NULL -* OFF -* ON -* ONLY -* OFFSET -* OPEN -* OPTION -* OR -* ORDER -* OUTER -* OVER -* PATH -* PARTITION -* PERCENT -* PLAN -* PRIMARY -* PRINT -* PRIOR -* QUERY -* READ -* RECORDSET -* REDUCE -* REFERENCES -* RELATIVE -* REPLACE -* REMOVE -* RENAME -* REQUIRE -* RESTORE -* RETURN -* RETURNS -* RIGHT -* ROLLBACK -* ROLLUP -* ROW -* SCHEMA -* SCHEMAS -* SEARCH -* SELECT -* SEMI -* SET -* SETS -* SHOW -* SOME -* SOURCE -* STRATEGY -* STORE -* SYSTEM -* SUM -* TABLE -* TABLES -* TARGET -* TEMP -* TEMPORARY -* TEXTSTRING -* THEN -* TIMEOUT -* TO -* TOP -* TRAN -* TRANSACTION -* TRIGGER -* TRUE -* TRUNCATE -* UNION -* UNIQUE -* UPDATE -* USE -* USING -* VALUE -* VERTEX -* VIEW -* WHEN -* WHERE -* WHILE -* WITH -* WORK +- ABSOLUTE +- ACTION +- ADD +- AGGR +- ALL +- ALTER +- AND +- ANTI +- ANY +- APPLY +- ARRAY +- AS +- ASSERT +- ASC +- ATTACH +- AUTOINCREMENT +- AUTO_INCREMENT +- AVG +- BEGIN +- BETWEEN +- BREAK +- BY +- CALL +- CASE +- CAST +- CHECK +- CLASS +- CLOSE +- COLLATE +- COLUMN +- COLUMNS +- COMMIT +- CONSTRAINT +- CONTENT +- CONTINUE +- CONVERT +- CORRESPONDING +- COUNT +- CREATE +- CROSS +- CUBE +- CURRENT_TIMESTAMP +- CURSOR +- DATABASE +- DECLARE +- DEFAULT +- DELETE +- DELETED +- DESC +- DETACH +- DISTINCT +- DOUBLEPRECISION +- DROP +- ECHO +- EDGE +- END +- ENUM +- ELSE +- EXCEPT +- EXISTS +- EXPLAIN +- FALSE +- FETCH +- FIRST +- FOREIGN +- FROM +- GO +- GRAPH +- GROUP +- GROUPING +- HAVING +- HDB_HASH +- HELP +- IF +- IDENTITY +- IS +- IN +- INDEX +- INNER +- INSERT +- INSERTED +- INTERSECT +- INTO +- JOIN +- KEY +- LAST +- LET +- LEFT +- LIKE +- LIMIT +- LOOP +- MATCHED +- MATRIX +- MAX +- MERGE +- MIN +- MINUS +- MODIFY +- NATURAL +- NEXT +- NEW +- NOCASE +- NO +- NOT +- NULL +- OFF +- ON +- ONLY +- OFFSET +- OPEN +- OPTION +- OR +- ORDER +- OUTER +- OVER +- PATH +- PARTITION +- PERCENT +- PLAN +- PRIMARY +- PRINT +- PRIOR +- QUERY +- READ +- RECORDSET +- REDUCE +- REFERENCES +- RELATIVE +- REPLACE +- REMOVE +- RENAME +- REQUIRE +- RESTORE +- RETURN +- RETURNS +- RIGHT +- ROLLBACK +- ROLLUP +- ROW +- SCHEMA +- SCHEMAS +- SEARCH +- SELECT +- SEMI +- SET +- SETS +- SHOW +- SOME +- SOURCE +- STRATEGY +- STORE +- SYSTEM +- SUM +- TABLE +- TABLES +- TARGET +- TEMP +- TEMPORARY +- TEXTSTRING +- THEN +- TIMEOUT +- TO +- TOP +- TRAN +- TRANSACTION +- TRIGGER +- TRUE +- TRUNCATE +- UNION +- UNIQUE +- UPDATE +- USE +- USING +- VALUE +- VERTEX +- VIEW +- WHEN +- WHERE +- WHILE +- WITH +- WORK diff --git a/site/versioned_docs/version-4.3/developers/sql-guide/sql-geospatial-functions.md b/site/versioned_docs/version-4.3/developers/sql-guide/sql-geospatial-functions.md index 1037610f..c08aaf05 100644 --- a/site/versioned_docs/version-4.3/developers/sql-guide/sql-geospatial-functions.md +++ b/site/versioned_docs/version-4.3/developers/sql-guide/sql-geospatial-functions.md @@ -10,13 +10,11 @@ HarperDB encourages developers to utilize other querying tools over SQL for perf HarperDB geospatial features require data to be stored in a single column using the [GeoJSON standard](https://geojson.org/), a standard commonly used in geospatial technologies. Geospatial functions are available to be used in SQL statements. - - If you are new to GeoJSON you should check out the full specification here: [https://geojson.org/](https://geojson.org/). There are a few important things to point out before getting started. -1) All GeoJSON coordinates are stored in `[longitude, latitude]` format. -2) Coordinates or GeoJSON geometries must be passed as string when written directly in a SQL statement. -3) Note if you are using Postman for you testing. Due to limitations in the Postman client, you will need to escape quotes in your strings and your SQL will need to be passed on a single line. +1. All GeoJSON coordinates are stored in `[longitude, latitude]` format. +2. Coordinates or GeoJSON geometries must be passed as string when written directly in a SQL statement. +3. Note if you are using Postman for you testing. Due to limitations in the Postman client, you will need to escape quotes in your strings and your SQL will need to be passed on a single line. In the examples contained in the left-hand navigation, database and table names may change, but all GeoJSON data will be stored in a column named geo_data. @@ -31,7 +29,7 @@ geoArea(_geoJSON_) ### Parameters | Parameter | Description | -|-----------|---------------------------------| +| --------- | ------------------------------- | | geoJSON | Required. One or more features. | #### Example 1 @@ -72,10 +70,10 @@ geoLength(_geoJSON_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| geoJSON | Required. GeoJSON to measure. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| geoJSON | Required. GeoJSON to measure. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 @@ -116,10 +114,10 @@ geoDifference(_polygon1, polygon2_) ## Parameters -| Parameter | Description | -|------------|----------------------------------------------------------------------------| -| polygon1 | Required. Polygon or MultiPolygon GeoJSON feature. | -| polygon2 | Required. Polygon or MultiPolygon GeoJSON feature to remove from polygon1. | +| Parameter | Description | +| --------- | -------------------------------------------------------------------------- | +| polygon1 | Required. Polygon or MultiPolygon GeoJSON feature. | +| polygon2 | Required. Polygon or MultiPolygon GeoJSON feature to remove from polygon1. | ### Example @@ -173,11 +171,11 @@ geoDistance(_point1, point2_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| point1 | Required. GeoJSON Point specifying the origin. | -| point2 | Required. GeoJSON Point specifying the destination. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| point1 | Required. GeoJSON Point specifying the origin. | +| point2 | Required. GeoJSON Point specifying the destination. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 @@ -208,12 +206,12 @@ geoNear(_point1, point2, distance_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| point1 | Required. GeoJSON Point specifying the origin. | -| point2 | Required. GeoJSON Point specifying the destination. | -| distance | Required. The maximum distance in units as an integer or decimal. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| point1 | Required. GeoJSON Point specifying the origin. | +| point2 | Required. GeoJSON Point specifying the destination. | +| distance | Required. The maximum distance in units as an integer or decimal. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 @@ -246,10 +244,10 @@ geoContains(_geo1, geo2_) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------| -| geo1 | Required. Polygon or MultiPolygon GeoJSON feature. | -| geo2 | Required. Polygon or MultiPolygon GeoJSON feature tested to be contained by geo1. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------- | +| geo1 | Required. Polygon or MultiPolygon GeoJSON feature. | +| geo2 | Required. Polygon or MultiPolygon GeoJSON feature tested to be contained by geo1. | ### Example 1 @@ -308,15 +306,18 @@ WHERE geoContains(geo_data, '{ Determines if two GeoJSON features are the same type and have identical X,Y coordinate values. For more information see [https://developers.arcgis.com/documentation/spatial-references/](https://developers.arcgis.com/documentation/spatial-references/). Returns a Boolean. ## Syntax + geoEqual(_geo1_, _geo2_) ## Parameters -| Parameter | Description | -|------------|----------------------------------------| -| geo1 | Required. GeoJSON geometry or feature. | -| geo2 | Required. GeoJSON geometry or feature. | + +| Parameter | Description | +| --------- | -------------------------------------- | +| geo1 | Required. GeoJSON geometry or feature. | +| geo2 | Required. GeoJSON geometry or feature. | ### Example + Find HarperDB Headquarters within all locations within the database. ``` @@ -343,18 +344,22 @@ WHERE geoEqual(geo_data, '{ ``` # geoCrosses + Determines if the geometries cross over each other. Returns boolean. ## Syntax + geoCrosses(_geo1, geo2_) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------| -| geo1 | Required. GeoJSON geometry or feature. | -| geo2 | Required. GeoJSON geometry or feature. | + +| Parameter | Description | +| --------- | -------------------------------------- | +| geo1 | Required. GeoJSON geometry or feature. | +| geo2 | Required. GeoJSON geometry or feature. | ### Example + Find all locations that cross over a highway. ``` @@ -388,16 +393,19 @@ WHERE geoCrosses( Converts a series of coordinates into a GeoJSON of the specified type. ## Syntax + geoConvert(_coordinates, geo_type_[, _properties_]) ## Parameters -| Parameter | Description | -|--------------|------------------------------------------------------------------------------------------------------------------------------------| -| coordinates | Required. One or more coordinates | -| geo_type | Required. GeoJSON geometry type. Options are ‘point’, ‘lineString’, ‘multiLineString’, ‘multiPoint’, ‘multiPolygon’, and ‘polygon’ | -| properties | Optional. Escaped JSON array with properties to be added to the GeoJSON output. | + +| Parameter | Description | +| ----------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| coordinates | Required. One or more coordinates | +| geo_type | Required. GeoJSON geometry type. Options are ‘point’, ‘lineString’, ‘multiLineString’, ‘multiPoint’, ‘multiPolygon’, and ‘polygon’ | +| properties | Optional. Escaped JSON array with properties to be added to the GeoJSON output. | ### Example + Convert a given coordinate into a GeoJSON point with specified properties. ``` diff --git a/site/versioned_docs/version-4.3/getting-started.md b/site/versioned_docs/version-4.3/getting-started.md index bf6f2a59..e2a238ae 100644 --- a/site/versioned_docs/version-4.3/getting-started.md +++ b/site/versioned_docs/version-4.3/getting-started.md @@ -21,7 +21,7 @@ Here we installed HarperDB globally (and we recommend this) to make it easy to r You can run HarperDB by running: ```javascript -harperdb +harperdb; ``` You can now use HarperDB as a standalone database. You can also create a cloud instance (see below), which is also an easy way to get started. diff --git a/site/versioned_docs/version-4.3/technical-details/_category_.json b/site/versioned_docs/version-4.3/technical-details/_category_.json index 69ce80a6..b965ef06 100644 --- a/site/versioned_docs/version-4.3/technical-details/_category_.json +++ b/site/versioned_docs/version-4.3/technical-details/_category_.json @@ -1,12 +1,10 @@ { - "label": "Technical Details", - "position": 4, - "link": { - "type": "generated-index", - "title": "Technical Details Documentation", - "description": "Reference documentation and technical specifications", - "keywords": [ - "technical-details" - ] - } -} \ No newline at end of file + "label": "Technical Details", + "position": 4, + "link": { + "type": "generated-index", + "title": "Technical Details Documentation", + "description": "Reference documentation and technical specifications", + "keywords": ["technical-details"] + } +} diff --git a/site/versioned_docs/version-4.3/technical-details/reference/analytics.md b/site/versioned_docs/version-4.3/technical-details/reference/analytics.md index 7b475176..c1975c66 100644 --- a/site/versioned_docs/version-4.3/technical-details/reference/analytics.md +++ b/site/versioned_docs/version-4.3/technical-details/reference/analytics.md @@ -8,7 +8,7 @@ HarperDB provides extensive telemetry and analytics data to help monitor the sta HarperDB collects statistics for all operations, URL endpoints, and messaging topics, aggregating information by thread, operation, resource, and methods, in real-time. These statistics are logged in the `hdb_raw_analytics` and `hdb_analytics` table in the `system` database. -There are two "levels" of analytics in the HarperDB analytics table: the first is the immediate level of raw direct logging of real-time statistics. These analytics entries are recorded once a second (when there is activity) by each thread, and include all recorded activity in the last second, along with system resource information. The records have a primary key that is the timestamp in milliseconds since epoch. This can be queried (with `superuser` permission) using the search\_by\_conditions operation (this will search for 10 seconds worth of analytics) on the `hdb_raw_analytics` table: +There are two "levels" of analytics in the HarperDB analytics table: the first is the immediate level of raw direct logging of real-time statistics. These analytics entries are recorded once a second (when there is activity) by each thread, and include all recorded activity in the last second, along with system resource information. The records have a primary key that is the timestamp in milliseconds since epoch. This can be queried (with `superuser` permission) using the search_by_conditions operation (this will search for 10 seconds worth of analytics) on the `hdb_raw_analytics` table: ``` POST http:/localhost:9925 @@ -104,14 +104,14 @@ And a summary record looks like: The following are general resource usage statistics that are tracked: -* memory - This includes RSS, heap, buffer and external data usage. -* utilization - How much of the time the worker was processing requests. -* mqtt-connections - The number of MQTT connections. +- memory - This includes RSS, heap, buffer and external data usage. +- utilization - How much of the time the worker was processing requests. +- mqtt-connections - The number of MQTT connections. The following types of information is tracked for each HTTP request: -* success - How many requests returned a successful response (20x response code). TTFB - Time to first byte in the response to the client. -* transfer - Time to finish the transfer of the data to the client. -* bytes-sent - How many bytes of data were sent to the client. +- success - How many requests returned a successful response (20x response code). TTFB - Time to first byte in the response to the client. +- transfer - Time to finish the transfer of the data to the client. +- bytes-sent - How many bytes of data were sent to the client. Requests are categorized by operation name, for the operations API, by the resource (name) with the REST API, and by command for the MQTT interface. diff --git a/site/versioned_docs/version-4.3/technical-details/reference/architecture.md b/site/versioned_docs/version-4.3/technical-details/reference/architecture.md index f2881d3c..5bbb1e47 100644 --- a/site/versioned_docs/version-4.3/technical-details/reference/architecture.md +++ b/site/versioned_docs/version-4.3/technical-details/reference/architecture.md @@ -38,5 +38,5 @@ HarperDB's architecture consists of resources, which includes tables and user de │ │ │ │ │ └────────────────┘ │ │ │ - └────────────────────────────────────────┘ + └────────────────────────────────────────┘ ``` diff --git a/site/versioned_docs/version-4.3/technical-details/reference/data-types.md b/site/versioned_docs/version-4.3/technical-details/reference/data-types.md index 0aa23cce..1cbfee68 100644 --- a/site/versioned_docs/version-4.3/technical-details/reference/data-types.md +++ b/site/versioned_docs/version-4.3/technical-details/reference/data-types.md @@ -20,10 +20,10 @@ Strings, or text, are a sequence of any unicode characters and are internally en Numbers can be stored as signed integers up to a 1000 bits of precision (about 300 digits) or floating point with 64-bit floating point precision, and numbers are automatically stored using the most optimal type. With JSON, numbers are automatically parsed and stored in the most appropriate format. Custom components and applications may use BigInt numbers to store/access integers that are larger than 53-bit. The following GraphQL schema type name are supported: -* `Float` - Any number that can be represented with [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision\_floating-point\_format) ("double") -* `Int` - Any integer between from -2147483648 to 2147483647 -* `Long` - Any integer between from -9007199254740992 to 9007199254740992 -* `BigInt` - Any integer (negative or positive) with less than 300 digits +- `Float` - Any number that can be represented with [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision_floating-point_format) ("double") +- `Int` - Any integer between from -2147483648 to 2147483647 +- `Long` - Any integer between from -9007199254740992 to 9007199254740992 +- `BigInt` - Any integer (negative or positive) with less than 300 digits Note that `BigInt` is a distinct and separate type from standard numbers in JavaScript, so custom code should handle this type appropriately. diff --git a/site/versioned_docs/version-4.3/technical-details/reference/dynamic-schema.md b/site/versioned_docs/version-4.3/technical-details/reference/dynamic-schema.md index 5047dc40..3bb705a5 100644 --- a/site/versioned_docs/version-4.3/technical-details/reference/dynamic-schema.md +++ b/site/versioned_docs/version-4.3/technical-details/reference/dynamic-schema.md @@ -16,8 +16,8 @@ HarperDB databases hold a collection of tables together in a single file that ar HarperDB tables group records together with a common data pattern. To create a table users must provide a table name and a primary key. -* **Table Name**: Used to identify the table. -* **Primary Key**: This is a required attribute that serves as the unique identifier for a record and is also known as the `hash_attribute` in HarperDB operations API. +- **Table Name**: Used to identify the table. +- **Primary Key**: This is a required attribute that serves as the unique identifier for a record and is also known as the `hash_attribute` in HarperDB operations API. ## Primary Key @@ -31,8 +31,8 @@ With tables that are using dynamic schemas, additional attributes are reflexivel HarperDB automatically creates two audit attributes used on each record if the table is created without a schema. -* `__createdtime__`: The time the record was created in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. -* `__updatedtime__`: The time the record was updated in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. +- `__createdtime__`: The time the record was created in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. +- `__updatedtime__`: The time the record was updated in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. ### Dynamic Schema Example @@ -64,7 +64,7 @@ At this point the table does not have structure beyond what we provided, so the **dev.dog** -![](/img/v4.3/reference/dynamic\_schema\_2\_create\_table.png.webp) +![](/img/v4.3/reference/dynamic_schema_2_create_table.png.webp) **Insert Record** @@ -85,7 +85,7 @@ With a single record inserted and new attributes defined, our table now looks li **dev.dog** -![](/img/v4.3/reference/dynamic\_schema\_3\_insert\_record.png.webp) +![](/img/v4.3/reference/dynamic_schema_3_insert_record.png.webp) Indexes have been automatically created for `dog_name` and `owner_name` attributes. @@ -109,7 +109,7 @@ In this case, there is no change to the schema. Our table now looks like this: **dev.dog** -![](/img/v4.3/reference/dynamic\_schema\_4\_insert\_additional\_record.png.webp) +![](/img/v4.3/reference/dynamic_schema_4_insert_additional_record.png.webp) **Update Existing Record** @@ -130,7 +130,7 @@ Now we have a new attribute called `weight_lbs`. Our table now looks like this: **dev.dog** -![](/img/v4.3/reference/dynamic\_schema\_5\_update\_existing\_record.png.webp) +![](/img/v4.3/reference/dynamic_schema_5_update_existing_record.png.webp) **Query Table with SQL** @@ -145,4 +145,4 @@ Now if we query for all records where `weight_lbs` is `null` we expect to get ba This results in the expected two records being returned. -![](/img/v4.3/reference/dynamic\_schema\_6\_query\_table\_with\_sql.png.webp) +![](/img/v4.3/reference/dynamic_schema_6_query_table_with_sql.png.webp) diff --git a/site/versioned_docs/version-4.3/technical-details/reference/globals.md b/site/versioned_docs/version-4.3/technical-details/reference/globals.md index 86dfee72..3f6e58dd 100644 --- a/site/versioned_docs/version-4.3/technical-details/reference/globals.md +++ b/site/versioned_docs/version-4.3/technical-details/reference/globals.md @@ -38,7 +38,7 @@ async function getRecord() { } ``` -It is recommended that you [define a database](../../getting-started/) for all the tables that are required to exist in your application. This will ensure that the tables exist on the `tables` object. Also note that the property names follow a CamelCase convention for use in JavaScript and in the GraphQL Schemas, but these are translated to snake\_case for the actual table names, and converted back to CamelCase when added to the `tables` object. +It is recommended that you [define a database](../../getting-started/) for all the tables that are required to exist in your application. This will ensure that the tables exist on the `tables` object. Also note that the property names follow a CamelCase convention for use in JavaScript and in the GraphQL Schemas, but these are translated to snake_case for the actual table names, and converted back to CamelCase when added to the `tables` object. ## `databases` @@ -63,7 +63,7 @@ This provides methods `trace`, `debug`, `info`, `warn`, `error`, `fatal`, and `n ## `server` -The `server` global object provides a number of functions and objects to interact with Harper's HTTP service. +The `server` global object provides a number of functions and objects to interact with Harper's HTTP service. ### `server.http(listener: RequestListener, options: HttpOptions): HttpServer[]` @@ -76,13 +76,14 @@ Returns an array of server instances based on the specified `options.port` and ` Example: ```js -server.http((request, next) => { - return request.url === '/graphql' - ? handleGraphQLRequest(request) - : next(request); -}, { - runFirst: true, // run this handler first -}); +server.http( + (request, next) => { + return request.url === '/graphql' ? handleGraphQLRequest(request) : next(request); + }, + { + runFirst: true, // run this handler first + } +); ``` #### `RequestListener` @@ -107,6 +108,7 @@ Properties: + - `runFirst` - _optional_ - `boolean` - Add listener to the front of the middleware chain. Defaults to `false` - `port` - _optional_ - `number` - Specify which HTTP server middleware chain to add the listener to. Defaults to the Harper system default HTTP port configured by `harperdb-config.yaml`, generally `9926` - `securePort` - _optional_ - `number` - Specify which HTTPS server middleware chain to add the listener to. Defaults to the Harper system default HTTP secure port configured by `harperdb-config.yaml`, generally `9927` @@ -142,15 +144,15 @@ Example: ```js server.ws((ws, request, chainCompletion) => { - chainCompletion.then(() => { - ws.on('error', console.error); + chainCompletion.then(() => { + ws.on('error', console.error); - ws.on('message', function message(data) { - console.log('received: %s', data); - }); + ws.on('message', function message(data) { + console.log('received: %s', data); + }); - ws.send('something'); - }); + ws.send('something'); + }); }); ``` @@ -173,6 +175,7 @@ Properties: + - `maxPayload` - _optional_ - `number` - Set the max payload size for the WebSocket server. Defaults to 100 MB. - `runFirst` - _optional_ - `boolean` - Add listener to the front of the middleware chain. Defaults to `false` - `port` - _optional_ - `number` - Specify which WebSocket server middleware chain to add the listener to. Defaults to the Harper system default HTTP port configured by `harperdb-config.yaml`, generally `9926` @@ -229,8 +232,8 @@ This provides access to the HarperDB configuration object. This comes from the [ This records the provided value as a metric into HarperDB's analytics. HarperDB efficiently records and tracks these metrics and makes them available through [analytics API](./analytics). The values are aggregated and statistical information is computed when many operations are performed. The optional parameters can be used to group statistics. For the parameters, make sure you are not grouping on too fine of a level for useful aggregation. The parameters are: -* `value` - This is a numeric value for the metric that is being recorded. This can be a value measuring time or bytes, for example. -* `metric` - This is the name of the metric. -* `path` - This is an optional path (like a URL path). For a URL like /my-resource/, you would typically include a path of "my-resource", not including the id so you can group by all the requests to "my-resource" instead of individually aggregating by each individual id. -* `method` - Optional method to group by. -* `type` - Optional type to group by. +- `value` - This is a numeric value for the metric that is being recorded. This can be a value measuring time or bytes, for example. +- `metric` - This is the name of the metric. +- `path` - This is an optional path (like a URL path). For a URL like /my-resource/, you would typically include a path of "my-resource", not including the id so you can group by all the requests to "my-resource" instead of individually aggregating by each individual id. +- `method` - Optional method to group by. +- `type` - Optional type to group by. diff --git a/site/versioned_docs/version-4.3/technical-details/reference/headers.md b/site/versioned_docs/version-4.3/technical-details/reference/headers.md index c58bb7ec..3ddc8528 100644 --- a/site/versioned_docs/version-4.3/technical-details/reference/headers.md +++ b/site/versioned_docs/version-4.3/technical-details/reference/headers.md @@ -6,7 +6,7 @@ title: HarperDB Headers All HarperDB API responses include headers that are important for interoperability and debugging purposes. The following headers are returned with all HarperDB API responses: -| Key | Example Value | Description | -|-------------------|------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| -| server-timing | db;dur=7.165 | This reports the duration of the operation, in milliseconds. This follows the standard for Server-Timing and can be consumed by network monitoring tools. | -| content-type | application/json | This reports the MIME type of the returned content, which is negotiated based on the requested content type in the Accept header. | +| Key | Example Value | Description | +| ------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| server-timing | db;dur=7.165 | This reports the duration of the operation, in milliseconds. This follows the standard for Server-Timing and can be consumed by network monitoring tools. | +| content-type | application/json | This reports the MIME type of the returned content, which is negotiated based on the requested content type in the Accept header. | diff --git a/site/versioned_docs/version-4.3/technical-details/reference/index.md b/site/versioned_docs/version-4.3/technical-details/reference/index.md index e9a6ebf9..e893988b 100644 --- a/site/versioned_docs/version-4.3/technical-details/reference/index.md +++ b/site/versioned_docs/version-4.3/technical-details/reference/index.md @@ -6,11 +6,11 @@ title: Reference This section contains technical details and reference materials for HarperDB. -* [Resource API](./resource) -* [Transactions](./transactions) -* [Storage Algorithm](./storage-algorithm) -* [Dynamic Schema](./dynamic-schema) -* [Headers](./headers) -* [Limitations](./limits) -* Content Types -* [Data Types](./data-types) +- [Resource API](./resource) +- [Transactions](./transactions) +- [Storage Algorithm](./storage-algorithm) +- [Dynamic Schema](./dynamic-schema) +- [Headers](./headers) +- [Limitations](./limits) +- Content Types +- [Data Types](./data-types) diff --git a/site/versioned_docs/version-4.3/technical-details/reference/limits.md b/site/versioned_docs/version-4.3/technical-details/reference/limits.md index ccad9d64..8ea207ba 100644 --- a/site/versioned_docs/version-4.3/technical-details/reference/limits.md +++ b/site/versioned_docs/version-4.3/technical-details/reference/limits.md @@ -30,4 +30,4 @@ Additionally, they cannot contain the first 31 non-printing characters. Spaces a **Attribute Maximum** -HarperDB limits the number of total indexed attributes across tables (including the primary key of each table) to 10,000 per database. \ No newline at end of file +HarperDB limits the number of total indexed attributes across tables (including the primary key of each table) to 10,000 per database. diff --git a/site/versioned_docs/version-4.3/technical-details/reference/resource.md b/site/versioned_docs/version-4.3/technical-details/reference/resource.md index ab0ba214..eea5a8e6 100644 --- a/site/versioned_docs/version-4.3/technical-details/reference/resource.md +++ b/site/versioned_docs/version-4.3/technical-details/reference/resource.md @@ -11,19 +11,21 @@ The Resource class is designed to provide a unified API for modeling different d Conceptually, a Resource class provides an interface for accessing, querying, modifying, and monitoring a set of entities or records. Instances of a Resource class can represent a single record or entity, or a collection of records, at a given point in time, that you can interact with through various methods or queries. Resource instances can represent an atomic transactional view of a resource and facilitate transactional interaction. A Resource instance holds the primary key/identifier, context information, and any pending updates to the record, so any instance methods can act on the record and have full access to this information to during execution. Therefore, there are distinct resource instances created for every record or query that is accessed, and the instance methods are used for interaction with the data. Resource classes also have static methods, which are generally the preferred way to externally interact with tables and resources. The static methods handle parsing paths and query strings, starting a transaction as necessary, performing access authorization checks (if required), creating a resource instance, and calling the instance methods. This general rule for how to interact with resources: -* If you want to *act upon* a table or resource, querying or writing to it, then use the static methods to initial access or write data. For example, you could use `MyTable.get(34)` to access the record with a primary key of `34`. - * You can subsequently use the instance methods on the returned resource instance to perform additional actions on the record. -* If you want to *define custom behavior* for a table or resource (to control how a resource responds to queries/writes), then extend the class and override/define instance methods. + +- If you want to _act upon_ a table or resource, querying or writing to it, then use the static methods to initial access or write data. For example, you could use `MyTable.get(34)` to access the record with a primary key of `34`. + - You can subsequently use the instance methods on the returned resource instance to perform additional actions on the record. +- If you want to _define custom behavior_ for a table or resource (to control how a resource responds to queries/writes), then extend the class and override/define instance methods. The Resource API is heavily influenced by the REST/HTTP API, and the methods and properties of the Resource class are designed to map to and be used in a similar way to how you would interact with a RESTful API. The REST-based API is a little different than traditional Create-Read-Update-Delete (CRUD) APIs that were designed with single-server interactions in mind, but semantics that attempt to guarantee no existing record or overwrite-only behavior require locks that don't scale well in distributed database. Centralizing writes around `put` calls provides much more scalable, simple, and consistent behavior in a distributed eventually consistent database. You can generally think of CRUD operations mapping to REST operations like this: -* Read - `get` -* Create with a known primary key - `put` -* Create with a generated primary key - `post`/`create` -* Update (Full) - `put` -* Update (Partial) - `patch` -* Delete - `delete` + +- Read - `get` +- Create with a known primary key - `put` +- Create with a generated primary key - `post`/`create` +- Update (Full) - `put` +- Update (Partial) - `patch` +- Delete - `delete` The RESTful HTTP server and other server interfaces will directly call resource methods of the same name to fulfill incoming requests so resources can be defined as endpoints for external interaction. When resources are used by the server interfaces, the static method will be executed (which starts a transaction and does access checks), which will then create the resource instance and call the corresponding instance method. Paths (URL, MQTT topics) are mapped to different resource instances. Using a path that specifies an ID like `/MyResource/3492` will be mapped to a Resource instance where the instance's ID will be `3492`, and interactions will use the instance methods like `get()`, `put()`, and `post()`. Using the root path (`/MyResource/`) will map to a Resource instance with an ID of `null`, and this represents the collection of all the records in the resource or table. @@ -31,16 +33,16 @@ You can create classes that extend `Resource` to define your own data sources, t ```javascript export class MyExternalData extends Resource { - async get() { - // fetch data from an external source, using our id - let response = await this.fetch(this.id); - // do something with the response - } - put(data) { + async get() { + // fetch data from an external source, using our id + let response = await this.fetch(this.id); + // do something with the response + } + put(data) { // send the data into the external source } delete() { - // delete an entity in the external data source + // delete an entity in the external data source } subscribe(options) { // if the external data source is capable of real-time notification of changes, can subscribe @@ -66,7 +68,7 @@ export class MyTable extends tables.MyTable { super.put(data); } delete() { - super.delete(); + super.delete(); } post(data) { // providing a post handler (for HTTP POST requests) is a common way to create additional @@ -74,6 +76,7 @@ export class MyTable extends tables.MyTable { } } ``` + Make sure that if are extending and `export`ing your table with this class, that you remove the `@export` directive in your schema, so that you aren't exporting the same table/class name twice. ## Global Variables @@ -137,6 +140,7 @@ get(query) { ... } ``` + If `get` is called for a single record (for a request like `/Table/some-id`), the default action is to return `this` instance of the resource. If `get` is called on a collection (`/Table/?name=value`), the default action is to `search` and return an AsyncIterable of results. It is important to note that `this` is the resource instance for a specific record, specified by the primary key. Therefore, calling `super.get(query)` performs a `get` on this specific record/resource, not on the whole table. If you wish to access a _different_ record, you should use the static `get` method on the table class, like `Table.get(otherId, context)`. @@ -145,7 +149,6 @@ It is important to note that `this` is the resource instance for a specific reco This performs a query on this resource, searching for records that are descendants. By default, this is called by `get(query)` from a collection resource. When this is called for the root resource (like `/Table/`) it searches through all records in the table. However, if you call search from an instance with a specific ID like `1` from a path like `Table/1`, it will only return records that are descendants of that record, like `[1, 1]` (path of Table/1/1) and `[1, 2]` (path of Table/1/2). If you want to do a standard search of the table, make you call the static method like `Table.search(...)`. You can define or override this method to define how records should be queried. The default `search` method on tables (`super.search(query)`) will perform a query and return an AsyncIterable of results. The query object can be used to specify the desired query. - ### `getId(): string|number|Array` Returns the primary key value for this resource. @@ -197,10 +200,10 @@ The returned (promise resolves to) Subscription object is an `AsyncIterable` tha The `SubscriptionRequest` object supports the following properties (all optional): -* `includeDescendants` - If this is enabled, this will create a subscription to all the record updates/messages that are prefixed with the id. For example, a subscription request of `{id:'sub', includeDescendants: true}` would return events for any update with an id/topic of the form sub/\* (like `sub/1`). -* `startTime` - This will begin the subscription at a past point in time, returning all updates/messages since the start time (a catch-up of historical messages). This can be used to resume a subscription, getting all messages since the last subscription. -* `previousCount` - This specifies the number of previous updates/messages to deliver. For example, `previousCount: 10` would return the last ten messages. Note that `previousCount` can not be used in conjunction with `startTime`. -* `omitCurrent` - Indicates that the current (or retained) record should _not_ be immediately sent as the first update in the subscription (if no `startTime` or `previousCount` was used). By default, the current record is sent as the first update. +- `includeDescendants` - If this is enabled, this will create a subscription to all the record updates/messages that are prefixed with the id. For example, a subscription request of `{id:'sub', includeDescendants: true}` would return events for any update with an id/topic of the form sub/\* (like `sub/1`). +- `startTime` - This will begin the subscription at a past point in time, returning all updates/messages since the start time (a catch-up of historical messages). This can be used to resume a subscription, getting all messages since the last subscription. +- `previousCount` - This specifies the number of previous updates/messages to deliver. For example, `previousCount: 10` would return the last ten messages. Note that `previousCount` can not be used in conjunction with `startTime`. +- `omitCurrent` - Indicates that the current (or retained) record should _not_ be immediately sent as the first update in the subscription (if no `startTime` or `previousCount` was used). By default, the current record is sent as the first update. ### `connect(incomingMessages?: AsyncIterable, query?: Query): AsyncIterable` @@ -246,25 +249,25 @@ Returns the context for this resource. The context contains information about th The `Context` object has the following (potential) properties: -* `user` - This is the user object, which includes information about the username, role, and authorizations. -* `transaction` - The current transaction If the current method was triggered by an HTTP request, the following properties are available: -* `lastModified` - This value is used to indicate the last modified or updated timestamp of any resource(s) that are accessed and will inform the response's `ETag` (or `Last-Modified`) header. This can be updated by application code if it knows that modification should cause this timestamp to be updated. +- `user` - This is the user object, which includes information about the username, role, and authorizations. +- `transaction` - The current transaction If the current method was triggered by an HTTP request, the following properties are available: +- `lastModified` - This value is used to indicate the last modified or updated timestamp of any resource(s) that are accessed and will inform the response's `ETag` (or `Last-Modified`) header. This can be updated by application code if it knows that modification should cause this timestamp to be updated. When a resource gets a request through HTTP, the request object is the context, which has the following properties: -* `url` - The local path/URL of the request (this will not include the protocol or host name, but will start at the path and includes the query string). -* `method` - The method of the HTTP request. -* `headers` - This is an object with the headers that were included in the HTTP request. You can access headers by calling `context.headers.get(headerName)`. -* `responseHeaders` - This is an object with the headers that will be included in the HTTP response. You can set headers by calling `context.responseHeaders.set(headerName, value)`. -* `pathname` - This provides the path part of the URL (no querystring). -* `host` - This provides the host name of the request (from the `Host` header). -* `ip` - This provides the ip address of the client that made the request. -* `body` - This is the request body as a raw NodeJS Readable stream, if there is a request body. -* `data` - If the HTTP request had a request body, this provides a promise to the deserialized data from the request body. (Note that for methods that normally have a request body like `POST` and `PUT`, the resolved deserialized data is passed in as the main argument, but accessing the data from the context provides access to this for requests that do not traditionally have a request body like `DELETE`). +- `url` - The local path/URL of the request (this will not include the protocol or host name, but will start at the path and includes the query string). +- `method` - The method of the HTTP request. +- `headers` - This is an object with the headers that were included in the HTTP request. You can access headers by calling `context.headers.get(headerName)`. +- `responseHeaders` - This is an object with the headers that will be included in the HTTP response. You can set headers by calling `context.responseHeaders.set(headerName, value)`. +- `pathname` - This provides the path part of the URL (no querystring). +- `host` - This provides the host name of the request (from the `Host` header). +- `ip` - This provides the ip address of the client that made the request. +- `body` - This is the request body as a raw NodeJS Readable stream, if there is a request body. +- `data` - If the HTTP request had a request body, this provides a promise to the deserialized data from the request body. (Note that for methods that normally have a request body like `POST` and `PUT`, the resolved deserialized data is passed in as the main argument, but accessing the data from the context provides access to this for requests that do not traditionally have a request body like `DELETE`). When a resource is accessed as a data source: -* `requestContext` - For resources that are acting as a data source for another resource, this provides access to the context of the resource that is making a request for data from the data source resource. Note that it is generally not recommended to rely on this context. The resolved data may be used fulfilled many different requests, and relying on this first request context may not be representative of future requests. Also, source resolution may be triggered by various actions, not just specified endpoints (for example queries, operations, studio, etc.), so make sure you are not relying on specific request context information. +- `requestContext` - For resources that are acting as a data source for another resource, this provides access to the context of the resource that is making a request for data from the data source resource. Note that it is generally not recommended to rely on this context. The resolved data may be used fulfilled many different requests, and relying on this first request context may not be representative of future requests. Also, source resolution may be triggered by various actions, not just specified endpoints (for example queries, operations, studio, etc.), so make sure you are not relying on specific request context information. ### `operation(operationObject: Object, authorize?: boolean): Promise` @@ -276,7 +279,7 @@ For caching tables, this can be defined to allow stale entries to be returned wh ## Resource Static Methods and Properties -The Resource class also has static methods that mirror the instance methods with an initial argument that is the id of the record to act on. The static methods are generally the preferred and most convenient method for interacting with tables outside of methods that are directly extending a table. Whereas instances methods are bound to a specific record, the static methods allow you to specify any record in the table to act on. +The Resource class also has static methods that mirror the instance methods with an initial argument that is the id of the record to act on. The static methods are generally the preferred and most convenient method for interacting with tables outside of methods that are directly extending a table. Whereas instances methods are bound to a specific record, the static methods allow you to specify any record in the table to act on. The `get`, `put`, `delete`, `publish`, `subscribe`, and `connect` methods all have static equivalents. There is also a `static search()` method for specifically handling searching a table with query parameters. By default, the Resource static methods default to creating an instance bound to the record specified by the arguments, and calling the instance methods. Again, generally static methods are the preferred way to interact with resources and call them from application code. These methods are available on all user Resource classes and tables. @@ -285,7 +288,7 @@ The `get`, `put`, `delete`, `publish`, `subscribe`, and `connect` methods all ha This will retrieve a resource instance by id. For example, if you want to retrieve comments by id in the retrieval of a blog post you could do: ```javascript -const { MyTable, Comment } = tables; +const { MyTable, Comment } = tables; ... // in class: async get() { @@ -297,15 +300,19 @@ const { MyTable, Comment } = tables; ``` Type definition for `Id`: + ```typescript -Id = string|number|array +Id = string | number | array; ``` + ### `get(query: Query, context?: Resource|Context)` This can be used to retrieve a resource instance by a query. The query can be used to specify a single/unique record by an `id` property, and can be combined with a `select`: + ```javascript MyTable.get({ id: 34, select: ['name', 'age'] }); ``` + This method may also be used to retrieve a collection of records by a query. If the query is not for a specific record id, this will call the `search` method, described above. ### `put(id: Id, record: object, context?: Resource|Context): Promise` @@ -322,11 +329,13 @@ Make sure to `await` this function to ensure it finishes execution within the su This will create a new record using the provided record for all fields (except primary key), generating a new primary key for the record. This does _not_ check for an existing record; the record argument should not have a primary key and should use the generated primary key. This will (asynchronously) return the new resource instance. Make sure to `await` this function to ensure it finishes execution within the surrounding transaction. ### `post(id: Id, data: object, context?: Resource|Context): Promise` + ### `post(data: object, context?: Resource|Context): Promise` This will save the provided data to this resource. By default, this will create a new record (by calling `create`). However, the `post` method is specifically intended to be available for custom behaviors, so extending a class to support custom `post` method behavior is encouraged. ### `patch(recordUpdate: object, context?: Resource|Context): Promise` + ### `patch(id: Id, recordUpdate: object, context?: Resource|Context): Promise` This will save the provided updates to the record. The `recordUpdate` object's properties will be applied to the existing record, overwriting the existing records properties, and preserving any properties in the record that are not specified in the `recordUpdate` object. Make sure to `await` this function to ensure it finishes execution within the surrounding transaction. @@ -336,6 +345,7 @@ This will save the provided updates to the record. The `recordUpdate` object's p Deletes this resource's record or data. Make sure to `await` this function to ensure it finishes execution within the surrounding transaction. ### `publish(message: object, context?: Resource|Context): Promise` + ### `publish(topic: Id, message: object, context?: Resource|Context): Promise` Publishes the given message to the record entry specified by the id in the context. Make sure to `await` this function to ensure it finishes execution within the surrounding transaction. @@ -362,9 +372,10 @@ There are additional methods that are only available on table classes (which are ### `Table.sourcedFrom(Resource, options)` This defines the source for a table. This allows a table to function as a cache for an external resource. When a table is configured to have a source, any request for a record that is not found in the table will be delegated to the source resource to retrieve (via `get`) and the result will be cached/stored in the table. All writes to the table will also first be delegated to the source (if the source defines write functions like `put`, `delete`, etc.). The `options` parameter can include an `expiration` property that will configure the table with a time-to-live expiration window for automatic deletion or invalidation of older entries. The `options` parameter (also) supports: -* `expiration` - Default expiration time for records in seconds. -* `eviction` - Eviction time for records in seconds. -* `scanInterval` - Time period for scanning the table for records to evict. + +- `expiration` - Default expiration time for records in seconds. +- `eviction` - Eviction time for records in seconds. +- `scanInterval` - Time period for scanning the table for records to evict. If the source resource implements subscription support, real-time invalidation can be performed to ensure the cache is guaranteed to be fresh (and this can eliminate or reduce the need for time-based expiration of data). @@ -379,6 +390,7 @@ This is called by static methods when they are responding to a URL (from HTTP re ``` ### `isCollection(resource: Resource): boolean` + This returns a boolean indicating if the provide resource instance represents a collection (can return a query result) or a single record/entity. ### Context and Transactions @@ -397,10 +409,10 @@ const { Comment } = tables; export class BlogPost extends tables.BlogPost { post(comment) { // add a comment record to the comment table, using this resource as the source for the context - Comment.put(comment, this); + Comment.put(comment, this); this.comments.push(comment.id); // add the id for the record to our array of comment ids // Both of these actions will be committed atomically as part of the same transaction - } + } } ``` @@ -411,72 +423,95 @@ Please see the [transaction documentation](./transactions) for more information The `get`/`search` methods accept a Query object that can be used to specify a query for data. The query is an object that has the following properties, which are all optional: #### `conditions` + This is an array of objects that specify the conditions to use the match records (if conditions are omitted or it is an empty array, this is a search for everything in the table). Each condition object can have the following properties: - * `attribute`: Name of the property/attribute to match on. - * `value`: The value to match. - * `comparator`: This can specify how the value is compared. This defaults to "equals", but can also be "greater\_than", "greater\_than\_equal", "less\_than", "less\_than\_equal", "starts\_with", "contains", "ends\_with", "between", and "not_equal". - * `conditions`: An array of conditions, which follows the same structure as above. - * `operator`: Specifies the operator to apply to this set of conditions (`and` or `or`. This is optional and defaults to `and`). - For example, a complex query might look like: + +- `attribute`: Name of the property/attribute to match on. +- `value`: The value to match. +- `comparator`: This can specify how the value is compared. This defaults to "equals", but can also be "greater_than", "greater_than_equal", "less_than", "less_than_equal", "starts_with", "contains", "ends_with", "between", and "not_equal". +- `conditions`: An array of conditions, which follows the same structure as above. +- `operator`: Specifies the operator to apply to this set of conditions (`and` or `or`. This is optional and defaults to `and`). + For example, a complex query might look like: For example, a more complex query might look like: + ```javascript -Table.search({ conditions: [ - { attribute: 'price', comparator: 'less_than', value: 100 }, - { operator: 'or', conditions: [ - { attribute: 'rating', comparator: 'greater_than', value: 4 }, - { attribute: 'featured', value: true } - ]} -]}); +Table.search({ + conditions: [ + { attribute: 'price', comparator: 'less_than', value: 100 }, + { + operator: 'or', + conditions: [ + { attribute: 'rating', comparator: 'greater_than', value: 4 }, + { attribute: 'featured', value: true }, + ], + }, + ], +}); ``` ##### Chained Attributes/Properties + Chained attribute/property references can be used to search on properties within related records that are referenced by [relationship properties](../../developers/applications/defining-schemas) (in addition to the [schema documentation](../../developers/applications/defining-schemas), see the [REST documentation](../../developers/rest) for more of overview of relationships and querying). Chained property references are specified with an array, with each entry in the array being a property name for successive property references. For example, if a relationship property called `brand` has been defined that references a `Brand` table, we could search products by brand name: + ```javascript -Product.search({ conditions: [ - { attribute: ['brand', 'name'], value: 'HarperDB' } -]}); +Product.search({ conditions: [{ attribute: ['brand', 'name'], value: 'HarperDB' }] }); ``` + This effectively executes a join, searching on the `Brand` table and joining results with matching records in the `Product` table. Chained array properties can be used in any condition, as well nested/grouped conditions. The chain of properties may also be more than two entries, allowing for multiple relationships to be traversed, effectively joining across multiple tables. An array of chained properties can also be used as the `attribute` in the `sort` property, allowing for sorting by an attribute in a referenced joined tables. #### `operator` + Specifies if the conditions should be applied as an `"and"` (records must match all conditions), or as an "or" (records must match at least one condition). This is optional and defaults to `"and"`. #### `limit` + This specifies the limit of the number of records that should be returned from the query. #### `offset` + This specifies the number of records that should be skipped prior to returning records in the query. This is often used with `limit` to implement "paging" of records. #### `select` + This specifies the specific properties that should be included in each record that is returned. This can be an array, to specify a set of properties that should be included in the returned objects. The array can specify an `select.asArray = true` property and the query results will return a set of arrays of values of the specified properties instead of objects; this can be used to return more compact results. Each of the elements in the array can be a property name, or can be an object with a `name` and `select` array itself that specifies properties that should be returned by the referenced sub-object or related record. For example, a `select` can defined: + ```javascript Table.search({ select: [ 'name', 'age' ], conditions: ...}) ``` + Or nested/joined properties from referenced objects can be specified, here we are including the referenced `related` records, and returning the `description` and `id` from each of the related objects: + ```javascript Table.search({ select: [ 'name', { name: 'related', select: ['description', 'id'] } ], conditions: ...}) ``` + The select properties can also include certain special properties: -* `$id` - This will specifically return the primary key of the record (regardless of name, even if there is no defined primary key attribute for the table). -* `$updatedtime` - This will return the last updated timestamp/version of the record (regardless of whether there is an attribute for the updated time). + +- `$id` - This will specifically return the primary key of the record (regardless of name, even if there is no defined primary key attribute for the table). +- `$updatedtime` - This will return the last updated timestamp/version of the record (regardless of whether there is an attribute for the updated time). Alternately, the select value can be a string value, to specify that the value of the specified property should be returned for each iteration/element in the results. For example to just return an iterator of the `id`s of object: + ```javascript Table.search({ select: 'id', conditions: ...}) ``` #### `sort` + This defines the sort order, and should be an object that can have the following properties: - * `attributes`: The attribute to sort on. - * `descending`: If true, will sort in descending order (optional and defaults to `false`). - * `next`: Specifies the next sort order to resolve ties. This is an object that follows the same structure as `sort`. + +- `attributes`: The attribute to sort on. +- `descending`: If true, will sort in descending order (optional and defaults to `false`). +- `next`: Specifies the next sort order to resolve ties. This is an object that follows the same structure as `sort`. #### `explain` + This will return the conditions re-ordered as HarperDB will execute them. HarperDB will estimate the number of the matching records for each condition and apply the narrowest condition applied first. #### `enforceExecutionOrder` + This will force the conditions to be executed in the order they were supplied, rather than using query estimation to re-order them. The query results are returned as an `AsyncIterable`. In order to access the elements of the query results, you must use a `for await` loop (it does _not_ return an array, you can not access the results by index). @@ -493,12 +528,13 @@ let results = Product.search({ offset: 20, limit: 10, select: ['id', 'name', 'price', 'rating'], - sort: { attribute: 'price' } -}) + sort: { attribute: 'price' }, +}); for await (let record of results) { // iterate through each record in the query results } ``` + `AsyncIterable`s can be returned from resource methods, and will be properly serialized in responses. When a query is performed, this will open/reserve a read transaction until the query results are iterated, either through your own `for await` loop or through serialization. Failing to iterate the results this will result in a long-lived read transaction which can degrade performance (including write performance), and may eventually be aborted. ### Interacting with the Resource Data Model @@ -521,7 +557,7 @@ export class CustomProduct extends Product { get(query) { let name = this.name; // this is the name of the current product let rating = this.rating; // this is the rating of the current product - this.rating = 3 // we can also modify the rating for the current instance + this.rating = 3; // we can also modify the rating for the current instance // (with a get this won't be saved by default, but will be used when serialized) return super.get(query); } @@ -534,8 +570,7 @@ Likewise, we can interact with resource instances in the same way when retrievin let product1 = await Product.get(1); let name = product1.name; // this is the name of the product with a primary key of 1 let rating = product1.rating; // this is the rating of the product with a primary key of 1 -product1.rating = 3 // modify the rating for this instance (this will be saved without a call to update()) - +product1.rating = 3; // modify the rating for this instance (this will be saved without a call to update()) ``` If there are additional properties on (some) products that aren't defined in the schema, we can still access them through the resource instance, but since they aren't declared, there won't be getter/setter definition for direct property access, but we can access properties with the `get(propertyName)` method and modify properties with the `set(propertyName, value)` method: @@ -543,7 +578,7 @@ If there are additional properties on (some) products that aren't defined in the ```javascript let product1 = await Product.get(1); let additionalInformation = product1.get('additionalInformation'); // get the additionalInformation property value even though it isn't defined in the schema -product1.set('newProperty', 'some value'); // we can assign any properties we want with set +product1.set('newProperty', 'some value'); // we can assign any properties we want with set ``` And likewise, we can do this in an instance method, although you will probably want to use super.get()/set() so you don't have to write extra logic to avoid recursion: @@ -552,7 +587,7 @@ And likewise, we can do this in an instance method, although you will probably w export class CustomProduct extends Product { get(query) { let additionalInformation = super.get('additionalInformation'); // get the additionalInformation property value even though it isn't defined in the schema - super.set('newProperty', 'some value'); // we can assign any properties we want with set + super.set('newProperty', 'some value'); // we can assign any properties we want with set } } ``` @@ -625,7 +660,7 @@ product1.delete('additionalInformation'); product1.update(); ``` -You can also get "plain" object representation of a resource instance by calling `toJSON`, which will return a simple frozen object with all the properties (whether defined in the schema) as direct normal properties (note that this object can *not* be modified, it is frozen since it is belongs to a cache): +You can also get "plain" object representation of a resource instance by calling `toJSON`, which will return a simple frozen object with all the properties (whether defined in the schema) as direct normal properties (note that this object can _not_ be modified, it is frozen since it is belongs to a cache): ```javascript let product1 = await Product.get(1); @@ -636,13 +671,15 @@ for (let key in plainObject) { ``` ## Response Object + The resource methods can return an object that will be serialized and returned as the response to the client. However, these methods can also return a `Response` style object with `status`, `headers`, and optionally `body` or `data` properties. This allows you to have more control over the response, including setting custom headers and status codes. For example, you could return a redirect response like: ```javascript return { status: 302, headers: { Location: '/new-location' } }; ``` + If you include a `body` property, this must be a string or buffer that will be returned as the response body. If you include a `data` property, this must be an object that will be serialized as the response body (using the standard content negotiation). For example, we could return an object with a custom header: - + ```javascript return { status: 200, headers: { 'X-Custom-Header': 'custom value' }, data: { message: 'Hello, World!' } }; ``` diff --git a/site/versioned_docs/version-4.3/technical-details/reference/transactions.md b/site/versioned_docs/version-4.3/technical-details/reference/transactions.md index 0b2e54ae..984b0a71 100644 --- a/site/versioned_docs/version-4.3/technical-details/reference/transactions.md +++ b/site/versioned_docs/version-4.3/technical-details/reference/transactions.md @@ -18,7 +18,7 @@ This executes the callback in a transaction, providing a context that can be use ```javascript import { tables } from 'harperdb'; -const { MyTable } = tables; +const { MyTable } = tables; if (isMainThread) // only on main thread setInterval(async () => { let someData = await (await fetch(... some URL ...)).json(); @@ -34,7 +34,7 @@ You can provide your own context object for the transaction to attach to. If you Once the transaction callback is completed (for non-nested transaction calls), the transaction will commit, and if the callback throws an error, the transaction will abort. However, the callback is called with the `transaction` object, which also provides the following methods and property: -* `commit(): Promise` - Commits the current transaction. The transaction will be committed once the returned promise resolves. -* `abort(): void` - Aborts the current transaction and resets it. -* `resetReadSnapshot(): void` - Resets the read snapshot for the transaction, resetting to the latest data in the database. -* `timestamp: number` - This is the timestamp associated with the current transaction. +- `commit(): Promise` - Commits the current transaction. The transaction will be committed once the returned promise resolves. +- `abort(): void` - Aborts the current transaction and resets it. +- `resetReadSnapshot(): void` - Resets the read snapshot for the transaction, resetting to the latest data in the database. +- `timestamp: number` - This is the timestamp associated with the current transaction. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/End-of-Life.md b/site/versioned_docs/version-4.3/technical-details/release-notes/End-of-Life.md index ca15f713..86853d5e 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/End-of-Life.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/End-of-Life.md @@ -7,7 +7,7 @@ title: HarperDB Software Lifecycle Schedules The lifecycle schedules below form a part of HarperDB’s Support Policies. They include Major Releases and Minor Release that have reached their end of life date in the past 3 years. | **Release** | **Release Date** | **End of Life Date** | -|-------------|------------------|----------------------| +| ----------- | ---------------- | -------------------- | | 3.2 | 6/22 | 6/25 | | 3.3 | 9/22 | 9/25 | | 4.0 | 1/23 | 1/26 | diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/index.md b/site/versioned_docs/version-4.3/technical-details/release-notes/index.md index b6d69205..761820e5 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/index.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/index.md @@ -144,7 +144,7 @@ title: Release Notes [3.0.0 Monkey](./v3-monkey/3.0.0) -*** +--- [Meet Penny](./v2-penny) Our 2nd Release Pup @@ -160,7 +160,7 @@ title: Release Notes [2.1.1 Penny](./v2-penny/2.1.1) -*** +--- [Meet Alby](./v1-alby) Our 1st Release Pup diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.1.0.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.1.0.md index b42514a2..2256a825 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.1.0.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.1.0.md @@ -4,74 +4,69 @@ sidebar_position: 89899 --- ### HarperDB 1.1.0, Alby Release + 4/18/2018 **Features** -* Users & Roles: +- Users & Roles: + - Limit/Assign access to all HarperDB operations + + - Limit/Assign access to schemas, tables & attributes + + - Limit/Assign access to specific SQL operations (`INSERT`, `UPDATE`, `DELETE`, `SELECT`) - * Limit/Assign access to all HarperDB operations +- Enhanced SQL parser + - Added extensive ANSI SQL Support. + - Added Array function, which allows for converting relational data into Object/Hierarchical data + - `Distinct_Array` Function: allows for removing duplicates in the Array function. + - Enhanced SQL Validation: Improved validation around structure of SQL, validating the schema, etc.. + - 10x performance improvement on SQL statements. - * Limit/Assign access to schemas, tables & attributes +- Export Function: can now call a NoSQL/SQL search and have it export to CSV or JSON. - * Limit/Assign access to specific SQL operations (`INSERT`, `UPDATE`, `DELETE`, `SELECT`) - -* Enhanced SQL parser - - * Added extensive ANSI SQL Support. - - * Added Array function, which allows for converting relational data into Object/Hierarchical data - - * `Distinct_Array` Function: allows for removing duplicates in the Array function. - - * Enhanced SQL Validation: Improved validation around structure of SQL, validating the schema, etc.. - - * 10x performance improvement on SQL statements. - -* Export Function: can now call a NoSQL/SQL search and have it export to CSV or JSON. +- Added upgrade function to CLI -* Added upgrade function to CLI +- Added ability to perform bulk update from CSV -* Added ability to perform bulk update from CSV +- Created landing page for HarperDB. -* Created landing page for HarperDB. +- Added CORS support to HarperDB -* Added CORS support to HarperDB - **Fixes** -* Fixed memory leak in CSV bulk loads +- Fixed memory leak in CSV bulk loads -* Corrected error when attempting to perform a `SQL DELETE` +- Corrected error when attempting to perform a `SQL DELETE` -* Added further validation to NoSQL `UPDATE` to validate schema & table exist +- Added further validation to NoSQL `UPDATE` to validate schema & table exist -* Fixed install issue occurring when part of the install path does not exist, the install would silently fail. +- Fixed install issue occurring when part of the install path does not exist, the install would silently fail. -* Fixed issues with replicated data when one of the replicas is down +- Fixed issues with replicated data when one of the replicas is down -* Removed logging of initial user’s credentials during install +- Removed logging of initial user’s credentials during install -* Can now use reserved words as aliases in SQL +- Can now use reserved words as aliases in SQL -* Removed user(s) password in results when calling `list_users` +- Removed user(s) password in results when calling `list_users` -* Corrected forwarding of operations to other nodes in a cluster +- Corrected forwarding of operations to other nodes in a cluster -* Corrected lag in schema meta-data passing to other nodes in a cluster +- Corrected lag in schema meta-data passing to other nodes in a cluster -* Drop table & schema now move the table & schema or table to the trash folder under the Database folder for later permanent deletion. +- Drop table & schema now move the table & schema or table to the trash folder under the Database folder for later permanent deletion. -* Bulk inserts no longer halt the entire operation if n records already exist, instead the return includes the hashes of records that have been skipped. +- Bulk inserts no longer halt the entire operation if n records already exist, instead the return includes the hashes of records that have been skipped. -* Added ability to accept EULA from command line +- Added ability to accept EULA from command line -* Corrected `search_by_value` not searching on the correct attribute +- Corrected `search_by_value` not searching on the correct attribute -* Added ability to increase the timeout of a request by adding `SERVER_TIMEOUT_MS` to config/settings.js +- Added ability to increase the timeout of a request by adding `SERVER_TIMEOUT_MS` to config/settings.js -* Add error handling resulting from SQL calculations. +- Add error handling resulting from SQL calculations. -* Standardized error responses as JSON. +- Standardized error responses as JSON. -* Corrected internal process generation to not allow more processes than machine has cores. \ No newline at end of file +- Corrected internal process generation to not allow more processes than machine has cores. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.2.0.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.2.0.md index 095bf239..a504a7ad 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.2.0.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.2.0.md @@ -4,39 +4,39 @@ sidebar_position: 89799 --- ### HarperDB 1.2.0, Alby Release + 7/10/2018 **Features** -* Time to Live: Conserve the resources of your edge device by setting data on devices to live for a specific period of time. -* Geo: HarperDB has implemented turf.js into its SQL parser to enable geo based analytics. -* Jobs: CSV Data loads, Exports & Time to Live now all run as back ground jobs. -* Exports: Perform queries that export into JSON or CSV and save to disk or S3. - +- Time to Live: Conserve the resources of your edge device by setting data on devices to live for a specific period of time. +- Geo: HarperDB has implemented turf.js into its SQL parser to enable geo based analytics. +- Jobs: CSV Data loads, Exports & Time to Live now all run as back ground jobs. +- Exports: Perform queries that export into JSON or CSV and save to disk or S3. **Fixes** -* Fixed issue where CSV data loads incorrectly report number of records loaded. -* Added validation to stop `BETWEEN` operations in SQL. -* Updated logging to not include internal variables in the logs. -* Cleaned up `add_role` response to not include internal variables. -* Removed old and unused dependencies. -* Build out further unit tests and integration tests. -* Fixed https to handle certificates properly. -* Improved stability of clustering & replication. -* Corrected issue where Objects and Arrays were not casting properly in `SQL SELECT` response. -* Fixed issue where Blob text was not being returned from `SQL SELECT`s. -* Fixed error being returned when querying on table with no data, now correctly returns empty array. -* Improved performance in SQL when searching on exact values. -* Fixed error when ./harperdb stop is called. -* Fixed logging issue causing instability in installer. -* Fixed `read_log` operation to accept date time. -* Added permissions checking to `export_to_s3`. -* Added ability to run SQL on `SELECT` without a `FROM`. -* Fixed issue where updating a user’s password was not encrypting properly. -* Fixed `user_guide.html` to point to readme on git repo. -* Created option to have HarperDB run as a foreground process. -* Updated `user_info` to return the correct role for a user. -* Fixed issue where HarperDB would not stop if the database root was deleted. -* Corrected error message on insert if an invalid schema is provided. -* Added permissions checks for user & role operations. \ No newline at end of file +- Fixed issue where CSV data loads incorrectly report number of records loaded. +- Added validation to stop `BETWEEN` operations in SQL. +- Updated logging to not include internal variables in the logs. +- Cleaned up `add_role` response to not include internal variables. +- Removed old and unused dependencies. +- Build out further unit tests and integration tests. +- Fixed https to handle certificates properly. +- Improved stability of clustering & replication. +- Corrected issue where Objects and Arrays were not casting properly in `SQL SELECT` response. +- Fixed issue where Blob text was not being returned from `SQL SELECT`s. +- Fixed error being returned when querying on table with no data, now correctly returns empty array. +- Improved performance in SQL when searching on exact values. +- Fixed error when ./harperdb stop is called. +- Fixed logging issue causing instability in installer. +- Fixed `read_log` operation to accept date time. +- Added permissions checking to `export_to_s3`. +- Added ability to run SQL on `SELECT` without a `FROM`. +- Fixed issue where updating a user’s password was not encrypting properly. +- Fixed `user_guide.html` to point to readme on git repo. +- Created option to have HarperDB run as a foreground process. +- Updated `user_info` to return the correct role for a user. +- Fixed issue where HarperDB would not stop if the database root was deleted. +- Corrected error message on insert if an invalid schema is provided. +- Added permissions checks for user & role operations. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.3.0.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.3.0.md index ad196159..e3a5215f 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.3.0.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.3.0.md @@ -4,24 +4,24 @@ sidebar_position: 89699 --- ### HarperDB 1.3.0, Alby Release + 11/2/2018 **Features** -* Upgrade: Upgrade to newest version via command line. -* SQL Support: Added `IS NULL` for SQL parser. -* Added attribute validation to search operations. - +- Upgrade: Upgrade to newest version via command line. +- SQL Support: Added `IS NULL` for SQL parser. +- Added attribute validation to search operations. **Fixes** -* Fixed `SELECT` calculations, i.e. `SELECT` 2+2. -* Fixed select OR not returning expected results. -* No longer allowing reserved words for schema and table names. -* Corrected process interruptions from improper SQL statements. -* Improved message handling between spawned processes that replace killed processes. -* Enhanced error handling for updates to tables that do not exist. -* Fixed error handling for NoSQL responses when `get_attributes` is provided with invalid attributes. -* Fixed issue with new columns not being updated properly in update statements. -* Now validating roles, tables and attributes when creating or updating roles. -* Fixed an issue where in some cases `undefined` was being returned after dropping a role +- Fixed `SELECT` calculations, i.e. `SELECT` 2+2. +- Fixed select OR not returning expected results. +- No longer allowing reserved words for schema and table names. +- Corrected process interruptions from improper SQL statements. +- Improved message handling between spawned processes that replace killed processes. +- Enhanced error handling for updates to tables that do not exist. +- Fixed error handling for NoSQL responses when `get_attributes` is provided with invalid attributes. +- Fixed issue with new columns not being updated properly in update statements. +- Now validating roles, tables and attributes when creating or updating roles. +- Fixed an issue where in some cases `undefined` was being returned after dropping a role diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.3.1.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.3.1.md index 77e3ffe4..56927389 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.3.1.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/1.3.1.md @@ -4,26 +4,26 @@ sidebar_position: 89698 --- ### HarperDB 1.3.1, Alby Release + 2/26/2019 **Features** -* Clustering connection direction appointment -* Foundations for threading/multi processing -* UUID autogen for hash attributes that were not provided -* Added cluster status operation - +- Clustering connection direction appointment +- Foundations for threading/multi processing +- UUID autogen for hash attributes that were not provided +- Added cluster status operation **Bug Fixes and Enhancements** -* More logging -* Clustering communication enhancements -* Clustering queue ordering by timestamps -* Cluster re connection enhancements -* Number of system core(s) detection -* Node LTS (10.15) compatibility -* Update/Alter users enhancements -* General performance enhancements -* Warning is logged if different versions of harperdb are connected via clustering -* Fixed need to restart after user creation/alteration -* Fixed SQL error that occurred on selecting from an empty table \ No newline at end of file +- More logging +- Clustering communication enhancements +- Clustering queue ordering by timestamps +- Cluster re connection enhancements +- Number of system core(s) detection +- Node LTS (10.15) compatibility +- Update/Alter users enhancements +- General performance enhancements +- Warning is logged if different versions of harperdb are connected via clustering +- Fixed need to restart after user creation/alteration +- Fixed SQL error that occurred on selecting from an empty table diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/_category_.json b/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/_category_.json index e33195ec..9eded684 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/_category_.json +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v1-alby/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Alby (Version 1)", - "position": -1 -} \ No newline at end of file + "label": "HarperDB Alby (Version 1)", + "position": -1 +} diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.1.1.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.1.1.md index e1314a5f..c59337d7 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.1.1.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.1.1.md @@ -4,24 +4,25 @@ sidebar_position: 79898 --- ### HarperDB 2.1.1, Penny Release + 05/22/2020 **Highlights** -* CORE-1007 Added the ability to perform `SQL INSERT` & `UPDATE` with function calls & expressions on values. -* CORE-1023 Fixed minor bug in final SQL step incorrectly trying to translate ordinals to alias in `ORDER BY` statement. -* CORE-1020 Fixed bug allowing 'null' and 'undefined' string values to be passed in as valid hash values. -* CORE-1006 Added SQL functionality that enables `JOIN` statements across different schemas. -* CORE-1005 Implemented JSONata library to handle our JSON document search functionality in SQL, creating the `SEARCH_JSON` function. -* CORE-1009 Updated schema validation to allow all printable ASCII characters to be used in schema/table/attribute names, except, forward slashes and backticks. Same rules apply now for hash attribute values. -* CORE-1003 Fixed handling of ORDER BY statements with function aliases. -* CORE-1004 Fixed bug related to `SELECT*` on `JOIN` queries with table columns with the same name. -* CORE-996 Fixed an issue where the `transact_to_cluster` flag is lost for CSV URL loads, fixed an issue where new attributes created in CSV bulk load do not sync to the cluster. -* CORE-994 Added new operation `system_information`. This operation returns info & metrics for the OS, time, memory, cpu, disk, network. -* CORE-993 Added new custom date functions for AlaSQL & UTC updates. -* CORE-991 Changed jobs to spawn a new process which will run the intended job without impacting a main HarperDB process. -* CORE-992 HTTPS enabled by default. -* CORE-990 Updated `describe_table` to add the record count for the table for LMDB data storage. -* CORE-989 Killed the socket cluster processes prior to HarperDB processes to eliminate a false uptime. -* CORE-975 Updated time values set by SQL Date Functions to be in epoch format. -* CORE-974 Added date functions to `SQL SELECT` column alias functionality. \ No newline at end of file +- CORE-1007 Added the ability to perform `SQL INSERT` & `UPDATE` with function calls & expressions on values. +- CORE-1023 Fixed minor bug in final SQL step incorrectly trying to translate ordinals to alias in `ORDER BY` statement. +- CORE-1020 Fixed bug allowing 'null' and 'undefined' string values to be passed in as valid hash values. +- CORE-1006 Added SQL functionality that enables `JOIN` statements across different schemas. +- CORE-1005 Implemented JSONata library to handle our JSON document search functionality in SQL, creating the `SEARCH_JSON` function. +- CORE-1009 Updated schema validation to allow all printable ASCII characters to be used in schema/table/attribute names, except, forward slashes and backticks. Same rules apply now for hash attribute values. +- CORE-1003 Fixed handling of ORDER BY statements with function aliases. +- CORE-1004 Fixed bug related to `SELECT*` on `JOIN` queries with table columns with the same name. +- CORE-996 Fixed an issue where the `transact_to_cluster` flag is lost for CSV URL loads, fixed an issue where new attributes created in CSV bulk load do not sync to the cluster. +- CORE-994 Added new operation `system_information`. This operation returns info & metrics for the OS, time, memory, cpu, disk, network. +- CORE-993 Added new custom date functions for AlaSQL & UTC updates. +- CORE-991 Changed jobs to spawn a new process which will run the intended job without impacting a main HarperDB process. +- CORE-992 HTTPS enabled by default. +- CORE-990 Updated `describe_table` to add the record count for the table for LMDB data storage. +- CORE-989 Killed the socket cluster processes prior to HarperDB processes to eliminate a false uptime. +- CORE-975 Updated time values set by SQL Date Functions to be in epoch format. +- CORE-974 Added date functions to `SQL SELECT` column alias functionality. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.2.0.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.2.0.md index 267168cd..a669ca8b 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.2.0.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.2.0.md @@ -4,40 +4,41 @@ sidebar_position: 79799 --- ### HarperDB 2.2.0, Penny Release + 08/24/2020 **Features/Updates** -* CORE-997 Updated the data format for CSV data loads being sync'd across a cluster to take up less resources -* CORE-1018 Adds SQL functionality for `BETWEEN` statements -* CORE-1032 Updates permissions to allow regular users (i.e. non-super users) to call the `get_job` operation -* CORE-1036 On create/drop table we auto create/drop the related transactions environments for the schema.table -* CORE-1042 Built raw functions to write to a tables transaction log for insert/update/delete operations -* CORE-1057 Implemented write transaction into lmdb create/update/delete functions -* CORE-1048 Adds `SEARCH` wildcard handling for role permissions standards -* CORE-1059 Added config setting to disable transaction logging for an instance -* CORE-1076 Adds permissions filter to describe operations -* CORE-1043 Change clustering catchup to use the new transaction log -* CORE-1052 Removed word "master" from source -* CORE-1061 Added new operation called `delete_transactions_before` this will tail a transaction log for a specific schema / table -* CORE-1040 On HarperDB startup make sure all tables have a transaction environment -* CORE-1055 Added 2 new setting to change the server headersTimeout & keepAliveTimeout from the config file -* CORE-1044 Created new operation `read_transaction_log` which will allow a user to get transactions for a table by `timestamp`, `username`, or `hash_value` -* CORE-1043 Change clustering catchup to use the new transaction log -* CORE-1089 Added new attribute to `system_information` for table/transaction log data size in bytes & transaction log record count -* CORE-1101 Fix to store empty strings rather than considering them null & fix to be able to search on empty strings in SQL/NoSQL. -* CORE-1054 Updates permissions object to remove delete attribute permission and update table attribute permission key to `attribute_permissions` -* CORE-1092 Do not allow the `__createdtime__` to be updated -* CORE-1085 Updates create schema/table & drop schema/table/attribute operations permissions to require super user role and adds integration tests to validate -* CORE-1071 Updates response messages and status codes from `describe_schema` and `describe_table` operations to provide standard language/status code when a schema item is not found -* CORE-1049 Updates response message for SQL update op with no matching rows -* CORE-1096 Added tracking of the origin in the transaction log. This origin object stores the node name, timestamp of the transaction from the originating node & the user. +- CORE-997 Updated the data format for CSV data loads being sync'd across a cluster to take up less resources +- CORE-1018 Adds SQL functionality for `BETWEEN` statements +- CORE-1032 Updates permissions to allow regular users (i.e. non-super users) to call the `get_job` operation +- CORE-1036 On create/drop table we auto create/drop the related transactions environments for the schema.table +- CORE-1042 Built raw functions to write to a tables transaction log for insert/update/delete operations +- CORE-1057 Implemented write transaction into lmdb create/update/delete functions +- CORE-1048 Adds `SEARCH` wildcard handling for role permissions standards +- CORE-1059 Added config setting to disable transaction logging for an instance +- CORE-1076 Adds permissions filter to describe operations +- CORE-1043 Change clustering catchup to use the new transaction log +- CORE-1052 Removed word "master" from source +- CORE-1061 Added new operation called `delete_transactions_before` this will tail a transaction log for a specific schema / table +- CORE-1040 On HarperDB startup make sure all tables have a transaction environment +- CORE-1055 Added 2 new setting to change the server headersTimeout & keepAliveTimeout from the config file +- CORE-1044 Created new operation `read_transaction_log` which will allow a user to get transactions for a table by `timestamp`, `username`, or `hash_value` +- CORE-1043 Change clustering catchup to use the new transaction log +- CORE-1089 Added new attribute to `system_information` for table/transaction log data size in bytes & transaction log record count +- CORE-1101 Fix to store empty strings rather than considering them null & fix to be able to search on empty strings in SQL/NoSQL. +- CORE-1054 Updates permissions object to remove delete attribute permission and update table attribute permission key to `attribute_permissions` +- CORE-1092 Do not allow the `__createdtime__` to be updated +- CORE-1085 Updates create schema/table & drop schema/table/attribute operations permissions to require super user role and adds integration tests to validate +- CORE-1071 Updates response messages and status codes from `describe_schema` and `describe_table` operations to provide standard language/status code when a schema item is not found +- CORE-1049 Updates response message for SQL update op with no matching rows +- CORE-1096 Added tracking of the origin in the transaction log. This origin object stores the node name, timestamp of the transaction from the originating node & the user. **Bug Fixes** -* CORE-1028 Fixes bug for simple `SQL SELECT` queries not returning aliases and incorrectly returning hash values when not requested in query -* CORE-1037 Fixed an issue where numbers with leading zero i.e. 00123 are converted to numbers rather than being honored as strings. -* CORE-1063 Updates permission error response shape to consolidate issues into individual objects per schema/table combo -* CORE-1098 Fixed an issue where transaction environments were remaining in the global cache after being dropped. -* CORE-1086 Fixed issue where responses from insert/update were incorrect with skipped records. -* CORE-1079 Fixes SQL bugs around invalid schema/table and special characters in `WHERE` clause \ No newline at end of file +- CORE-1028 Fixes bug for simple `SQL SELECT` queries not returning aliases and incorrectly returning hash values when not requested in query +- CORE-1037 Fixed an issue where numbers with leading zero i.e. 00123 are converted to numbers rather than being honored as strings. +- CORE-1063 Updates permission error response shape to consolidate issues into individual objects per schema/table combo +- CORE-1098 Fixed an issue where transaction environments were remaining in the global cache after being dropped. +- CORE-1086 Fixed issue where responses from insert/update were incorrect with skipped records. +- CORE-1079 Fixes SQL bugs around invalid schema/table and special characters in `WHERE` clause diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.2.2.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.2.2.md index 827c63db..fca00967 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.2.2.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.2.2.md @@ -4,13 +4,14 @@ sidebar_position: 79797 --- ### HarperDB 2.2.2, Penny Release + 10/27/2020 -* CORE-1154 Allowed transaction logging to be disabled even if clustering is enabled. -* CORE-1153 Fixed issue where `delete_files_before` was writing to transaction log. -* CORE-1152 Fixed issue where no more than 4 HarperDB forks would be created. -* CORE-1112 Adds handling for system timestamp attributes in permissions. -* CORE-1131 Adds better handling for checking perms on operations with action value in JSON. -* CORE-1113 Fixes validation bug checking for super user/cluster user permissions and other permissions. -* CORE-1135 Adds validation for valid keys in role API operations. -* CORE-1073 Adds new `import_from_s3` operation to API. +- CORE-1154 Allowed transaction logging to be disabled even if clustering is enabled. +- CORE-1153 Fixed issue where `delete_files_before` was writing to transaction log. +- CORE-1152 Fixed issue where no more than 4 HarperDB forks would be created. +- CORE-1112 Adds handling for system timestamp attributes in permissions. +- CORE-1131 Adds better handling for checking perms on operations with action value in JSON. +- CORE-1113 Fixes validation bug checking for super user/cluster user permissions and other permissions. +- CORE-1135 Adds validation for valid keys in role API operations. +- CORE-1073 Adds new `import_from_s3` operation to API. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.2.3.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.2.3.md index eca953e2..06b89d4e 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.2.3.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.2.3.md @@ -4,6 +4,7 @@ sidebar_position: 79796 --- ### HarperDB 2.2.3, Penny Release + 11/16/2020 -* CORE-1158 Performance improvements to core delete function and configuration of `delete_files_before` to run in batches with a pause into between. \ No newline at end of file +- CORE-1158 Performance improvements to core delete function and configuration of `delete_files_before` to run in batches with a pause into between. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.3.0.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.3.0.md index 2b248490..a027eedb 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.3.0.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.3.0.md @@ -4,19 +4,20 @@ sidebar_position: 79699 --- ### HarperDB 2.3.0, Penny Release + 12/03/2020 **Features/Updates** -* CORE-1191, CORE-1190, CORE-1125, CORE-1157, CORE-1126, CORE-1140, CORE-1134, CORE-1123, CORE-1124, CORE-1122 Added JWT Authentication option (See documentation for more information) -* CORE-1128, CORE-1143, CORE-1140, CORE-1129 Added `upsert` operation -* CORE-1187 Added `get_configuration` operation which allows admins to view their configuration settings. -* CORE-1175 Added new internal LMDB function to copy an environment for use in future features. -* CORE-1166 Updated packages to address security vulnerabilities. +- CORE-1191, CORE-1190, CORE-1125, CORE-1157, CORE-1126, CORE-1140, CORE-1134, CORE-1123, CORE-1124, CORE-1122 Added JWT Authentication option (See documentation for more information) +- CORE-1128, CORE-1143, CORE-1140, CORE-1129 Added `upsert` operation +- CORE-1187 Added `get_configuration` operation which allows admins to view their configuration settings. +- CORE-1175 Added new internal LMDB function to copy an environment for use in future features. +- CORE-1166 Updated packages to address security vulnerabilities. **Bug Fixes** -* CORE-1195 Modified `drop_attribute` to drop after data cleanse completes. -* CORE-1149 Fix SQL bug regarding self joins and updates alasql to 0.6.5 release. -* CORE-1168 Fix inconsistent invalid schema/table errors. -* CORE-1162 Fix bug which caused `delete_files_before` to cause tables to grow in size due to an open cursor issue. \ No newline at end of file +- CORE-1195 Modified `drop_attribute` to drop after data cleanse completes. +- CORE-1149 Fix SQL bug regarding self joins and updates alasql to 0.6.5 release. +- CORE-1168 Fix inconsistent invalid schema/table errors. +- CORE-1162 Fix bug which caused `delete_files_before` to cause tables to grow in size due to an open cursor issue. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.3.1.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.3.1.md index 51291a01..03df0186 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.3.1.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/2.3.1.md @@ -4,9 +4,10 @@ sidebar_position: 79698 --- ### HarperDB 2.3.1, Penny Release + 1/29/2021 **Bug Fixes** -* CORE-1218 A bug in HarperDB 2.3.0 was identified related to manually calling the `create_attribute` operation. This bug caused secondary indexes to be overwritten by the most recently inserted or updated value for the index, thereby causing a search operation filtered with that index to only return the most recently inserted/updated row. Note, this issue does not affect attributes that are reflexively/automatically created. It only affects attributes created using `create_attribute`. To resolve this issue in 2.3.0 or earlier, drop and recreate your table using reflexive attribute creation. In 2.3.1, drop and recreate your table and use either reflexive attribute creation or `create_attribute`. -* CORE-1219 Increased maximum table attributes from 1000 to 10000 \ No newline at end of file +- CORE-1218 A bug in HarperDB 2.3.0 was identified related to manually calling the `create_attribute` operation. This bug caused secondary indexes to be overwritten by the most recently inserted or updated value for the index, thereby causing a search operation filtered with that index to only return the most recently inserted/updated row. Note, this issue does not affect attributes that are reflexively/automatically created. It only affects attributes created using `create_attribute`. To resolve this issue in 2.3.0 or earlier, drop and recreate your table using reflexive attribute creation. In 2.3.1, drop and recreate your table and use either reflexive attribute creation or `create_attribute`. +- CORE-1219 Increased maximum table attributes from 1000 to 10000 diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/_category_.json b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/_category_.json index 285eecf7..28f86bc1 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/_category_.json +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v2-penny/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Penny (Version 2)", - "position": -2 -} \ No newline at end of file + "label": "HarperDB Penny (Version 2)", + "position": -2 +} diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.0.0.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.0.0.md index 2907ee6c..10319747 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.0.0.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.0.0.md @@ -4,28 +4,29 @@ sidebar_position: 69999 --- ### HarperDB 3.0, Monkey Release + 5/18/2021 **Features/Updates** -* CORE-1217, CORE-1226, CORE-1232 Create new `search_by_conditions` operation. -* CORE-1304 Upgrade to Node 12.22.1. -* CORE-1235 Adds new upgrade/install functionality. -* CORE-1206, CORE-1248, CORE-1252 Implement `lmdb-store` library for optimized performance. -* CORE-1062 Added alias operation for `delete_files_before`, named `delete_records_before`. -* CORE-1243 Change `HTTPS_ON` settings value to false by default. -* CORE-1189 Implement fastify web server, resulting in improved performance. -* CORE-1221 Update user API to use role name instead of role id. -* CORE-1225 Updated dependencies to eliminate npm security warnings. -* CORE-1241 Adds 3.0 update directive and refactors/fixes update functionality. +- CORE-1217, CORE-1226, CORE-1232 Create new `search_by_conditions` operation. +- CORE-1304 Upgrade to Node 12.22.1. +- CORE-1235 Adds new upgrade/install functionality. +- CORE-1206, CORE-1248, CORE-1252 Implement `lmdb-store` library for optimized performance. +- CORE-1062 Added alias operation for `delete_files_before`, named `delete_records_before`. +- CORE-1243 Change `HTTPS_ON` settings value to false by default. +- CORE-1189 Implement fastify web server, resulting in improved performance. +- CORE-1221 Update user API to use role name instead of role id. +- CORE-1225 Updated dependencies to eliminate npm security warnings. +- CORE-1241 Adds 3.0 update directive and refactors/fixes update functionality. **Bug Fixes** -* CORE-1299 Remove all references to the `PROJECT_DIR` setting. This setting is problematic when using node version managers and upgrading the version of node and then installing a new instance of HarperDB. -* CORE-1288 Fix bug with drop table/schema that was causing 'env required' error log. -* CORE-1285 Update warning log when trying to create an attribute that already exists. -* CORE-1254 Added logic to manage data collisions in clustering. -* CORE-1212 Add pre-check to `drop_user` that returns error if user doesn't exist. -* CORE-1114 Update response code and message from `add_user` when user already exists. -* CORE-1111 Update response from `create_attribute` to match the create schema/table response. -* CORE-1205 Fixed bug that prevented schema/table from being dropped if name was a number or had a wildcard value in it. Updated validation for insert, upsert and update. \ No newline at end of file +- CORE-1299 Remove all references to the `PROJECT_DIR` setting. This setting is problematic when using node version managers and upgrading the version of node and then installing a new instance of HarperDB. +- CORE-1288 Fix bug with drop table/schema that was causing 'env required' error log. +- CORE-1285 Update warning log when trying to create an attribute that already exists. +- CORE-1254 Added logic to manage data collisions in clustering. +- CORE-1212 Add pre-check to `drop_user` that returns error if user doesn't exist. +- CORE-1114 Update response code and message from `add_user` when user already exists. +- CORE-1111 Update response from `create_attribute` to match the create schema/table response. +- CORE-1205 Fixed bug that prevented schema/table from being dropped if name was a number or had a wildcard value in it. Updated validation for insert, upsert and update. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.0.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.0.md index 148690f6..f14acb8e 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.0.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.0.md @@ -4,20 +4,21 @@ sidebar_position: 69899 --- ### HarperDB 3.1.0, Monkey Release + 8/24/2021 **Features/Updates** -* CORE-1320, CORE-1321, CORE-1323, CORE-1324 Version 1.0 of HarperDB Custom Functions -* CORE-1275, CORE-1276, CORE-1278, CORE-1279, CORE-1280, CORE-1282, CORE-1283, CORE-1305, CORE-1314 IPC server for communication between HarperDB processes, including HarperDB, HarperDB Clustering, and HarperDB Functions -* CORE-1352, CORE-1355, CORE-1356, CORE-1358 Implement pm2 for HarperDB process management -* CORE-1292, CORE-1308, CORE-1312, CORE-1334, CORE-1338 Updated installation process to start HarperDB immediately on install and to accept all config settings via environment variable or command line arguments -* CORE-1310 Updated licensing functionality -* CORE-1301 Updated validation for performance improvement -* CORE-1359 Add `hdb-response-time` header which returns the HarperDB response time in milliseconds -* CORE-1330, CORE-1309 New config settings: `LOG_TO_FILE`, `LOG_TO_STDSTREAMS`, `IPC_SERVER_PORT`, `RUN_IN_FOREGROUND`, `CUSTOM_FUNCTIONS`, `CUSTOM_FUNCTIONS_PORT`, `CUSTOM_FUNCTIONS_DIRECTORY`, `MAX_CUSTOM_FUNCTION_PROCESSES` +- CORE-1320, CORE-1321, CORE-1323, CORE-1324 Version 1.0 of HarperDB Custom Functions +- CORE-1275, CORE-1276, CORE-1278, CORE-1279, CORE-1280, CORE-1282, CORE-1283, CORE-1305, CORE-1314 IPC server for communication between HarperDB processes, including HarperDB, HarperDB Clustering, and HarperDB Functions +- CORE-1352, CORE-1355, CORE-1356, CORE-1358 Implement pm2 for HarperDB process management +- CORE-1292, CORE-1308, CORE-1312, CORE-1334, CORE-1338 Updated installation process to start HarperDB immediately on install and to accept all config settings via environment variable or command line arguments +- CORE-1310 Updated licensing functionality +- CORE-1301 Updated validation for performance improvement +- CORE-1359 Add `hdb-response-time` header which returns the HarperDB response time in milliseconds +- CORE-1330, CORE-1309 New config settings: `LOG_TO_FILE`, `LOG_TO_STDSTREAMS`, `IPC_SERVER_PORT`, `RUN_IN_FOREGROUND`, `CUSTOM_FUNCTIONS`, `CUSTOM_FUNCTIONS_PORT`, `CUSTOM_FUNCTIONS_DIRECTORY`, `MAX_CUSTOM_FUNCTION_PROCESSES` **Bug Fixes** -* CORE-1315 Corrected issue in HarperDB restart scenario -* CORE-1370 Update some of the validation error handlers so that they don't log full stack \ No newline at end of file +- CORE-1315 Corrected issue in HarperDB restart scenario +- CORE-1370 Update some of the validation error handlers so that they don't log full stack diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.1.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.1.md index 0adbeb21..8f90dc10 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.1.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.1.md @@ -4,15 +4,16 @@ sidebar_position: 69898 --- ### HarperDB 3.1.1, Monkey Release + 9/23/2021 **Features/Updates** -* CORE-1393 Added utility function to add settings from env/cmd vars to the settings file on every run/restart -* CORE-1395 Create a setting which will allow to enable the local Studio to be served from an instance of HarperDB -* CORE-1397 Update the stock 404 response to not return the request URL -* General updates to optimize Docker container +- CORE-1393 Added utility function to add settings from env/cmd vars to the settings file on every run/restart +- CORE-1395 Create a setting which will allow to enable the local Studio to be served from an instance of HarperDB +- CORE-1397 Update the stock 404 response to not return the request URL +- General updates to optimize Docker container **Bug Fixes** -* CORE-1399 Added fixes for complex SQL alias issues \ No newline at end of file +- CORE-1399 Added fixes for complex SQL alias issues diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.2.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.2.md index f1c192b6..706e5956 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.2.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.2.md @@ -4,12 +4,13 @@ sidebar_position: 69897 --- ### HarperDB 3.1.2, Monkey Release + 10/21/2021 **Features/Updates** -* Updated the installation ASCII art to reflect the new HarperDB logo +- Updated the installation ASCII art to reflect the new HarperDB logo **Bug Fixes** -* CORE-1408 Corrects issue where `drop_attribute` was not properly setting the LMDB version number causing tables to behave unexpectedly \ No newline at end of file +- CORE-1408 Corrects issue where `drop_attribute` was not properly setting the LMDB version number causing tables to behave unexpectedly diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.3.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.3.md index 2d484f8d..1a7d3301 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.3.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.3.md @@ -4,8 +4,9 @@ sidebar_position: 69896 --- ### HarperDB 3.1.3, Monkey Release + 1/14/2022 **Bug Fixes** -* CORE-1446 Fix for scans on indexes larger than 1 million entries causing queries to never return \ No newline at end of file +- CORE-1446 Fix for scans on indexes larger than 1 million entries causing queries to never return diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.4.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.4.md index ae0074fd..3fa86ead 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.4.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.4.md @@ -4,8 +4,9 @@ sidebar_position: 69895 --- ### HarperDB 3.1.4, Monkey Release + 2/24/2022 **Features/Updates** -* CORE-1460 Added new setting `STORAGE_WRITE_ASYNC`. If this setting is true, LMDB will have faster write performance at the expense of not being crash safe. The default for this setting is false, which results in HarperDB being crash safe. \ No newline at end of file +- CORE-1460 Added new setting `STORAGE_WRITE_ASYNC`. If this setting is true, LMDB will have faster write performance at the expense of not being crash safe. The default for this setting is false, which results in HarperDB being crash safe. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.5.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.5.md index eff4b5b0..23661928 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.5.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.1.5.md @@ -4,8 +4,9 @@ sidebar_position: 69894 --- ### HarperDB 3.1.5, Monkey Release + 3/4/2022 **Features/Updates** -* CORE-1498 Fixed incorrect autocasting of string that start with "0." that tries to convert to number but instead returns NaN. \ No newline at end of file +- CORE-1498 Fixed incorrect autocasting of string that start with "0." that tries to convert to number but instead returns NaN. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.2.0.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.2.0.md index 003575d8..fa215082 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.2.0.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.2.0.md @@ -4,10 +4,11 @@ sidebar_position: 69799 --- ### HarperDB 3.2.0, Monkey Release + 3/25/2022 **Features/Updates** -* CORE-1391 Bug fix related to orphaned HarperDB background processes. -* CORE-1509 Updated node version check, updated Node.js version, updated project dependencies. -* CORE-1518 Remove final call from logger. \ No newline at end of file +- CORE-1391 Bug fix related to orphaned HarperDB background processes. +- CORE-1509 Updated node version check, updated Node.js version, updated project dependencies. +- CORE-1518 Remove final call from logger. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.2.1.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.2.1.md index dc511a70..4cc983a4 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.2.1.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.2.1.md @@ -4,8 +4,9 @@ sidebar_position: 69798 --- ### HarperDB 3.2.1, Monkey Release + 6/1/2022 **Features/Updates** -* CORE-1573 Added logic to track the pid of the foreground process if running in foreground. Then on stop, use that pid to kill the process. Logic was also added to kill the pm2 daemon when stop is called. \ No newline at end of file +- CORE-1573 Added logic to track the pid of the foreground process if running in foreground. Then on stop, use that pid to kill the process. Logic was also added to kill the pm2 daemon when stop is called. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.3.0.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.3.0.md index 3e3ca784..236704dd 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.3.0.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/3.3.0.md @@ -5,8 +5,8 @@ sidebar_position: 69699 ### HarperDB 3.3.0 - Monkey -* CORE-1595 Added new role type `structure_user`, this enables non-superusers to be able to create/drop schema/table/attribute. -* CORE-1501 Improved performance for drop_table. -* CORE-1599 Added two new operations for custom functions `install_node_modules` & `audit_node_modules`. -* CORE-1598 Added `skip_node_modules` flag to `package_custom_function_project` operation. This flag allows for not bundling project dependencies and deploying a smaller project to other nodes. Use this flag in tandem with `install_node_modules`. -* CORE-1707 Binaries are now included for Linux on AMD64, Linux on ARM64, and macOS. GCC, Make, Python are no longer required when installing on these platforms. +- CORE-1595 Added new role type `structure_user`, this enables non-superusers to be able to create/drop schema/table/attribute. +- CORE-1501 Improved performance for drop_table. +- CORE-1599 Added two new operations for custom functions `install_node_modules` & `audit_node_modules`. +- CORE-1598 Added `skip_node_modules` flag to `package_custom_function_project` operation. This flag allows for not bundling project dependencies and deploying a smaller project to other nodes. Use this flag in tandem with `install_node_modules`. +- CORE-1707 Binaries are now included for Linux on AMD64, Linux on ARM64, and macOS. GCC, Make, Python are no longer required when installing on these platforms. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/_category_.json b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/_category_.json index 0103ac36..71bea62a 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/_category_.json +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v3-monkey/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Monkey (Version 3)", - "position": -3 -} \ No newline at end of file + "label": "HarperDB Monkey (Version 3)", + "position": -3 +} diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.0.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.0.md index d2aa32b2..b94ea2f8 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.0.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.0.md @@ -4,121 +4,128 @@ sidebar_position: 59999 --- ### HarperDB 4.0.0, Tucker Release + 11/2/2022 **Networking & Data Replication (Clustering)** -The HarperDB clustering internals have been rewritten and the underlying technology for Clustering has been completely replaced with [NATS](https://nats.io/), an enterprise grade connective technology responsible for addressing, discovery and exchanging of messages that drive the common patterns in distributed systems. -* CORE-1464, CORE-1470, : Remove SocketCluster dependencies and all code related to them. -* CORE-1465, CORE-1485, CORE-1537, CORE-1538, CORE-1558, CORE-1583, CORE_1665, CORE-1710, CORE-1801, CORE-1865 :Add nats-`server` code as dependency, on install of HarperDB download nats-`server` is possible else fallback to building from source code. -* CORE-1593, CORE-1761: Add `nats.js` as project dependency. -* CORE-1466: Build NATS configs on `harperdb run` based on HarperDB YAML configuration. -* CORE-1467, CORE-1508: Launch and manage NATS servers with PM2. -* CORE-1468, CORE-1507: Create a process which reads the work queue stream and processes transactions. -* CORE-1481, CORE-1529, CORE-1698, CORE-1502, CORE-1696: On upgrade to 4.0, update pre-existing clustering configurations, create table transaction streams, create work queue stream, update `hdb_nodes` table, create clustering folder structure, and rebuild self-signed certs. -* CORE-1494, CORE-1521, CORE-1755: Build out internals to interface with NATS. -* CORE-1504: Update existing hooks to save transactions to work with NATS. -* CORE-1514, CORE-1515, CORE-1516, CORE-1527, CORE-1532: Update `add_node`, `update_node`, and `remove_node` operations to no longer need host and port in payload. These operations now manage dynamically sourcing of table level transaction streams between nodes and work queues. -* CORE-1522: Create `NATSReplyService` process which handles the receiving NATS based requests from remote instances and sending back appropriate responses. -* CORE-1471, CORE-1568, CORE-1563, CORE-1534, CORE-1569: Update `cluster_status` operation. -* CORE-1611: Update pre-existing transaction log operations to be audit log operations. -* CORE-1541, CORE-1612, CORE-1613: Create translation log operations which interface with streams. -* CORE-1668: Update NATS serialization / deserialization to use MessagePack. -* CORE-1673: Add `system_info` param to `hdb_nodes` table and update on `add_node` and `cluster_status`. -* CORE-1477, CORE-1493, CORE-1557, CORE-1596, CORE-1577: Both a full HarperDB restart & just clustering restart call the NATS server with a reload directive to maintain full uptime while servers refresh. -* CORE-1474:HarperDB install adds clustering folder structure. -* CORE-1530: Post `drop_table` HarperDB purges the related transaction stream. -* CORE-1567: Set NATS config to always use TLS. -* CORE-1543: Removed the `transact_to_cluster` attribute from the bulk load operations. Now bulk loads always replicate. -* CORE-1533, CORE-1556, CORE-1561, CORE-1562, CORE-1564: New operation `configure_cluster`, this operation enables bulk publishing and subscription of multiple tables to multiple instances of HarperDB. -* CORE-1535: Create work queue stream on install of HarperDB. This stream receives transactions from remote instances of HarperDB which are then ingested in order. -* CORE-1551: Create transaction streams on the remote node if they do not exist when performing `add_node` or `update_node`. -* CORE-1594, CORE-1605, CORE-1749, CORE-1767, CORE-1770: Optimize the work queue stream and its consumer to be more performant and validate exact once delivery. -* CORE-1621, CORE-1692, CORE-1570, CORE-1693: NATS stream names are MD5 hashed to avoid characters that HarperDB allows, but NATS may not. -* CORE-1762: Add a new optional attribute to `add_node` and `update_node` named `opt_start_time`. This attribute sets a starting time to start synchronizing transactions. -* CORE-1785: Optimizations and bug fixes in regards to sourcing data from remote instances on HarperDB. -* CORE-1588: Created new operation `set_cluster_routes` to enable setting routes for instances of HarperDB to mesh together. -* CORE-1589: Created new operation `get_cluster_routes` to allow for retrieval of routes used to connect the instance of HarperDB to the mesh. -* CORE-1590: Created new operation `delete_cluster_routes` to allow for removal of routes used to connect the instance of HarperDB to the mesh. -* CORE-1667: Fix old environment variable `CLUSTERING_PORT` not mapping to new hub server port. -* CORE-1609: Allow `remove_node` to be called when the other node cannot be reached. -* CORE-1815: Add transaction lock to `add_node` and `update_node` to avoid concurrent nats source update bug. -* CORE-1848: Update stream configs if the node name has been changed in the YAML configuration. -* CORE-1873: Update `add_node` and `update_node` so that it auto-creates schema/table on both local and remote node respectively +The HarperDB clustering internals have been rewritten and the underlying technology for Clustering has been completely replaced with [NATS](https://nats.io/), an enterprise grade connective technology responsible for addressing, discovery and exchanging of messages that drive the common patterns in distributed systems. +- CORE-1464, CORE-1470, : Remove SocketCluster dependencies and all code related to them. +- CORE-1465, CORE-1485, CORE-1537, CORE-1538, CORE-1558, CORE-1583, CORE_1665, CORE-1710, CORE-1801, CORE-1865 :Add nats-`server` code as dependency, on install of HarperDB download nats-`server` is possible else fallback to building from source code. +- CORE-1593, CORE-1761: Add `nats.js` as project dependency. +- CORE-1466: Build NATS configs on `harperdb run` based on HarperDB YAML configuration. +- CORE-1467, CORE-1508: Launch and manage NATS servers with PM2. +- CORE-1468, CORE-1507: Create a process which reads the work queue stream and processes transactions. +- CORE-1481, CORE-1529, CORE-1698, CORE-1502, CORE-1696: On upgrade to 4.0, update pre-existing clustering configurations, create table transaction streams, create work queue stream, update `hdb_nodes` table, create clustering folder structure, and rebuild self-signed certs. +- CORE-1494, CORE-1521, CORE-1755: Build out internals to interface with NATS. +- CORE-1504: Update existing hooks to save transactions to work with NATS. +- CORE-1514, CORE-1515, CORE-1516, CORE-1527, CORE-1532: Update `add_node`, `update_node`, and `remove_node` operations to no longer need host and port in payload. These operations now manage dynamically sourcing of table level transaction streams between nodes and work queues. +- CORE-1522: Create `NATSReplyService` process which handles the receiving NATS based requests from remote instances and sending back appropriate responses. +- CORE-1471, CORE-1568, CORE-1563, CORE-1534, CORE-1569: Update `cluster_status` operation. +- CORE-1611: Update pre-existing transaction log operations to be audit log operations. +- CORE-1541, CORE-1612, CORE-1613: Create translation log operations which interface with streams. +- CORE-1668: Update NATS serialization / deserialization to use MessagePack. +- CORE-1673: Add `system_info` param to `hdb_nodes` table and update on `add_node` and `cluster_status`. +- CORE-1477, CORE-1493, CORE-1557, CORE-1596, CORE-1577: Both a full HarperDB restart & just clustering restart call the NATS server with a reload directive to maintain full uptime while servers refresh. +- CORE-1474:HarperDB install adds clustering folder structure. +- CORE-1530: Post `drop_table` HarperDB purges the related transaction stream. +- CORE-1567: Set NATS config to always use TLS. +- CORE-1543: Removed the `transact_to_cluster` attribute from the bulk load operations. Now bulk loads always replicate. +- CORE-1533, CORE-1556, CORE-1561, CORE-1562, CORE-1564: New operation `configure_cluster`, this operation enables bulk publishing and subscription of multiple tables to multiple instances of HarperDB. +- CORE-1535: Create work queue stream on install of HarperDB. This stream receives transactions from remote instances of HarperDB which are then ingested in order. +- CORE-1551: Create transaction streams on the remote node if they do not exist when performing `add_node` or `update_node`. +- CORE-1594, CORE-1605, CORE-1749, CORE-1767, CORE-1770: Optimize the work queue stream and its consumer to be more performant and validate exact once delivery. +- CORE-1621, CORE-1692, CORE-1570, CORE-1693: NATS stream names are MD5 hashed to avoid characters that HarperDB allows, but NATS may not. +- CORE-1762: Add a new optional attribute to `add_node` and `update_node` named `opt_start_time`. This attribute sets a starting time to start synchronizing transactions. +- CORE-1785: Optimizations and bug fixes in regards to sourcing data from remote instances on HarperDB. +- CORE-1588: Created new operation `set_cluster_routes` to enable setting routes for instances of HarperDB to mesh together. +- CORE-1589: Created new operation `get_cluster_routes` to allow for retrieval of routes used to connect the instance of HarperDB to the mesh. +- CORE-1590: Created new operation `delete_cluster_routes` to allow for removal of routes used to connect the instance of HarperDB to the mesh. +- CORE-1667: Fix old environment variable `CLUSTERING_PORT` not mapping to new hub server port. +- CORE-1609: Allow `remove_node` to be called when the other node cannot be reached. +- CORE-1815: Add transaction lock to `add_node` and `update_node` to avoid concurrent nats source update bug. +- CORE-1848: Update stream configs if the node name has been changed in the YAML configuration. +- CORE-1873: Update `add_node` and `update_node` so that it auto-creates schema/table on both local and remote node respectively **Data Storage** We have made improvements to how we store, index, and retrieve data. -* CORE-1619: Enabled new concurrent flushing technology for improved write performance. -* CORE-1701: Optimize search performance for `search_by_conditions` when executing multiple AND conditions. -* CORE-1652: Encode the values of secondary indices more efficiently for faster access. -* CORE-1670: Store updated timestamp in `lmdb.js`' version property. -* CORE-1651: Enabled multiple value indexing of array values which allows for the ability to search on specific elements in an array more efficiently. -* CORE-1649, CORE-1659: Large text values (larger than 255 bytes) are no longer stored in separate blob index. Now they are segmented and delimited in the same index to increase search performance. -* Complex objects and object arrays are no longer stored in a separate index to preserve storage and increase write throughput. -* CORE-1650, CORE-1724, CORE-1738: Improved internals around interpreting attribute values. -* CORE-1657: Deferred property decoding allows large objects to be stored, but individual attributes can be accessed (like with get_attributes) without incurring the cost of decoding the entire object. -* CORE-1658: Enable in-memory caching of records for even faster access to frequently accessed data. -* CORE-1693: Wrap updates in async transactions to ensure ACID-compliant updates. -* CORE-1653: Upgrade to 4.0 rebuilds tables to reflect changes made to index improvements. -* CORE-1753: Removed old `node-lmdb` dependency. -* CORE-1787: Freeze objects returned from queries. -* CORE-1821: Read the `WRITE_ASYNC` setting which enables LMDB nosync. + +- CORE-1619: Enabled new concurrent flushing technology for improved write performance. +- CORE-1701: Optimize search performance for `search_by_conditions` when executing multiple AND conditions. +- CORE-1652: Encode the values of secondary indices more efficiently for faster access. +- CORE-1670: Store updated timestamp in `lmdb.js`' version property. +- CORE-1651: Enabled multiple value indexing of array values which allows for the ability to search on specific elements in an array more efficiently. +- CORE-1649, CORE-1659: Large text values (larger than 255 bytes) are no longer stored in separate blob index. Now they are segmented and delimited in the same index to increase search performance. +- Complex objects and object arrays are no longer stored in a separate index to preserve storage and increase write throughput. +- CORE-1650, CORE-1724, CORE-1738: Improved internals around interpreting attribute values. +- CORE-1657: Deferred property decoding allows large objects to be stored, but individual attributes can be accessed (like with get_attributes) without incurring the cost of decoding the entire object. +- CORE-1658: Enable in-memory caching of records for even faster access to frequently accessed data. +- CORE-1693: Wrap updates in async transactions to ensure ACID-compliant updates. +- CORE-1653: Upgrade to 4.0 rebuilds tables to reflect changes made to index improvements. +- CORE-1753: Removed old `node-lmdb` dependency. +- CORE-1787: Freeze objects returned from queries. +- CORE-1821: Read the `WRITE_ASYNC` setting which enables LMDB nosync. **Logging** HarperDB has increased logging specificity by breaking out logs based on components logging. There are specific log files each for HarperDB Core, Custom Functions, Hub Server, Leaf Server, and more. -* CORE-1497: Remove `pino` and `winston` dependencies. -* CORE-1426: All logging is output via `stdout` and `stderr`, our default logging is then picked up by PM2 which handles writing out to file. -* CORE-1431: Improved `read_log` operation validation. -* CORE-1433, CORE-1463: Added log rotation. -* CORE-1553, CORE-1555, CORE-1552, CORE-1554, CORE-1704: Performance gain by only serializing objects and arrays if the log is for the level defined in configuration. -* CORE-1436: Upgrade to 4.0 updates internals for logging changes. -* CORE-1428, CORE-1440, CORE-1442, CORE-1434, CORE-1435, CORE-1439, CORE-1482, CORE-1751, CORE-1752: Bug fixes, performance improvements and improved unit tests. -* CORE-1691: Convert non-PM2 managed log file writes to use Node.js `fs.appendFileSync` function. + +- CORE-1497: Remove `pino` and `winston` dependencies. +- CORE-1426: All logging is output via `stdout` and `stderr`, our default logging is then picked up by PM2 which handles writing out to file. +- CORE-1431: Improved `read_log` operation validation. +- CORE-1433, CORE-1463: Added log rotation. +- CORE-1553, CORE-1555, CORE-1552, CORE-1554, CORE-1704: Performance gain by only serializing objects and arrays if the log is for the level defined in configuration. +- CORE-1436: Upgrade to 4.0 updates internals for logging changes. +- CORE-1428, CORE-1440, CORE-1442, CORE-1434, CORE-1435, CORE-1439, CORE-1482, CORE-1751, CORE-1752: Bug fixes, performance improvements and improved unit tests. +- CORE-1691: Convert non-PM2 managed log file writes to use Node.js `fs.appendFileSync` function. **Configuration** HarperDB has updated its configuration from a properties file to YAML. -* CORE-1448, CORE-1449, CORE-1519, CORE-1587: Upgrade automatically converts the pre-existing settings file to YAML. -* CORE-1445, CORE-1534, CORE-1444, CORE-1858: Build out new logic to create, update, and interpret the YAML configuration file. -* Installer has updated prompts to reflect YAML settings. -* CORE-1447: Create an alias for the `configure_cluster` operation as `set_configuration`. -* CORE-1461, CORE-1462, CORE-1483: Unit test improvements. -* CORE-1492: Improvements to get_configuration and set_configuration operations. -* CORE-1503: Modify HarperDB configuration for more granular certificate definition. -* CORE-1591: Update `routes` IP param to `host` and to `leaf` config in `harperdb.conf` -* CORE-1519: Fix issue when switching between old and new versions of HarperDB we are getting the config parameter is undefined error on npm install. + +- CORE-1448, CORE-1449, CORE-1519, CORE-1587: Upgrade automatically converts the pre-existing settings file to YAML. +- CORE-1445, CORE-1534, CORE-1444, CORE-1858: Build out new logic to create, update, and interpret the YAML configuration file. +- Installer has updated prompts to reflect YAML settings. +- CORE-1447: Create an alias for the `configure_cluster` operation as `set_configuration`. +- CORE-1461, CORE-1462, CORE-1483: Unit test improvements. +- CORE-1492: Improvements to get_configuration and set_configuration operations. +- CORE-1503: Modify HarperDB configuration for more granular certificate definition. +- CORE-1591: Update `routes` IP param to `host` and to `leaf` config in `harperdb.conf` +- CORE-1519: Fix issue when switching between old and new versions of HarperDB we are getting the config parameter is undefined error on npm install. **Broad NodeJS and Platform Support** -* CORE-1624: HarperDB can now run on multiple versions of NodeJS, from v14 to v19. We primarily test on v18, so that is the preferred version. + +- CORE-1624: HarperDB can now run on multiple versions of NodeJS, from v14 to v19. We primarily test on v18, so that is the preferred version. **Windows 10 and 11** -* CORE-1088: HarperDB now runs natively on Windows 10 and 11 without the need to run in a container or installed in WSL. Windows is only intended for evaluation and development purposes, not for production work loads. + +- CORE-1088: HarperDB now runs natively on Windows 10 and 11 without the need to run in a container or installed in WSL. Windows is only intended for evaluation and development purposes, not for production work loads. **Extra Changes and Bug Fixes** -* CORE-1520: Refactor installer to remove all waterfall code and update to use Promises. -* CORE-1573: Stop the PM2 daemon and any logging processes when stopping hdb. -* CORE-1586: When HarperDB is running in foreground stop any additional logging processes from being spawned. -* CORE-1626: Update docker file to accommodate new `harperdb.conf` file. -* CORE-1592, CORE-1526, CORE-1660, CORE-1646, CORE-1640, CORE-1689, CORE-1711, CORE-1601, CORE-1726, CORE-1728, CORE-1736, CORE-1735, CORE-1745, CORE-1729, CORE-1748, CORE-1644, CORE-1750, CORE-1757, CORE-1727, CORE-1740, CORE-1730, CORE-1777, CORE-1778, CORE-1782, CORE-1775, CORE-1771, CORE-1774, CORE-1759, CORE-1772, CORE-1861, CORE-1862, CORE-1863, CORE-1870, CORE-1869:Changes for CI/CD pipeline and integration tests. -* CORE-1661: Fixed issue where old boot properties file caused an error when attempting to install 4.0.0. -* CORE-1697, CORE-1814, CORE-1855: Upgrade fastify dependency to new major version 4. -* CORE-1629: Jobs are now running as processes managed by the PM2 daemon. -* CORE-1733: Update LICENSE to reflect our EULA on our site. -* CORE-1606: Enable Custom Functions by default. -* CORE-1714: Include pre-built binaries for most common platforms (darwin-arm64, darwin-x64, linux-arm64, linux-x64, win32-x64). -* CORE-1628: Fix issue where setting license through environment variable not working. -* CORE-1602, CORE-1760, CORE-1838, CORE-1839, CORE-1847, CORE-1773: HarperDB Docker container improvements. -* CORE-1706: Add support for encoding HTTP responses with MessagePack. -* CORE-1709: Improve the way lmdb.js dependencies are installed. -* CORE-1758: Remove/update unnecessary HTTP headers. -* CORE-1756: On `npm install` and `harperdb install` change the node version check from an error to a warning if the installed Node.js version does not match our preferred version. -* CORE-1791: Optimizations to authenticated user caching. -* CORE-1794: Update README to discuss Windows support & Node.js versions -* CORE-1837: Fix issue where Custom Function directory was not being created on install. -* CORE-1742: Add more validation to audit log - check schema/table exists and log is enabled. -* CORE-1768: Fix issue where when running in foreground HarperDB process is not stopping on `harperdb stop`. -* CORE-1864: Fix to semver checks on upgrade. -* CORE-1850: Fix issue where a `cluster_user` type role could not be altered. + +- CORE-1520: Refactor installer to remove all waterfall code and update to use Promises. +- CORE-1573: Stop the PM2 daemon and any logging processes when stopping hdb. +- CORE-1586: When HarperDB is running in foreground stop any additional logging processes from being spawned. +- CORE-1626: Update docker file to accommodate new `harperdb.conf` file. +- CORE-1592, CORE-1526, CORE-1660, CORE-1646, CORE-1640, CORE-1689, CORE-1711, CORE-1601, CORE-1726, CORE-1728, CORE-1736, CORE-1735, CORE-1745, CORE-1729, CORE-1748, CORE-1644, CORE-1750, CORE-1757, CORE-1727, CORE-1740, CORE-1730, CORE-1777, CORE-1778, CORE-1782, CORE-1775, CORE-1771, CORE-1774, CORE-1759, CORE-1772, CORE-1861, CORE-1862, CORE-1863, CORE-1870, CORE-1869:Changes for CI/CD pipeline and integration tests. +- CORE-1661: Fixed issue where old boot properties file caused an error when attempting to install 4.0.0. +- CORE-1697, CORE-1814, CORE-1855: Upgrade fastify dependency to new major version 4. +- CORE-1629: Jobs are now running as processes managed by the PM2 daemon. +- CORE-1733: Update LICENSE to reflect our EULA on our site. +- CORE-1606: Enable Custom Functions by default. +- CORE-1714: Include pre-built binaries for most common platforms (darwin-arm64, darwin-x64, linux-arm64, linux-x64, win32-x64). +- CORE-1628: Fix issue where setting license through environment variable not working. +- CORE-1602, CORE-1760, CORE-1838, CORE-1839, CORE-1847, CORE-1773: HarperDB Docker container improvements. +- CORE-1706: Add support for encoding HTTP responses with MessagePack. +- CORE-1709: Improve the way lmdb.js dependencies are installed. +- CORE-1758: Remove/update unnecessary HTTP headers. +- CORE-1756: On `npm install` and `harperdb install` change the node version check from an error to a warning if the installed Node.js version does not match our preferred version. +- CORE-1791: Optimizations to authenticated user caching. +- CORE-1794: Update README to discuss Windows support & Node.js versions +- CORE-1837: Fix issue where Custom Function directory was not being created on install. +- CORE-1742: Add more validation to audit log - check schema/table exists and log is enabled. +- CORE-1768: Fix issue where when running in foreground HarperDB process is not stopping on `harperdb stop`. +- CORE-1864: Fix to semver checks on upgrade. +- CORE-1850: Fix issue where a `cluster_user` type role could not be altered. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.1.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.1.md index 9e148e63..2a85f511 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.1.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.1.md @@ -4,9 +4,10 @@ sidebar_position: 59998 --- ### HarperDB 4.0.1, Tucker Release + 01/20/2023 **Bug Fixes** -* CORE-1992 Local studio was not loading because the path got mangled in the build. -* CORE-2001 Fixed deploy_custom_function_project after node update broke it. +- CORE-1992 Local studio was not loading because the path got mangled in the build. +- CORE-2001 Fixed deploy_custom_function_project after node update broke it. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.2.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.2.md index b65d1427..bedbd970 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.2.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.2.md @@ -4,9 +4,10 @@ sidebar_position: 59997 --- ### HarperDB 4.0.2, Tucker Release + 01/24/2023 **Bug Fixes** -* CORE-2003 Fix bug where if machine had one core thread config would default to zero. -* Update to lmdb 2.7.3 and msgpackr 1.7.0 +- CORE-2003 Fix bug where if machine had one core thread config would default to zero. +- Update to lmdb 2.7.3 and msgpackr 1.7.0 diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.3.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.3.md index 67aaae56..ad1cbf8a 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.3.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.3.md @@ -4,8 +4,9 @@ sidebar_position: 59996 --- ### HarperDB 4.0.3, Tucker Release + 01/26/2023 **Bug Fixes** -* CORE-2007 Add update nodes 4.0.0 launch script to build script to fix clustering upgrade. +- CORE-2007 Add update nodes 4.0.0 launch script to build script to fix clustering upgrade. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.4.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.4.md index 2a30c9d1..3f052465 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.4.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.4.md @@ -4,8 +4,9 @@ sidebar_position: 59995 --- ### HarperDB 4.0.4, Tucker Release + 01/27/2023 **Bug Fixes** -* CORE-2009 Fixed bug where add node was not being called when upgrading clustering. \ No newline at end of file +- CORE-2009 Fixed bug where add node was not being called when upgrading clustering. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.5.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.5.md index dc66721f..1696d6d4 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.5.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.5.md @@ -4,11 +4,11 @@ sidebar_position: 59994 --- ### HarperDB 4.0.5, Tucker Release + 02/15/2023 **Bug Fixes** -* CORE-2029 Improved the upgrade process for handling existing user TLS certificates and correctly configuring TLS settings. Added a prompt to upgrade to determine if new certificates should be created or existing certificates should be kept/used. -* Fix the way NATS connections are honored in a local environment. -* Do not define the certificate authority path to NATS if it is not defined in the HarperDB config. - +- CORE-2029 Improved the upgrade process for handling existing user TLS certificates and correctly configuring TLS settings. Added a prompt to upgrade to determine if new certificates should be created or existing certificates should be kept/used. +- Fix the way NATS connections are honored in a local environment. +- Do not define the certificate authority path to NATS if it is not defined in the HarperDB config. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.6.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.6.md index bf97d148..1cdc1bd7 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.6.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.6.md @@ -4,8 +4,9 @@ sidebar_position: 59993 --- ### HarperDB 4.0.6, Tucker Release + 03/09/2023 **Bug Fixes** -* Fixed a data serialization error that occurs when a large number of different record structures are persisted in a single table. +- Fixed a data serialization error that occurs when a large number of different record structures are persisted in a single table. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.7.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.7.md index 7d48666a..c4d1fbbf 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.7.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.0.7.md @@ -4,8 +4,9 @@ sidebar_position: 59992 --- ### HarperDB 4.0.7, Tucker Release + 03/10/2023 **Bug Fixes** -* Update lmdb.js dependency \ No newline at end of file +- Update lmdb.js dependency diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.1.0.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.1.0.md index 511f20fd..5159ae3e 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.1.0.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.1.0.md @@ -25,39 +25,39 @@ Updates to S3 import and export mean that these operations now require the bucke Due to the AWS SDK v2 reaching end of life support we have updated to v3. This has caused some breaking changes in our operations `import_from_s3` and `export_to_s3`: -* A new attribute `region` will need to be supplied -* The `bucket` attribute can no longer have trailing slashes. Slashes will now need to be in the `key`. +- A new attribute `region` will need to be supplied +- The `bucket` attribute can no longer have trailing slashes. Slashes will now need to be in the `key`. Starting HarperDB without any command (just `harperdb`) now runs HarperDB like a standard process, in the foreground. This means you can use standard unix tooling for interacting with the process and is conducive for running HarperDB with systemd or any other process management tool. If you wish to have HarperDB launch itself in separate background process (and immediately terminate the shell process), you can do so by running `harperdb start`. Internal Tickets completed: -* CORE-609 - Ensure that attribute names are always added to global schema as Strings -* CORE-1549 - Remove fastify-static code from Custom Functions server which auto serves content from "static" folder -* CORE-1655 - Iterator based queries -* CORE-1764 - Fix issue where describe\_all operation returns an empty object for non super-users if schema(s) do not yet have table(s) -* CORE-1854 - Switch to using worker threads instead of processes for handling concurrency -* CORE-1877 - Extend the csv\_url\_load operation to allow for additional headers to be passed to the remote server when the csv is being downloaded -* CORE-1893 - Add last updated timestamp to describe operations -* CORE-1896 - Fix issue where Select \* from system.hdb\_info returns wrong HDB version number after Instance Upgrade -* CORE-1904 - Fix issue when executing GEOJSON query in SQL -* CORE-1905 - Add HarperDB YAML configuration setting which defines the storage location of NATS streams -* CORE-1906 - Add HarperDB YAML configuration setting defining the storage location of tables. -* CORE-1655 - Streaming binary format serialization -* CORE-1943 - Add configuration option to set mount point for audit tables -* CORE-1921 - Update NATS transaction lifecycle to handle message deduplication in work queue streams. -* CORE-1963 - Update logging for better readability, reduced duplication, and request context information. -* CORE-1968 - In server\nats\natsIngestService.js remove the js\_msg.working(); line to improve performance. -* CORE-1976 - Fix error when calling describe\_table operation with no schema or table defined in payload. -* CORE-1983 - Fix issue where create\_attribute operation does not validate request for required attributes -* CORE-2015 - Remove PM2 logs that get logged in console when starting HDB -* CORE-2048 - systemd script for 4.1 -* CORE-2052 - Include thread information in system\_information for visibility of threads -* CORE-2061 - Add a better error msg when clustering is enabled without a cluster user set -* CORE-2068 - Create new log rotate logic since pm2 log-rotate no longer used -* CORE-2072 - Update to Node 18.15.0 -* CORE-2090 - Upgrade Testing from v4.0.x and v3.x to v4.1. -* CORE-2091 - Run the performance tests -* CORE-2092 - Allow for automatic patch version updates of certain packages -* CORE-2109 - Add verify option to clustering TLS configuration -* CORE-2111 - Update AWS SDK to v3 +- CORE-609 - Ensure that attribute names are always added to global schema as Strings +- CORE-1549 - Remove fastify-static code from Custom Functions server which auto serves content from "static" folder +- CORE-1655 - Iterator based queries +- CORE-1764 - Fix issue where describe_all operation returns an empty object for non super-users if schema(s) do not yet have table(s) +- CORE-1854 - Switch to using worker threads instead of processes for handling concurrency +- CORE-1877 - Extend the csv_url_load operation to allow for additional headers to be passed to the remote server when the csv is being downloaded +- CORE-1893 - Add last updated timestamp to describe operations +- CORE-1896 - Fix issue where Select \* from system.hdb_info returns wrong HDB version number after Instance Upgrade +- CORE-1904 - Fix issue when executing GEOJSON query in SQL +- CORE-1905 - Add HarperDB YAML configuration setting which defines the storage location of NATS streams +- CORE-1906 - Add HarperDB YAML configuration setting defining the storage location of tables. +- CORE-1655 - Streaming binary format serialization +- CORE-1943 - Add configuration option to set mount point for audit tables +- CORE-1921 - Update NATS transaction lifecycle to handle message deduplication in work queue streams. +- CORE-1963 - Update logging for better readability, reduced duplication, and request context information. +- CORE-1968 - In server\nats\natsIngestService.js remove the js_msg.working(); line to improve performance. +- CORE-1976 - Fix error when calling describe_table operation with no schema or table defined in payload. +- CORE-1983 - Fix issue where create_attribute operation does not validate request for required attributes +- CORE-2015 - Remove PM2 logs that get logged in console when starting HDB +- CORE-2048 - systemd script for 4.1 +- CORE-2052 - Include thread information in system_information for visibility of threads +- CORE-2061 - Add a better error msg when clustering is enabled without a cluster user set +- CORE-2068 - Create new log rotate logic since pm2 log-rotate no longer used +- CORE-2072 - Update to Node 18.15.0 +- CORE-2090 - Upgrade Testing from v4.0.x and v3.x to v4.1. +- CORE-2091 - Run the performance tests +- CORE-2092 - Allow for automatic patch version updates of certain packages +- CORE-2109 - Add verify option to clustering TLS configuration +- CORE-2111 - Update AWS SDK to v3 diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.1.1.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.1.1.md index 537ef71c..54163b63 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.1.1.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.1.1.md @@ -7,9 +7,9 @@ sidebar_position: 59898 06/16/2023 -* HarperDB uses improved logic for determining default heap limits and thread counts. When running in a restricted container and on NodeJS 18.15+, HarperDB will use the constrained memory limit to determine heap limits for each thread. In more memory constrained servers with many CPU cores, a reduced default thread count will be used to ensure that excessive memory is not used by many workers. You may still define your own thread count (with `http`/`threads`) in the [configuration](../../../deployments/configuration). -* An option has been added for [disabling the republishing NATS messages](../../../deployments/configuration), which can provide improved replication performance in a fully connected network. -* Improvements to our OpenShift container. -* Dependency security updates. -* **Bug Fixes** -* Fixed a bug in reporting database metrics in the `system_information` operation. +- HarperDB uses improved logic for determining default heap limits and thread counts. When running in a restricted container and on NodeJS 18.15+, HarperDB will use the constrained memory limit to determine heap limits for each thread. In more memory constrained servers with many CPU cores, a reduced default thread count will be used to ensure that excessive memory is not used by many workers. You may still define your own thread count (with `http`/`threads`) in the [configuration](../../../deployments/configuration). +- An option has been added for [disabling the republishing NATS messages](../../../deployments/configuration), which can provide improved replication performance in a fully connected network. +- Improvements to our OpenShift container. +- Dependency security updates. +- **Bug Fixes** +- Fixed a bug in reporting database metrics in the `system_information` operation. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.1.2.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.1.2.md index 2a62db64..fc5e16f4 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.1.2.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.1.2.md @@ -4,10 +4,10 @@ sidebar_position: 59897 --- ### HarperDB 4.1.2, Tucker Release -06/16/2023 -* HarperDB has updated binary dependencies to support older glibc versions back 2.17. -* A new CLI command was added to get the current status of whether HarperDB is running and the cluster status. This is available with `harperdb status`. -* Improvements to our OpenShift container. -* Dependency security updates. +06/16/2023 +- HarperDB has updated binary dependencies to support older glibc versions back 2.17. +- A new CLI command was added to get the current status of whether HarperDB is running and the cluster status. This is available with `harperdb status`. +- Improvements to our OpenShift container. +- Dependency security updates. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.0.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.0.md index a57a9781..e13d1cbe 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.0.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.0.md @@ -65,24 +65,24 @@ There have been significant changes to `harperdb-config.yaml`, however none of t `harperdb-config.yaml` has had some configuration values added, removed, renamed and defaults changed. Please refer to [harperdb-config.yaml](../../../deployments/configuration) for the most current configuration parameters. -* The `http` element has been expanded. - * `compressionThreshold` was added. - * All `customFunction` configuration now lives here, except for the `tls` section. -* `threads` has moved out of the `http` element and now is its own top level element. -* `authentication` section was moved out of the `operationsApi` section and is now its own top level element/section. -* `analytics.aggregatePeriod` was added. -* Default logging level was changed to `warn`. -* Default clustering log level was changed to `info`. -* `clustering.republishMessages` now defaults to `false`. -* `operationsApi.foreground` was removed. To start HarperDB in the foreground, from the CLI run `harperdb`. -* Made `operationsApi` configuration optional. Any config not defined here will default to the `http` section. -* Added a `securePort` parameter to `operationsApi` and `http` used for setting the https port. -* Added a new top level `tls` section. -* Removed `customFunctions.enabled`, `customFunctions.network.https`, `operationsApi.network.https` and `operationsApi.nodeEnv`. -* Added an element called `componentRoot` which replaces `customFunctions.root`. -* Updated custom pathing to use `databases` instead of `schemas`. -* Added `logging.auditAuthEvents.logFailed` and `logging.auditAuthEvents.logSuccessful` for enabling logging of auth events. -* A new `mqtt` section was added. +- The `http` element has been expanded. + - `compressionThreshold` was added. + - All `customFunction` configuration now lives here, except for the `tls` section. +- `threads` has moved out of the `http` element and now is its own top level element. +- `authentication` section was moved out of the `operationsApi` section and is now its own top level element/section. +- `analytics.aggregatePeriod` was added. +- Default logging level was changed to `warn`. +- Default clustering log level was changed to `info`. +- `clustering.republishMessages` now defaults to `false`. +- `operationsApi.foreground` was removed. To start HarperDB in the foreground, from the CLI run `harperdb`. +- Made `operationsApi` configuration optional. Any config not defined here will default to the `http` section. +- Added a `securePort` parameter to `operationsApi` and `http` used for setting the https port. +- Added a new top level `tls` section. +- Removed `customFunctions.enabled`, `customFunctions.network.https`, `operationsApi.network.https` and `operationsApi.nodeEnv`. +- Added an element called `componentRoot` which replaces `customFunctions.root`. +- Updated custom pathing to use `databases` instead of `schemas`. +- Added `logging.auditAuthEvents.logFailed` and `logging.auditAuthEvents.logSuccessful` for enabling logging of auth events. +- A new `mqtt` section was added. ### Socket Management diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.1.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.1.md index 38617ca9..c792a637 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.1.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.1.md @@ -4,10 +4,11 @@ sidebar_position: 59798 --- ### HarperDB 4.2.1, Tucker Release + 11/3/2023 -* Downgrade NATS 2.10.3 back to 2.10.1 due to regression in connection handling. -* Handle package names with underscores. -* Improved validation of queries and comparators -* Avoid double replication on transactions with multiple commits -* Added file metadata on get_component_file +- Downgrade NATS 2.10.3 back to 2.10.1 due to regression in connection handling. +- Handle package names with underscores. +- Improved validation of queries and comparators +- Avoid double replication on transactions with multiple commits +- Added file metadata on get_component_file diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.2.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.2.md index 15768374..9cfa957e 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.2.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.2.md @@ -4,12 +4,13 @@ sidebar_position: 59797 --- ### HarperDB 4.2.2, Tucker Release + 11/8/2023 -* Increase timeouts for NATS connections. -* Fix for database snapshots for backups (and for clone node). -* Fix application of permissions for default tables exposed through REST. -* Log replication failures with record information. -* Fix application of authorization/permissions for MQTT commands. -* Fix copying of local components in clone node. -* Fix calculation of overlapping start time in clone node. \ No newline at end of file +- Increase timeouts for NATS connections. +- Fix for database snapshots for backups (and for clone node). +- Fix application of permissions for default tables exposed through REST. +- Log replication failures with record information. +- Fix application of authorization/permissions for MQTT commands. +- Fix copying of local components in clone node. +- Fix calculation of overlapping start time in clone node. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.3.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.3.md index dab25c3d..edecd686 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.3.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.3.md @@ -4,10 +4,11 @@ sidebar_position: 59796 --- ### HarperDB 4.2.3, Tucker Release + 11/15/2023 -* When setting setting securePort, disable unsecure port setting on same port -* Fix `harperdb status` when pid file is missing -* Fix/include missing icons/fonts from local studio -* Fix crash that can occur when concurrently accessing records > 16KB -* Apply a lower heap limit to better ensure that memory leaks are quickly caught/mitigated \ No newline at end of file +- When setting setting securePort, disable unsecure port setting on same port +- Fix `harperdb status` when pid file is missing +- Fix/include missing icons/fonts from local studio +- Fix crash that can occur when concurrently accessing records > 16KB +- Apply a lower heap limit to better ensure that memory leaks are quickly caught/mitigated diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.4.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.4.md index 87ee241d..14d268b5 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.4.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.4.md @@ -4,7 +4,8 @@ sidebar_position: 59795 --- ### HarperDB 4.2.4, Tucker Release + 11/16/2023 -* Prevent coercion of strings to numbers in SQL queries (in WHERE clause) -* Address fastify deprecation warning about accessing config \ No newline at end of file +- Prevent coercion of strings to numbers in SQL queries (in WHERE clause) +- Address fastify deprecation warning about accessing config diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.5.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.5.md index 1172c4b3..1b6bf143 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.5.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.5.md @@ -4,9 +4,10 @@ sidebar_position: 59794 --- ### HarperDB 4.2.5, Tucker Release + 11/22/2023 -* Disable compression on server-sent events to ensure messages are immediately sent (not queued for later deliver) -* Update geoNear function to tolerate null values -* lmdb-js fix to ensure prefetched keys are pinned in memory until retrieved -* Add header to indicate start of a new authenticated session (for studio to identify authenticated sessions) +- Disable compression on server-sent events to ensure messages are immediately sent (not queued for later deliver) +- Update geoNear function to tolerate null values +- lmdb-js fix to ensure prefetched keys are pinned in memory until retrieved +- Add header to indicate start of a new authenticated session (for studio to identify authenticated sessions) diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.6.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.6.md index d0a1f177..50abde53 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.6.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.6.md @@ -4,7 +4,8 @@ sidebar_position: 59793 --- ### HarperDB 4.2.6, Tucker Release + 11/29/2023 -* Update various geo SQL functions to tolerate invalid values -* Properly report component installation/load errors in `get_components` (for studio to load components after an installation failure) \ No newline at end of file +- Update various geo SQL functions to tolerate invalid values +- Properly report component installation/load errors in `get_components` (for studio to load components after an installation failure) diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.7.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.7.md index 78bfcaa7..5d75e134 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.7.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.7.md @@ -4,8 +4,9 @@ sidebar_position: 59792 --- ### HarperDB 4.2.7 + 12/6/2023 -* Add support for cloning over the top of an existing HarperDB instance -* Add health checks for NATS consumer with ability to restart consumer loops for better resiliency -* Revert Fastify autoload module due to a regression that had caused EcmaScript modules for Fastify route modules to fail to load on Windows \ No newline at end of file +- Add support for cloning over the top of an existing HarperDB instance +- Add health checks for NATS consumer with ability to restart consumer loops for better resiliency +- Revert Fastify autoload module due to a regression that had caused EcmaScript modules for Fastify route modules to fail to load on Windows diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.8.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.8.md index fbe94b69..21127797 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.8.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.2.8.md @@ -4,11 +4,12 @@ sidebar_position: 59791 --- ### HarperDB 4.2.8 + 12/19/2023 -* Added support CLI command line arguments for clone node -* Added support for cloning a node without enabling clustering -* Clear NATS client cache on closed event -* Fix check for attribute permissions so that an empty attribute permissions array is treated as a table level permission definition -* Improve speed of cross-node health checks -* Fix for using `database` in describe operations +- Added support CLI command line arguments for clone node +- Added support for cloning a node without enabling clustering +- Clear NATS client cache on closed event +- Fix check for attribute permissions so that an empty attribute permissions array is treated as a table level permission definition +- Improve speed of cross-node health checks +- Fix for using `database` in describe operations diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.0.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.0.md index 9c27498a..fe82e818 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.0.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.0.md @@ -4,11 +4,13 @@ sidebar_position: 59699 --- ### HarperDB 4.3.0, Tucker Release + 3/19/2024 ### Relationships and Joins HarperDB now supports defining relationships between tables. These relationships can be defined as one-to-many, many-to-one, or many-to-many, and use a foreign key to record the relationship between records from different tables. An example of how to use this to define a many-to-one and one-to-many relationships between a product and brand table: + ```graphql type Product @table { id: ID @primaryKey @@ -16,7 +18,7 @@ type Product @table { # foreign key used to reference a brand brandId: ID @indexed # many-to-one relationship to brand - brand: Related @relation(from: "brandId") + brand: Related @relation(from: "brandId") } type Brand @table { id: ID @primaryKey @@ -25,12 +27,15 @@ type Brand @table { products: Product @relation(to: "brandId") } ``` + This relationships model can be used in queries and selects, which will automatically "join" the data from the tables. For example, you could search for products by brand name: + ```http /Product?brand.name=Microsoft ``` HarperDB also now supports querying with a sort order. Multiple sort orders can be provided breaking ties. Nested select have also been added, which also utilizes joins when related records are referenced. For example: + ```http /Product?brand.name=Microsoft&sort(price)&select(name,brand{name,size}) ``` @@ -38,21 +43,27 @@ HarperDB also now supports querying with a sort order. Multiple sort orders can See the [schema definition documentation](../../../../developers/applications/defining-schemas) for more information on defining relationships, and the [REST documentation for more information on queries](../../../../developers/rest). ### OpenAPI Specification -A new default endpoint `GET /openapi` was added for describing endpoints configured through a GraphQL schema. + +A new default endpoint `GET /openapi` was added for describing endpoints configured through a GraphQL schema. ### Query Optimizations + HarperDB has also made numerous improvements to query planning and execution for high performance query results with a broader range of queries. ### Indexing Nulls + New tables and indexes now support indexing null values, enabling queries by null (as well as queries for non-null values). For example, you can query by nulls with the REST interface: + ```http GET /Table/?attribute=null ``` + Note, that existing indexes will remain without null value indexing, and can only support indexing/querying by nulls if they are rebuilt (removed and re-added). ### CLI Expansion The HarperDB now supports an expansive set of commands that execute operations from the operations API. For example, you can list users from the command line: + ```bash harperdb list_users ``` @@ -87,7 +98,7 @@ The CRDT functionality also supports explicit incrementation to merge multiple p ### Configuration Improvements -The configuration has improved support for detecting port conflicts, handling paths for fastify routes, and now includes support for specifying a heap limit and TLS ciphers. See the [configuration documentation for more information](../../../deployments/configuration). +The configuration has improved support for detecting port conflicts, handling paths for fastify routes, and now includes support for specifying a heap limit and TLS ciphers. See the [configuration documentation for more information](../../../deployments/configuration). ### Balanced Audit Log Cleanup @@ -99,7 +110,7 @@ The `export_local` and `export_to_s3` operations now support `search_by_conditio ## Storage Performance Improvements -Significant improvements were made to handling of free-space to decrease free-space fragmentation and improve performance of reusing free-space for new data. This includes prioritizing reuse of recently released free-space for more better memory/caching utilization. +Significant improvements were made to handling of free-space to decrease free-space fragmentation and improve performance of reusing free-space for new data. This includes prioritizing reuse of recently released free-space for more better memory/caching utilization. ### Compact Database @@ -107,4 +118,4 @@ In addition to storage improvements, HarperDB now includes functionality for [co ### Compression -Compression is now enabled by default for all records over 4KB. \ No newline at end of file +Compression is now enabled by default for all records over 4KB. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.1.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.1.md index e583d175..870968bd 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.1.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.1.md @@ -4,8 +4,9 @@ sidebar_position: 59698 --- ### HarperDB 4.3.1 + 3/25/2024 -* Fix Fastify warning about responseTime usage -* Add access to the MQTT topic in the context -* Fix for ensuring local NATS streams are created +- Fix Fastify warning about responseTime usage +- Add access to the MQTT topic in the context +- Fix for ensuring local NATS streams are created diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.10.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.10.md index bd286e90..7badf0cc 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.10.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.10.md @@ -4,9 +4,10 @@ sidebar_position: 59689 --- ### HarperDB 4.3.10 + 5/5/2024 -* Provide a `data` property on the request/context with deserialized data from the request body for any request including methods that don't typically have a request body -* Ensure that CRDTs are not double applied after committing a transaction -* Delete MQTT will after publishing even if it fails to publish -* Improve transaction retry logic to use async non-optimistic transactions after multiple retries \ No newline at end of file +- Provide a `data` property on the request/context with deserialized data from the request body for any request including methods that don't typically have a request body +- Ensure that CRDTs are not double applied after committing a transaction +- Delete MQTT will after publishing even if it fails to publish +- Improve transaction retry logic to use async non-optimistic transactions after multiple retries diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.11.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.11.md index df2cc2fb..82b47381 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.11.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.11.md @@ -4,7 +4,8 @@ sidebar_position: 59688 --- ### HarperDB 4.3.11 + 5/15/2024 -* Add support for multiple certificates with SNI-based selection of certificates for HTTPS/TLS -* Fix warning in Node v22 \ No newline at end of file +- Add support for multiple certificates with SNI-based selection of certificates for HTTPS/TLS +- Fix warning in Node v22 diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.12.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.12.md index c4344da9..3f016e25 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.12.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.12.md @@ -4,7 +4,8 @@ sidebar_position: 59687 --- ### HarperDB 4.3.12 + 5/16/2024 -* Fix for handling ciphers in multiple certificates -* Allow each certificate config to have multiple hostnames \ No newline at end of file +- Fix for handling ciphers in multiple certificates +- Allow each certificate config to have multiple hostnames diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.13.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.13.md index 7152f231..e7833e0a 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.13.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.13.md @@ -4,8 +4,9 @@ sidebar_position: 59686 --- ### HarperDB 4.3.13 + 5/22/2024 -* Fix for handling HTTPS/TLS with IP address targets (no hostname) where SNI is not available -* Fix for memory leak when a node is down and consumers are trying to reconnect -* Faster cross-thread notification mechanism for transaction events \ No newline at end of file +- Fix for handling HTTPS/TLS with IP address targets (no hostname) where SNI is not available +- Fix for memory leak when a node is down and consumers are trying to reconnect +- Faster cross-thread notification mechanism for transaction events diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.14.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.14.md index 8374b138..0bf4e9c8 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.14.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.14.md @@ -4,6 +4,7 @@ sidebar_position: 59685 --- ### HarperDB 4.3.14 + 5/24/2024 -* Fix application of ciphers to multi-certificate TLS configuration \ No newline at end of file +- Fix application of ciphers to multi-certificate TLS configuration diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.15.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.15.md index 5bbb2304..48321fb6 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.15.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.15.md @@ -4,7 +4,8 @@ sidebar_position: 59684 --- ### HarperDB 4.3.15 + 5/29/2024 -* Add support for wildcards in hostnames for SNI -* Properly apply ciphers settings on multiple TLS configurations \ No newline at end of file +- Add support for wildcards in hostnames for SNI +- Properly apply ciphers settings on multiple TLS configurations diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.16.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.16.md index b3b198d8..195e27b7 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.16.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.16.md @@ -4,7 +4,8 @@ sidebar_position: 59683 --- ### HarperDB 4.3.16 + 6/3/2024 -* Properly shim legacy TLS configuration with new multi-certificate support -* Show the changed filenames when an application is reloaded \ No newline at end of file +- Properly shim legacy TLS configuration with new multi-certificate support +- Show the changed filenames when an application is reloaded diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.17.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.17.md index 6cebb30b..27a0f4cb 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.17.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.17.md @@ -4,11 +4,12 @@ sidebar_position: 59682 --- ### HarperDB 4.3.17 + 6/13/2024 -* Add MQTT analytics of incoming messages and separate by QoS level -* Ensure that any installed `harperdb` package in components is relinked to running harperdb. -* Upgrade storage to more efficiently avoid storage increases -* Fix to improve database metrics in system_information -* Fix for pathing on Windows with extension modules -* Add ability to define a range of listening threads \ No newline at end of file +- Add MQTT analytics of incoming messages and separate by QoS level +- Ensure that any installed `harperdb` package in components is relinked to running harperdb. +- Upgrade storage to more efficiently avoid storage increases +- Fix to improve database metrics in system_information +- Fix for pathing on Windows with extension modules +- Add ability to define a range of listening threads diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.18.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.18.md index 7de1ca2d..052b3821 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.18.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.18.md @@ -4,6 +4,7 @@ sidebar_position: 59681 --- ### HarperDB 4.3.18 + 6/18/2024 -* Immediately terminate an MQTT connection when there is a keep-alive timeout. \ No newline at end of file +- Immediately terminate an MQTT connection when there is a keep-alive timeout. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.19.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.19.md index ed2782da..2676c9f6 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.19.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.19.md @@ -4,8 +4,9 @@ sidebar_position: 59680 --- ### HarperDB 4.3.19 + 7/2/2024 -* Properly return records for the existing value for subscriptions used for retained messages, so they are correctly serialized. -* Ensure that deploy components empty the target directory for a clean installation and expansion of a `package` sub-directory. -* Ensure that we do not double load components that are referenced by symlink from node_modules and in components directory. \ No newline at end of file +- Properly return records for the existing value for subscriptions used for retained messages, so they are correctly serialized. +- Ensure that deploy components empty the target directory for a clean installation and expansion of a `package` sub-directory. +- Ensure that we do not double load components that are referenced by symlink from node_modules and in components directory. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.2.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.2.md index 7a967e98..ca273c5e 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.2.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.2.md @@ -4,12 +4,13 @@ sidebar_position: 59697 --- ### HarperDB 4.3.2 + 3/29/2024 -* Clone node updates to individually clone missing parts -* Fixes for publishing OpenShift container -* Increase purge stream timeout -* Fixed declaration of analytics schema so queries work before a restart -* Fix for iterating queries when deleted records exist -* LMDB stability upgrade -* Fix for cleanup of last will in MQTT \ No newline at end of file +- Clone node updates to individually clone missing parts +- Fixes for publishing OpenShift container +- Increase purge stream timeout +- Fixed declaration of analytics schema so queries work before a restart +- Fix for iterating queries when deleted records exist +- LMDB stability upgrade +- Fix for cleanup of last will in MQTT diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.20.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.20.md index 68a18912..d090990b 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.20.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.20.md @@ -4,14 +4,15 @@ sidebar_position: 59679 --- ### HarperDB 4.3.20 + 7/11/2024 -* The restart_service operation is now executed as a job, making it possible to track the progress of a restart (which is performed as a rolling restart of threads) -* Disable Nagle's algorithm for TCP connections to improve performance -* Append Server-Timing header if a fastify route has already added one -* Avoid symlinking the harperdb directory to itself -* Fix for deleting an empty database -* Upgrade ws and pm2 packages for security vulnerabilities -* Improved TypeScript definitions for Resource and Context. -* The context of a source can set `noCacheStore` to avoid caching the results of a retrieval from source -* Better error reporting of MQTT parsing errors and termination of connections for compliance +- The restart_service operation is now executed as a job, making it possible to track the progress of a restart (which is performed as a rolling restart of threads) +- Disable Nagle's algorithm for TCP connections to improve performance +- Append Server-Timing header if a fastify route has already added one +- Avoid symlinking the harperdb directory to itself +- Fix for deleting an empty database +- Upgrade ws and pm2 packages for security vulnerabilities +- Improved TypeScript definitions for Resource and Context. +- The context of a source can set `noCacheStore` to avoid caching the results of a retrieval from source +- Better error reporting of MQTT parsing errors and termination of connections for compliance diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.21.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.21.md index b8c22de5..7afefd12 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.21.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.21.md @@ -4,10 +4,11 @@ sidebar_position: 59678 --- ### HarperDB 4.3.21 + 8/21/2024 -* Fixed an issue with iterating/serializing query results with a `limit`. -* Fixed an issue that was preventing the caching of structured records in memory. -* Fixed and added several TypeScript exported types including `tables`, `databases`, `Query`, and `Context`. -* Fixed logging warnings about license limits after a license is updated. -* Don't register a certificate as the default certificate for non-SNI connections unless it lists an IP address in the SAN field. \ No newline at end of file +- Fixed an issue with iterating/serializing query results with a `limit`. +- Fixed an issue that was preventing the caching of structured records in memory. +- Fixed and added several TypeScript exported types including `tables`, `databases`, `Query`, and `Context`. +- Fixed logging warnings about license limits after a license is updated. +- Don't register a certificate as the default certificate for non-SNI connections unless it lists an IP address in the SAN field. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.22.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.22.md index 92f1da33..a4bc2003 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.22.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.22.md @@ -4,11 +4,12 @@ sidebar_position: 59677 --- ### HarperDB 4.3.22 + 9/6/2024 -* Adding improved back-pressure handling for large subscriptions and backlogs with durable MQTT sessions -* Allow .extension in URL paths to indicate both preferred encoding and decoding -* Added support for multi-part ids in query parameters -* Limit describe calls by time before using statistical sampling -* Proper cleanup of a transaction when it is aborted due to running out of available read transactions -* Updates to release/builds \ No newline at end of file +- Adding improved back-pressure handling for large subscriptions and backlogs with durable MQTT sessions +- Allow .extension in URL paths to indicate both preferred encoding and decoding +- Added support for multi-part ids in query parameters +- Limit describe calls by time before using statistical sampling +- Proper cleanup of a transaction when it is aborted due to running out of available read transactions +- Updates to release/builds diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.23.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.23.md index 8dd47c25..7496c1d1 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.23.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.23.md @@ -4,8 +4,9 @@ sidebar_position: 59676 --- ### HarperDB 4.3.23 + 9/12/2024 -* Avoid long-running read transactions on subscription catch-ups -* Reverted change to setting default certificate for IP address only -* Better handling of last-will messages on startup \ No newline at end of file +- Avoid long-running read transactions on subscription catch-ups +- Reverted change to setting default certificate for IP address only +- Better handling of last-will messages on startup diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.24.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.24.md index ef4933ea..435c15ec 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.24.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.24.md @@ -4,6 +4,7 @@ sidebar_position: 59675 --- ### HarperDB 4.3.24 + 9/12/2024 -* Fix for querying for large strings (over 255 characters) \ No newline at end of file +- Fix for querying for large strings (over 255 characters) diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.25.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.25.md index 387a2588..601d9ec0 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.25.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.25.md @@ -4,9 +4,10 @@ sidebar_position: 59674 --- ### HarperDB 4.3.25 + 9/24/2024 -* Add analytics for replication latency -* Fix iteration issue over asynchronous joined queries -* Local studio fix for loading applications in insecure context (HTTP) -* Local studio fix for loading configuration tab \ No newline at end of file +- Add analytics for replication latency +- Fix iteration issue over asynchronous joined queries +- Local studio fix for loading applications in insecure context (HTTP) +- Local studio fix for loading configuration tab diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.26.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.26.md index d910120c..c0dacf54 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.26.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.26.md @@ -4,7 +4,8 @@ sidebar_position: 59673 --- ### HarperDB 4.3.26 + 9/27/2024 -* Fixed a security issue that allowed users to bypass access controls with the operations API -* Previously expiration handling was limited to tables with a source, but now it can be applied to any table \ No newline at end of file +- Fixed a security issue that allowed users to bypass access controls with the operations API +- Previously expiration handling was limited to tables with a source, but now it can be applied to any table diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.27.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.27.md index ca8352d3..0bbd448a 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.27.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.27.md @@ -4,10 +4,11 @@ sidebar_position: 59672 --- ### HarperDB 4.3.27 + 10/2/2024 -* Fixed handling HTTP upgrade with Connection header that does not use Upgrade as the sole value (for Firefox) -* Added metrics for requests by status code -* Properly remove attributes from the stored metadata when removed from GraphQL schema -* Fixed a regression in clustering retrieval of schema description -* Fix attribute validation/handling to ensure that sequential ids can be assigned with insert/upsert operations \ No newline at end of file +- Fixed handling HTTP upgrade with Connection header that does not use Upgrade as the sole value (for Firefox) +- Added metrics for requests by status code +- Properly remove attributes from the stored metadata when removed from GraphQL schema +- Fixed a regression in clustering retrieval of schema description +- Fix attribute validation/handling to ensure that sequential ids can be assigned with insert/upsert operations diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.28.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.28.md index fdba3828..361d416d 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.28.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.28.md @@ -4,8 +4,9 @@ sidebar_position: 59671 --- ### HarperDB 4.3.28 + 10/3/2024 -* Tolerate user with no role when building NATS config -* Change metrics for requests by status code to be prefixed with "response_" -* Log error `cause`, and other properties, when available. +- Tolerate user with no role when building NATS config +- Change metrics for requests by status code to be prefixed with "response\_" +- Log error `cause`, and other properties, when available. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.29.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.29.md index c1f533fd..5537df8b 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.29.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.29.md @@ -4,13 +4,14 @@ sidebar_position: 59670 --- ### HarperDB 4.3.29 + 10/7/2024 -* Avoid unnecessary cookie session creation without explicit login -* Added support for caching directives in operations API -* Fixed issue with creating metadata for table with no primary key -* Local studio upgrade: - * Added support for "cache only" mode to view table data without origin resolution - * Added partial support for cookie-based authentication - * Added support for browsing tables with no primary key - * Improved performance for sorting tables +- Avoid unnecessary cookie session creation without explicit login +- Added support for caching directives in operations API +- Fixed issue with creating metadata for table with no primary key +- Local studio upgrade: + - Added support for "cache only" mode to view table data without origin resolution + - Added partial support for cookie-based authentication + - Added support for browsing tables with no primary key + - Improved performance for sorting tables diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.3.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.3.md index 52d7ebde..38175dda 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.3.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.3.md @@ -4,6 +4,7 @@ sidebar_position: 59696 --- ### HarperDB 4.3.3 + 4/01/2024 -* Improve MQTT logging by properly logging auth failures, logging disconnections +- Improve MQTT logging by properly logging auth failures, logging disconnections diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.30.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.30.md index 70c10852..e005db97 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.30.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.30.md @@ -4,6 +4,7 @@ sidebar_position: 59669 --- ### HarperDB 4.3.30 + 10/9/2024 -* Properly assign transaction timestamp to writes from cache resolutions (ensuring that latencies can be calculated on replicating nodes) +- Properly assign transaction timestamp to writes from cache resolutions (ensuring that latencies can be calculated on replicating nodes) diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.31.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.31.md index 097726ac..80cab2b9 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.31.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.31.md @@ -4,8 +4,9 @@ sidebar_position: 59668 --- ### HarperDB 4.3.31 + 10/10/2024 -* Reset the restart limit for manual restarts to ensure that NATS process will continue to restart after more than 10 manual restarts -* Only apply caching directives (from headers) to tables/resources that are configured to be caching, sourced from another resource -* Catch/tolerate errors on serializing objects for logging +- Reset the restart limit for manual restarts to ensure that NATS process will continue to restart after more than 10 manual restarts +- Only apply caching directives (from headers) to tables/resources that are configured to be caching, sourced from another resource +- Catch/tolerate errors on serializing objects for logging diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.32.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.32.md index ee5da648..0b5893b4 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.32.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.32.md @@ -4,8 +4,9 @@ sidebar_position: 59667 --- ### HarperDB 4.3.32 + 10/16/2024 -* Fix a memory leak when cluster_network closes a hub connection -* Improved MQTT error handling, with less verbose logging of more common errors, and treat a missing subscription as an invalid/missing topic -* Record analytics and server-timing header even when cache resolution fails +- Fix a memory leak when cluster_network closes a hub connection +- Improved MQTT error handling, with less verbose logging of more common errors, and treat a missing subscription as an invalid/missing topic +- Record analytics and server-timing header even when cache resolution fails diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.33.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.33.md index 271373ef..7707a562 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.33.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.33.md @@ -4,6 +4,7 @@ sidebar_position: 59666 --- ### HarperDB 4.3.33 + 10/24/2024 -* Change the default maximum length for a fastify route parameter from 100 to 1000 characters. +- Change the default maximum length for a fastify route parameter from 100 to 1000 characters. diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.34.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.34.md index 1071c273..2bd65833 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.34.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.34.md @@ -4,6 +4,7 @@ sidebar_position: 59665 --- ### HarperDB 4.3.34 + 10/24/2024 -* lmdb-js upgrade +- lmdb-js upgrade diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.35.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.35.md index 1811732b..f8dd7b73 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.35.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.35.md @@ -4,7 +4,8 @@ sidebar_position: 59664 --- ### HarperDB 4.3.35 + 11/12/2024 -* Upgrades for supporting Node.js V23 -* Fix for handling a change in the schema for nested data structures +- Upgrades for supporting Node.js V23 +- Fix for handling a change in the schema for nested data structures diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.36.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.36.md index 9200cd62..6ecd342b 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.36.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.36.md @@ -4,6 +4,7 @@ sidebar_position: 59663 --- ### HarperDB 4.3.35 + 11/14/2024 -* lmdb-js upgrade for better free-space management +- lmdb-js upgrade for better free-space management diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.4.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.4.md index f50f1bb6..0c96732f 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.4.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.4.md @@ -4,7 +4,8 @@ sidebar_position: 59695 --- ### HarperDB 4.3.4 + 4/9/2024 -* Fixed a buffer overrun issue with decompressing compressed data -* Better keep-alive of transactions with long running queries \ No newline at end of file +- Fixed a buffer overrun issue with decompressing compressed data +- Better keep-alive of transactions with long running queries diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.5.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.5.md index 40d030e5..60888785 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.5.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.5.md @@ -4,6 +4,7 @@ sidebar_position: 59694 --- ### HarperDB 4.3.5 + 4/10/2024 -* Fixed a buffer overrun issue with decompressing compressed data \ No newline at end of file +- Fixed a buffer overrun issue with decompressing compressed data diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.6.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.6.md index 92b28286..54a4739a 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.6.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.6.md @@ -4,10 +4,11 @@ sidebar_position: 59693 --- ### HarperDB 4.3.6 + 4/12/2024 -* Fixed parsing of dates from epoch millisecond times in queries -* Fixed CRDT incrementation of different data types -* Adjustments to text/plain content type q-value handling -* Fixed parsing of passwords with a colon -* Added MQTT events for connections, authorization, and disconnections \ No newline at end of file +- Fixed parsing of dates from epoch millisecond times in queries +- Fixed CRDT incrementation of different data types +- Adjustments to text/plain content type q-value handling +- Fixed parsing of passwords with a colon +- Added MQTT events for connections, authorization, and disconnections diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.7.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.7.md index 8f45995a..df9fb331 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.7.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.7.md @@ -4,10 +4,11 @@ sidebar_position: 59692 --- ### HarperDB 4.3.7 + 4/16/2024 -* Fixed transaction handling to stay on open on long compaction operations -* Fixed handling of sorting on non-indexed attributes -* Storage stability improvements -* Fixed authentication/authorization of WebSockets connection and use of cookies -* Fixes for clone node operations \ No newline at end of file +- Fixed transaction handling to stay on open on long compaction operations +- Fixed handling of sorting on non-indexed attributes +- Storage stability improvements +- Fixed authentication/authorization of WebSockets connection and use of cookies +- Fixes for clone node operations diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.8.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.8.md index cd0fe88e..0e4c5b6c 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.8.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.8.md @@ -4,10 +4,11 @@ sidebar_position: 59691 --- ### HarperDB 4.3.8 + 4/26/2024 -* Added support for the MQTT keep-alive feature (disconnecting if no control messages are received within keep-alive window) -* Improved handling of write queue timeouts, with configurability -* Fixed a memory leak that can occur with NATS reconnections after heartbeat misses -* Fixed a bug in clone node with a null port -* Add error events to MQTT events system \ No newline at end of file +- Added support for the MQTT keep-alive feature (disconnecting if no control messages are received within keep-alive window) +- Improved handling of write queue timeouts, with configurability +- Fixed a memory leak that can occur with NATS reconnections after heartbeat misses +- Fixed a bug in clone node with a null port +- Add error events to MQTT events system diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.9.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.9.md index dca6a92f..17c95934 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.9.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/4.3.9.md @@ -4,6 +4,7 @@ sidebar_position: 59690 --- ### HarperDB 4.3.9 + 4/30/2024 -* lmdb-js upgrade \ No newline at end of file +- lmdb-js upgrade diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/_category_.json b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/_category_.json index 9a7bca50..d20b2f9a 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/_category_.json +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Tucker (Version 4)", - "position": -4 -} \ No newline at end of file + "label": "HarperDB Tucker (Version 4)", + "position": -4 +} diff --git a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/index.md b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/index.md index ba5cb8a7..cf9ebd72 100644 --- a/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/index.md +++ b/site/versioned_docs/version-4.3/technical-details/release-notes/v4-tucker/index.md @@ -7,23 +7,27 @@ title: HarperDB Tucker (Version 4) HarperDB version 4 ([Tucker release](./tucker)) represents major step forward in database technology. This release line has ground-breaking architectural advancements including: ## [4.0](./4.0.0) -* New clustering technology that delivers robust, resilient and high-performance replication -* Major storage improvements with highly-efficient adaptive-structure modified MessagePack format, with on-demand deserialization capabilities + +- New clustering technology that delivers robust, resilient and high-performance replication +- Major storage improvements with highly-efficient adaptive-structure modified MessagePack format, with on-demand deserialization capabilities ## [4.1](./4.1.0) -* New streaming iterators mechanism that allows query results to be delivered to clients _while_ querying results are being processed, for incredibly fast time-to-first-byte and concurrent processing/delivery -* New thread-based concurrency model for more efficient resource usage + +- New streaming iterators mechanism that allows query results to be delivered to clients _while_ querying results are being processed, for incredibly fast time-to-first-byte and concurrent processing/delivery +- New thread-based concurrency model for more efficient resource usage ## [4.2](./4.2.0) -* New component architecture and Resource API for advanced, robust custom database application development -* Real-time capabilites through MQTT, WebSockets, and Server-Sent Events -* REST interface for intuitive, fast, and standards-compliant HTTP interaction -* Native caching capabilities for high-performance cache scenarios -* Clone node functionality + +- New component architecture and Resource API for advanced, robust custom database application development +- Real-time capabilites through MQTT, WebSockets, and Server-Sent Events +- REST interface for intuitive, fast, and standards-compliant HTTP interaction +- Native caching capabilities for high-performance cache scenarios +- Clone node functionality ## [4.3](./4.3.0) -* Relationships, joins, and broad new querying capabilites for complex and nested conditions, sorting, joining, and selecting with significant query optimizations -* More advanced transaction support for CRDTs and storage of large integers (with BigInt) -* Better management with new upgraded local studio and new CLI features + +- Relationships, joins, and broad new querying capabilites for complex and nested conditions, sorting, joining, and selecting with significant query optimizations +- More advanced transaction support for CRDTs and storage of large integers (with BigInt) +- Better management with new upgraded local studio and new CLI features Did you know our release names are dedicated to employee pups? For our fourth release, [meet Tucker!](./tucker) diff --git a/site/versioned_docs/version-4.4/administration/_category_.json b/site/versioned_docs/version-4.4/administration/_category_.json index 828e0998..59c33ea4 100644 --- a/site/versioned_docs/version-4.4/administration/_category_.json +++ b/site/versioned_docs/version-4.4/administration/_category_.json @@ -1,12 +1,10 @@ { - "label": "Administration", - "position": 2, - "link": { - "type": "generated-index", - "title": "Administration Documentation", - "description": "Guides for managing and administering HarperDB instances", - "keywords": [ - "administration" - ] - } -} \ No newline at end of file + "label": "Administration", + "position": 2, + "link": { + "type": "generated-index", + "title": "Administration Documentation", + "description": "Guides for managing and administering HarperDB instances", + "keywords": ["administration"] + } +} diff --git a/site/versioned_docs/version-4.4/administration/administration.md b/site/versioned_docs/version-4.4/administration/administration.md index cdd6e71f..e55576ef 100644 --- a/site/versioned_docs/version-4.4/administration/administration.md +++ b/site/versioned_docs/version-4.4/administration/administration.md @@ -10,9 +10,9 @@ Harper is designed for minimal administrative effort, and with managed services As a distributed database, data protection and recovery can benefit from different data protection strategies than a traditional single-server database. But multiple aspects of data protection and recovery should be considered: -* Availability: As a distributed database Harper is intrinsically built for high-availability and a cluster will continue to run even with complete server(s) failure. This is the first and primary defense for protecting against any downtime or data loss. Harper provides fast horizontal scaling functionality with node cloning, which facilitates ease of establishing high availability clusters. -* [Audit log](./logging/audit-logging): Harper defaults to tracking data changes so malicious data changes can be found, attributed, and reverted. This provides security-level defense against data loss, allowing for fine-grained isolation and reversion of individual data without the large-scale reversion/loss of data associated with point-in-time recovery approaches. -* Snapshots: When used as a source-of-truth database for crucial data, we recommend using snapshot tools to regularly snapshot databases as a final backup/defense against data loss (this should only be used as a last resort in recovery). Harper has a [`get_backup`](../developers/operations-api/databases-and-tables#get-backup) operation, which provides direct support for making and retrieving database snapshots. An HTTP request can be used to get a snapshot. Alternatively, volume snapshot tools can be used to snapshot data at the OS/VM level. Harper can also provide scripts for replaying transaction logs from snapshots to facilitate point-in-time recovery when necessary (often customization may be preferred in certain recovery situations to minimize data loss). +- Availability: As a distributed database Harper is intrinsically built for high-availability and a cluster will continue to run even with complete server(s) failure. This is the first and primary defense for protecting against any downtime or data loss. Harper provides fast horizontal scaling functionality with node cloning, which facilitates ease of establishing high availability clusters. +- [Audit log](./logging/audit-logging): Harper defaults to tracking data changes so malicious data changes can be found, attributed, and reverted. This provides security-level defense against data loss, allowing for fine-grained isolation and reversion of individual data without the large-scale reversion/loss of data associated with point-in-time recovery approaches. +- Snapshots: When used as a source-of-truth database for crucial data, we recommend using snapshot tools to regularly snapshot databases as a final backup/defense against data loss (this should only be used as a last resort in recovery). Harper has a [`get_backup`](../developers/operations-api/databases-and-tables#get-backup) operation, which provides direct support for making and retrieving database snapshots. An HTTP request can be used to get a snapshot. Alternatively, volume snapshot tools can be used to snapshot data at the OS/VM level. Harper can also provide scripts for replaying transaction logs from snapshots to facilitate point-in-time recovery when necessary (often customization may be preferred in certain recovery situations to minimize data loss). ### Horizontal Scaling with Node Cloning @@ -21,7 +21,8 @@ Harper provides rapid horizontal scaling capabilities through [node cloning func ### Monitoring Harper provides robust capabilities for analytics and observability to facilitate effective and informative monitoring: -* Analytics provides statistics on usage, request counts, load, memory usage with historical tracking. The analytics data can be [accessed through querying](../technical-details/reference/analytics). -* A large variety of real-time statistics about load, system information, database metrics, thread usage can be retrieved through the [`system_information` API](../developers/operations-api/utilities). -* Information about the current cluster configuration and status can be found in the [cluster APIs](../developers/operations-api/clustering). -* Analytics and system information can easily be exported to Prometheus with our [Prometheus exporter component](https://github.com/HarperDB-Add-Ons/prometheus_exporter), making it easy visualize and monitor Harper with Graphana. + +- Analytics provides statistics on usage, request counts, load, memory usage with historical tracking. The analytics data can be [accessed through querying](../technical-details/reference/analytics). +- A large variety of real-time statistics about load, system information, database metrics, thread usage can be retrieved through the [`system_information` API](../developers/operations-api/utilities). +- Information about the current cluster configuration and status can be found in the [cluster APIs](../developers/operations-api/clustering). +- Analytics and system information can easily be exported to Prometheus with our [Prometheus exporter component](https://github.com/HarperDB-Add-Ons/prometheus_exporter), making it easy visualize and monitor Harper with Graphana. diff --git a/site/versioned_docs/version-4.4/administration/cloning.md b/site/versioned_docs/version-4.4/administration/cloning.md index 3c599ff1..4669775b 100644 --- a/site/versioned_docs/version-4.4/administration/cloning.md +++ b/site/versioned_docs/version-4.4/administration/cloning.md @@ -4,10 +4,10 @@ title: Clone Node # Clone Node -Clone node is a configurable node script that when pointed to another instance of Harper will create a clone of that -instance's config, databases and setup full replication. If it is run in a location where there is no existing Harper install, +Clone node is a configurable node script that when pointed to another instance of Harper will create a clone of that +instance's config, databases and setup full replication. If it is run in a location where there is no existing Harper install, it will, along with cloning, install Harper. If it is run in a location where there is another Harper instance, it will -only clone config, databases and replication that do not already exist. +only clone config, databases and replication that do not already exist. Clone node is triggered when Harper is installed or started with certain environment or command line (CLI) variables set (see below). @@ -18,34 +18,36 @@ To start clone run `harperdb` in the CLI with either of the following variables #### Environment variables -* `HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). -* `HDB_LEADER_USERNAME` - The leader node admin username. -* `HDB_LEADER_PASSWORD` - The leader node admin password. -* `REPLICATION_HOSTNAME` - _(optional)_ The clones replication hostname. This value will be added to `replication.hostname` on the clone node. If this value is not set, replication will not be set up between the leader and clone. +- `HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). +- `HDB_LEADER_USERNAME` - The leader node admin username. +- `HDB_LEADER_PASSWORD` - The leader node admin password. +- `REPLICATION_HOSTNAME` - _(optional)_ The clones replication hostname. This value will be added to `replication.hostname` on the clone node. If this value is not set, replication will not be set up between the leader and clone. For example: + ``` HDB_LEADER_URL=https://node-1.my-domain.com:9925 REPLICATION_HOSTNAME=node-1.my-domain.com HDB_LEADER_USERNAME=... HDB_LEADER_PASSWORD=... harperdb ``` #### Command line variables -* `--HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). -* `--HDB_LEADER_USERNAME` - The leader node admin username. -* `--HDB_LEADER_PASSWORD` - The leader node admin password. -* `--REPLICATION_HOSTNAME` - _(optional)_ The clones clustering host. This value will be added to `replication.hostname` on the clone node. If this value is not set, replication will not be set up between the leader and clone. +- `--HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). +- `--HDB_LEADER_USERNAME` - The leader node admin username. +- `--HDB_LEADER_PASSWORD` - The leader node admin password. +- `--REPLICATION_HOSTNAME` - _(optional)_ The clones clustering host. This value will be added to `replication.hostname` on the clone node. If this value is not set, replication will not be set up between the leader and clone. For example: + ``` harperdb --HDB_LEADER_URL https://node-1.my-domain.com:9925 --REPLICATION_HOSTNAME node-1.my-domain.com --HDB_LEADER_USERNAME ... --HDB_LEADER_PASSWORD ... ``` -Each time clone is run it will set a value `cloned: true` in `harperdb-config.yaml`. This value will prevent clone from -running again. If you want to run clone again set this value to `false`. If Harper is started with the clone variables +Each time clone is run it will set a value `cloned: true` in `harperdb-config.yaml`. This value will prevent clone from +running again. If you want to run clone again set this value to `false`. If Harper is started with the clone variables still present and `cloned` is true, Harper will just start as normal. -Clone node does not require any additional configuration apart from the variables referenced above. -However, if you wish to set any configuration during clone this can be done by passing the config as environment/CLI +Clone node does not require any additional configuration apart from the variables referenced above. +However, if you wish to set any configuration during clone this can be done by passing the config as environment/CLI variables or cloning overtop of an existing `harperdb-config.yaml` file. More can be found in the Harper config documentation [here](../deployments/configuration). @@ -55,10 +57,10 @@ More can be found in the Harper config documentation [here](../deployments/confi To set any specific (optional) clone config, including the exclusion of any database and/or replication, there is a file called `clone-node-config.yaml` that can be used. -The file must be located in the `ROOTPATH` directory of your clone (the `hdb` directory where you clone will be installed. +The file must be located in the `ROOTPATH` directory of your clone (the `hdb` directory where you clone will be installed. If the directory does not exist, create one and add the file to it). -The config available in `clone-node-config.yaml` is: +The config available in `clone-node-config.yaml` is: ```yaml databaseConfig: @@ -72,27 +74,27 @@ componentConfig: - name: null ``` -_Note: only include the configuration that you are using. If no clone config file is provided nothing will be excluded, +_Note: only include the configuration that you are using. If no clone config file is provided nothing will be excluded, unless it already exists on the clone._ `databaseConfig` - Set any databases or tables that you wish to exclude from cloning. -`componentConfig` - Set any components that you do not want cloned. Clone node will not clone the component code, +`componentConfig` - Set any components that you do not want cloned. Clone node will not clone the component code, it will only clone the component reference that exists in the leader harperdb-config file. ### Cloning configuration -Clone node will not clone any configuration that is classed as unique to the leader node. This includes `replication.hostname`, `replication.url`,`clustering.nodeName`, -`rootPath` and any other path related values, for example `storage.path`, `logging.root`, `componentsRoot`, +Clone node will not clone any configuration that is classed as unique to the leader node. This includes `replication.hostname`, `replication.url`,`clustering.nodeName`, +`rootPath` and any other path related values, for example `storage.path`, `logging.root`, `componentsRoot`, any authentication certificate/key paths. ### Cloning system database -Harper uses a database called `system` to store operational information. Clone node will only clone the user and role +Harper uses a database called `system` to store operational information. Clone node will only clone the user and role tables from this database. It will also set up replication on this table, which means that any existing and future user and roles that are added will be replicated throughout the cluster. -Cloning the user and role tables means that once clone node is complete, the clone will share the same login credentials with +Cloning the user and role tables means that once clone node is complete, the clone will share the same login credentials with the leader. ### Replication @@ -107,20 +109,21 @@ If cloning with replication, the leader's JWT private and public keys will be cl ### Cloning overtop of an existing Harper instance -Clone node will not overwrite any existing config, database or replication. It will write/clone any config database or replication -that does not exist on the node it is running on. +Clone node will not overwrite any existing config, database or replication. It will write/clone any config database or replication +that does not exist on the node it is running on. -An example of how this can be useful is if you want to set Harper config before the clone is created. To do this you -would create a harperdb-config.yaml file in your local `hdb` root directory with the config you wish to set. Then +An example of how this can be useful is if you want to set Harper config before the clone is created. To do this you +would create a harperdb-config.yaml file in your local `hdb` root directory with the config you wish to set. Then when clone is run it will append the missing config to the file and install Harper with the desired config. -Another useful example could be retroactively adding another database to an existing instance. Running clone on -an existing instance could create a full clone of another database and set up replication between the database on the +Another useful example could be retroactively adding another database to an existing instance. Running clone on +an existing instance could create a full clone of another database and set up replication between the database on the leader and the clone. ### Cloning steps Clone node will execute the following steps when ran: + 1. Look for an existing Harper install. It does this by using the default (or user provided) `ROOTPATH`. 1. If an existing instance is found it will check for a `harperdb-config.yaml` file and search for the `cloned` value. If the value exists and is `true` clone will skip the clone logic and start Harper. 1. Clone harperdb-config.yaml values that don't already exist (excluding values unique to the leader node). diff --git a/site/versioned_docs/version-4.4/administration/harper-studio/create-account.md b/site/versioned_docs/version-4.4/administration/harper-studio/create-account.md index a826ed12..ad13b535 100644 --- a/site/versioned_docs/version-4.4/administration/harper-studio/create-account.md +++ b/site/versioned_docs/version-4.4/administration/harper-studio/create-account.md @@ -3,24 +3,25 @@ title: Create a Studio Account --- # Create a Studio Account + Start at the [Harper Studio sign up page](https://studio.harperdb.io/sign-up). -1) Provide the following information: - * First Name - * Last Name - * Email Address - * Subdomain - - *Part of the URL that will be used to identify your Harper Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com).* - * Coupon Code (optional) -2) Review the Privacy Policy and Terms of Service. -3) Click the sign up for free button. -4) You will be taken to a new screen to add an account password. Enter your password. - *Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character.* -5) Click the add account password button. +1. Provide the following information: + - First Name + - Last Name + - Email Address + - Subdomain -You will receive a Studio welcome email confirming your registration. + _Part of the URL that will be used to identify your Harper Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com)._ + - Coupon Code (optional) +2. Review the Privacy Policy and Terms of Service. +3. Click the sign up for free button. +4. You will be taken to a new screen to add an account password. Enter your password. + _Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character._ +5. Click the add account password button. + +You will receive a Studio welcome email confirming your registration. -Note: Your email address will be used as your username and cannot be changed. \ No newline at end of file +Note: Your email address will be used as your username and cannot be changed. diff --git a/site/versioned_docs/version-4.4/administration/harper-studio/enable-mixed-content.md b/site/versioned_docs/version-4.4/administration/harper-studio/enable-mixed-content.md index a1e5e4d8..67747d71 100644 --- a/site/versioned_docs/version-4.4/administration/harper-studio/enable-mixed-content.md +++ b/site/versioned_docs/version-4.4/administration/harper-studio/enable-mixed-content.md @@ -6,6 +6,4 @@ title: Enable Mixed Content Enabling mixed content is required in cases where you would like to connect the Harper Studio to Harper Instances via HTTP. This should not be used for production systems, but may be convenient for development and testing purposes. Doing so will allow your browser to reach HTTP traffic, which is considered insecure, through an HTTPS site like the Studio. - - A comprehensive guide is provided by Adobe [here](https://experienceleague.adobe.com/docs/target/using/experiences/vec/troubleshoot-composer/mixed-content.html). diff --git a/site/versioned_docs/version-4.4/administration/harper-studio/index.md b/site/versioned_docs/version-4.4/administration/harper-studio/index.md index bdb43da5..75f4ccfb 100644 --- a/site/versioned_docs/version-4.4/administration/harper-studio/index.md +++ b/site/versioned_docs/version-4.4/administration/harper-studio/index.md @@ -3,6 +3,7 @@ title: Harper Studio --- # Harper Studio + Harper Studio is the web-based GUI for Harper. Studio enables you to administer, navigate, and monitor all of your Harper instances in a simple, user-friendly interface without any knowledge of the underlying Harper API. It’s free to sign up, get started today! [Sign up for free!](https://studio.harperdb.io/sign-up) @@ -10,8 +11,11 @@ Harper Studio is the web-based GUI for Harper. Studio enables you to administer, Harper now includes a simplified local Studio that is packaged with all Harper installations and served directly from the instance. It can be enabled in the [configuration file](../../deployments/configuration#localstudio). This section is dedicated to the hosted Studio accessed at [studio.harperdb.io](https://studio.harperdb.io). --- + ## How does Studio Work? + While Harper Studio is web based and hosted by us, all database interactions are performed on the Harper instance the studio is connected to. The Harper Studio loads in your browser, at which point you login to your Harper instances. Credentials are stored in your browser cache and are not transmitted back to Harper. All database interactions are made via the Harper Operations API directly from your browser to your instance. ## What type of instances can I manage? -Harper Studio enables users to manage both Harper Cloud instances and privately hosted instances all from a single UI. All Harper instances feature identical behavior whether they are hosted by us or by you. \ No newline at end of file + +Harper Studio enables users to manage both Harper Cloud instances and privately hosted instances all from a single UI. All Harper instances feature identical behavior whether they are hosted by us or by you. diff --git a/site/versioned_docs/version-4.4/administration/harper-studio/instance-configuration.md b/site/versioned_docs/version-4.4/administration/harper-studio/instance-configuration.md index cbf07b38..394aa21c 100644 --- a/site/versioned_docs/version-4.4/administration/harper-studio/instance-configuration.md +++ b/site/versioned_docs/version-4.4/administration/harper-studio/instance-configuration.md @@ -6,71 +6,63 @@ title: Instance Configuration Harper instance configuration can be viewed and managed directly through the Harper Studio. Harper Cloud instances can be resized in two different ways via this page, either by modifying machine RAM or by increasing drive storage. Enterprise instances can have their licenses modified by modifying licensed RAM. - - All instance configuration is handled through the **config** page of the Harper Studio, accessed with the following instructions: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click config in the instance control bar. +4. Click config in the instance control bar. -*Note, the **config** page will only be available to super users and certain items are restricted to Studio organization owners.* +_Note, the **config** page will only be available to super users and certain items are restricted to Studio organization owners._ ## Instance Overview The **instance overview** panel displays the following instance specifications: -* Instance URL +- Instance URL -* Applications URL +- Applications URL -* Instance Node Name (for clustering) +- Instance Node Name (for clustering) -* Instance API Auth Header (this user) - - *The Basic authentication header used for the logged in Harper database user* +- Instance API Auth Header (this user) -* Created Date (Harper Cloud only) + _The Basic authentication header used for the logged in Harper database user_ -* Region (Harper Cloud only) - - *The geographic region where the instance is hosted.* +- Created Date (Harper Cloud only) -* Total Price +- Region (Harper Cloud only) -* RAM + _The geographic region where the instance is hosted._ -* Storage (Harper Cloud only) +- Total Price -* Disk IOPS (Harper Cloud only) +- RAM -## Update Instance RAM +- Storage (Harper Cloud only) -Harper Cloud instance size and Enterprise instance licenses can be modified with the following instructions. This option is only available to Studio organization owners. +- Disk IOPS (Harper Cloud only) +## Update Instance RAM +Harper Cloud instance size and Enterprise instance licenses can be modified with the following instructions. This option is only available to Studio organization owners. Note: For Harper Cloud instances, upgrading RAM may add additional CPUs to your instance as well. Click here to see how many CPUs are provisioned for each instance size. -1) In the **update ram** panel at the bottom left: +1. In the **update ram** panel at the bottom left: + - Select the new instance size. + - If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. + - If you do have a credit card associated, you will be presented with the updated billing information. + - Click **Upgrade**. - * Select the new instance size. - - * If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. - - * If you do have a credit card associated, you will be presented with the updated billing information. - - * Click **Upgrade**. - -2) The instance will shut down and begin reprovisioning/relicensing itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. +2. The instance will shut down and begin reprovisioning/relicensing itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. -3) Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. +3. Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. -*Note, if Harper Cloud instance reprovisioning takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new).* +_Note, if Harper Cloud instance reprovisioning takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new)._ ## Update Instance Storage @@ -78,48 +70,43 @@ The Harper Cloud instance storage size can be increased with the following instr Note: Instance storage can only be upgraded once every 6 hours. -1) In the **update storage** panel at the bottom left: - - * Select the new instance storage size. +1. In the **update storage** panel at the bottom left: + - Select the new instance storage size. - * If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. + - If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. - * If you do have a credit card associated, you will be presented with the updated billing information. + - If you do have a credit card associated, you will be presented with the updated billing information. - * Click **Upgrade**. + - Click **Upgrade**. -2) The instance will shut down and begin reprovisioning itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. +2. The instance will shut down and begin reprovisioning itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. -3) Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. +3. Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. -*Note, if this process takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new).* +_Note, if this process takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new)._ ## Remove Instance The Harper instance can be deleted/removed from the Studio with the following instructions. Once this operation is started it cannot be undone. This option is only available to Studio organization owners. -1) In the **remove instance** panel at the bottom left: - * Enter the instance name in the text box. - - * The Studio will present you with a warning. - - * Click **Remove**. - -2) The instance will begin deleting immediately. - +1. In the **remove instance** panel at the bottom left: + - Enter the instance name in the text box. + - The Studio will present you with a warning. + - Click **Remove**. + +2. The instance will begin deleting immediately. + ## Restart Instance The Harper Cloud instance can be restarted with the following instructions. -1) In the **restart instance** panel at the bottom right: - * Enter the instance name in the text box. - - * The Studio will present you with a warning. - - * Click **Restart**. - -2) The instance will begin restarting immediately. +1. In the **restart instance** panel at the bottom right: + - Enter the instance name in the text box. + - The Studio will present you with a warning. + - Click **Restart**. + +2. The instance will begin restarting immediately. ## Instance Config (Read Only) -A JSON preview of the instance config is available for reference at the bottom of the page. This is a read only visual and is not editable via the Studio. To make changes to the instance config, review the [configuration file documentation](../../deployments/configuration#using-the-configuration-file-and-naming-conventions). \ No newline at end of file +A JSON preview of the instance config is available for reference at the bottom of the page. This is a read only visual and is not editable via the Studio. To make changes to the instance config, review the [configuration file documentation](../../deployments/configuration#using-the-configuration-file-and-naming-conventions). diff --git a/site/versioned_docs/version-4.4/administration/harper-studio/instances.md b/site/versioned_docs/version-4.4/administration/harper-studio/instances.md index bb54493d..f17acb70 100644 --- a/site/versioned_docs/version-4.4/administration/harper-studio/instances.md +++ b/site/versioned_docs/version-4.4/administration/harper-studio/instances.md @@ -6,9 +6,9 @@ title: Instances The Harper Studio allows you to administer all of your HarperDinstances in one place. Harper currently offers the following instance types: -* **Harper Cloud Instance** Managed installations of Harper, what we call [Harper Cloud](../../deployments/harper-cloud/). -* **5G Wavelength Instance** Managed installations of Harper running on the Verizon network through AWS Wavelength, what we call 5G Wavelength Instances. _Note, these instances are only accessible via the Verizon network._ -* **Enterprise Instance** Any Harper installation that is managed by you. These include instances hosted within your cloud provider accounts (for example, from the AWS or Digital Ocean Marketplaces), privately hosted instances, or instances installed locally. +- **Harper Cloud Instance** Managed installations of Harper, what we call [Harper Cloud](../../deployments/harper-cloud/). +- **5G Wavelength Instance** Managed installations of Harper running on the Verizon network through AWS Wavelength, what we call 5G Wavelength Instances. _Note, these instances are only accessible via the Verizon network._ +- **Enterprise Instance** Any Harper installation that is managed by you. These include instances hosted within your cloud provider accounts (for example, from the AWS or Digital Ocean Marketplaces), privately hosted instances, or instances installed locally. All interactions between the Studio and your instances take place directly from your browser. Harper stores metadata about your instances, which enables the Studio to display these instances when you log in. Beyond that, all traffic is routed from your browser to the Harper instances using the standard [Harper API](../../developers/operations-api/). @@ -26,24 +26,30 @@ A summary view of all instances within an organization can be viewed by clicking 1. Fill out Instance Info. 1. Enter Instance Name - _This will be used to build your instance URL. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com). The Instance URL will be previewed below._ + _This will be used to build your instance URL. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com). The Instance URL will be previewed below._ + 1. Enter Instance Username - _This is the username of the initial Harper instance super user._ + _This is the username of the initial Harper instance super user._ + 1. Enter Instance Password - _This is the password of the initial Harper instance super user._ + _This is the password of the initial Harper instance super user._ + 1. Click **Instance Details** to move to the next page. 1. Select Instance Specs 1. Select Instance RAM - _Harper Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance._ _More on instance specs__._ + _Harper Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance._ _More on instance specs\_\_._ + 1. Select Storage Size - _Each instance has a mounted storage volume where your Harper data will reside. Storage is provisioned based on space and IOPS._ _More on IOPS Impact on Performance__._ + _Each instance has a mounted storage volume where your Harper data will reside. Storage is provisioned based on space and IOPS._ _More on IOPS Impact on Performance\_\_._ + 1. Select Instance Region - _The geographic area where your instance will be provisioned._ + _The geographic area where your instance will be provisioned._ + 1. Click **Confirm Instance Details** to move to the next page. 1. Review your Instance Details, if there is an error, use the back button to correct it. 1. Review the [Privacy Policy](https://harperdb.io/legal/privacy-policy/) and [Terms of Service](https://harperdb.io/legal/harperdb-cloud-terms-of-service/), if you agree, click the **I agree** radio button to confirm. @@ -59,27 +65,34 @@ A summary view of all instances within an organization can be viewed by clicking 1. Fill out Instance Info. 1. Enter Instance Name - _This is used for descriptive purposes only._ + _This is used for descriptive purposes only._ + 1. Enter Instance Username - _The username of a Harper super user that is already configured in your Harper installation._ + _The username of a Harper super user that is already configured in your Harper installation._ + 1. Enter Instance Password - _The password of a Harper super user that is already configured in your Harper installation._ + _The password of a Harper super user that is already configured in your Harper installation._ + 1. Enter Host - _The host to access the Harper instance. For example, `harperdb.myhost.com` or `localhost`._ + _The host to access the Harper instance. For example, `harperdb.myhost.com` or `localhost`._ + 1. Enter Port - _The port to access the Harper instance. Harper defaults `9925` for HTTP and `31283` for HTTPS._ + _The port to access the Harper instance. Harper defaults `9925` for HTTP and `31283` for HTTPS._ + 1. Select SSL - _If your instance is running over SSL, select the SSL checkbox. If not, you will need to enable mixed content in your browser to allow the HTTPS Studio to access the HTTP instance. If there are issues connecting to the instance, the Studio will display a red error message._ + _If your instance is running over SSL, select the SSL checkbox. If not, you will need to enable mixed content in your browser to allow the HTTPS Studio to access the HTTP instance. If there are issues connecting to the instance, the Studio will display a red error message._ + 1. Click **Instance Details** to move to the next page. 1. Select Instance Specs 1. Select Instance RAM - _Harper instances are billed based on Instance RAM. Selecting additional RAM will enable the ability for faster and more complex queries._ + _Harper instances are billed based on Instance RAM. Selecting additional RAM will enable the ability for faster and more complex queries._ + 1. Click **Confirm Instance Details** to move to the next page. 1. Review your Instance Details, if there is an error, use the back button to correct it. 1. Review the [Privacy Policy](https://harperdb.io/legal/privacy-policy/) and [Terms of Service](https://harperdb.io/legal/harperdb-cloud-terms-of-service/), if you agree, click the **I agree** radio button to confirm. @@ -90,8 +103,8 @@ A summary view of all instances within an organization can be viewed by clicking Instance deletion has two different behaviors depending on the instance type. -* **Harper Cloud Instance** This instance will be permanently deleted, including all data. This process is irreversible and cannot be undone. -* **Enterprise Instance** The instance will be removed from the Harper Studio only. This does not uninstall Harper from your system and your data will remain intact. +- **Harper Cloud Instance** This instance will be permanently deleted, including all data. This process is irreversible and cannot be undone. +- **Enterprise Instance** The instance will be removed from the Harper Studio only. This does not uninstall Harper from your system and your data will remain intact. An instance can be deleted as follows: @@ -100,7 +113,8 @@ An instance can be deleted as follows: 1. Identify the proper instance card and click the trash can icon. 1. Enter the instance name into the text box. - _This is done for confirmation purposes to ensure you do not accidentally delete an instance._ + _This is done for confirmation purposes to ensure you do not accidentally delete an instance._ + 1. Click the **Do It** button. ## Upgrade an Instance @@ -123,8 +137,10 @@ To log in to an instance: 1. Identify the proper instance card, it will have an unlocked icon and a status reading PLEASE LOG IN, and click the center of the card. 1. Enter the database username. - _The username of a Harper user that is already configured in your Harper instance._ + _The username of a Harper user that is already configured in your Harper instance._ + 1. Enter the database password. - _The password of a Harper user that is already configured in your Harper instance._ + _The password of a Harper user that is already configured in your Harper instance._ + 1. Click **Log In**. diff --git a/site/versioned_docs/version-4.4/administration/harper-studio/login-password-reset.md b/site/versioned_docs/version-4.4/administration/harper-studio/login-password-reset.md index 2dd71fe3..93f9a727 100644 --- a/site/versioned_docs/version-4.4/administration/harper-studio/login-password-reset.md +++ b/site/versioned_docs/version-4.4/administration/harper-studio/login-password-reset.md @@ -8,35 +8,35 @@ title: Login and Password Reset To log into your existing Harper Studio account: -1) Navigate to the [Harper Studio](https://studio.harperdb.io/). -2) Enter your email address. -3) Enter your password. -4) Click **sign in**. +1. Navigate to the [Harper Studio](https://studio.harperdb.io/). +2. Enter your email address. +3. Enter your password. +4. Click **sign in**. ## Reset a Forgotten Password To reset a forgotten password: -1) Navigate to the Harper Studio password reset page. -2) Enter your email address. -3) Click **send password reset email**. -4) If the account exists, you will receive an email with a temporary password. -5) Navigate back to the Harper Studio login page. -6) Enter your email address. -7) Enter your temporary password. -8) Click **sign in**. -9) You will be taken to a new screen to reset your account password. Enter your new password. -*Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character.* -10) Click the **add account password** button. +1. Navigate to the Harper Studio password reset page. +2. Enter your email address. +3. Click **send password reset email**. +4. If the account exists, you will receive an email with a temporary password. +5. Navigate back to the Harper Studio login page. +6. Enter your email address. +7. Enter your temporary password. +8. Click **sign in**. +9. You will be taken to a new screen to reset your account password. Enter your new password. + _Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character._ +10. Click the **add account password** button. ## Change Your Password If you are already logged into the Studio, you can change your password though the user interface. -1) Navigate to the Harper Studio profile page. -2) In the **password** section, enter: +1. Navigate to the Harper Studio profile page. +2. In the **password** section, enter: + - Current password. + - New password. + - New password again _(for verification)_. - * Current password. - * New password. - * New password again *(for verification)*. -4) Click the **Update Password** button. \ No newline at end of file +3. Click the **Update Password** button. diff --git a/site/versioned_docs/version-4.4/administration/harper-studio/manage-applications.md b/site/versioned_docs/version-4.4/administration/harper-studio/manage-applications.md index 5c51915f..854b94b3 100644 --- a/site/versioned_docs/version-4.4/administration/harper-studio/manage-applications.md +++ b/site/versioned_docs/version-4.4/administration/harper-studio/manage-applications.md @@ -37,11 +37,11 @@ Accessing your application endpoints varies with which type of endpoint you're c Below is a breakdown of how to access each type of endpoint. In these examples, we will use a locally hosted instance with `securePort` set to `9926`: `https://localhost:9926`. -* **Standard REST Endpoints**\ +- **Standard REST Endpoints**\ Standard REST endpoints are defined via the `@export` directive to tables in your schema definition. You can read more about these in the [Adding an Endpoint section of the Applications documentation](../../developers/applications/#adding-an-endpoint). Here, if we are looking to access a record with ID `1` from table `Dog` on our instance, [per the REST documentation](../../developers/rest), we could send a `GET` (or since this is a GET, we could post the URL in our browser) to `https://localhost:9926/Dog/1`. -* **Augmented REST Endpoints**\ +- **Augmented REST Endpoints**\ Harper Applications enable you to write [Custom Functionality with JavaScript](../../developers/applications/#custom-functionality-with-javascript) for your resources. Accessing these endpoints is identical to accessing the standard REST endpoints above, though you may have defined custom behavior in each function. Taking the example from the [Applications documentation](../../developers/applications/#custom-functionality-with-javascript), if we are looking to access the `DogWithHumanAge` example, we could send the GET to `https://localhost:9926/DogWithHumanAge/1`. -* **Fastify Routes**\ +- **Fastify Routes**\ If you need more functionality than the REST applications can provide, you can define your own custom endpoints using [Fastify Routes](../../developers/applications/#define-fastify-routes). The paths to these routes are defined via the application `config.yaml` file. You can read more about how you can customize the configuration options in the [Define Fastify Routes documentation](../../developers/applications/define-routes). By default, routes are accessed via the following pattern: `[Instance URL]:[HTTP Port]/[Project Name]/[Route URL]`. Using the example from the [Harper Application Template](https://github.com/HarperDB/application-template/), where we've named our project `application-template`, we would access the `getAll` route at `https://localhost/application-template/getAll`. ## Creating a New Application diff --git a/site/versioned_docs/version-4.4/administration/harper-studio/manage-databases-browse-data.md b/site/versioned_docs/version-4.4/administration/harper-studio/manage-databases-browse-data.md index 88c16a6c..c9b2844d 100644 --- a/site/versioned_docs/version-4.4/administration/harper-studio/manage-databases-browse-data.md +++ b/site/versioned_docs/version-4.4/administration/harper-studio/manage-databases-browse-data.md @@ -6,10 +6,10 @@ title: Manage Databases / Browse Data Manage instance databases/tables and browse data in tabular format with the following instructions: -1) Navigate to the Harper Studio Organizations page. -2) Click the appropriate organization that the instance belongs to. -3) Select your desired instance. -4) Click **browse** in the instance control bar. +1. Navigate to the Harper Studio Organizations page. +2. Click the appropriate organization that the instance belongs to. +3. Select your desired instance. +4. Click **browse** in the instance control bar. Once on the instance browse page you can view data, manage databases and tables, add new data, and more. @@ -17,95 +17,90 @@ Once on the instance browse page you can view data, manage databases and tables, #### Create a Database -1) Click the plus icon at the top right of the databases section. -2) Enter the database name. -3) Click the green check mark. - +1. Click the plus icon at the top right of the databases section. +2. Enter the database name. +3. Click the green check mark. #### Delete a Database Deleting a database is permanent and irreversible. Deleting a database removes all tables and data within it. -1) Click the minus icon at the top right of the databases section. -2) Identify the appropriate database to delete and click the red minus sign in the same row. -3) Click the red check mark to confirm deletion. - +1. Click the minus icon at the top right of the databases section. +2. Identify the appropriate database to delete and click the red minus sign in the same row. +3. Click the red check mark to confirm deletion. #### Create a Table -1) Select the desired database from the databases section. -2) Click the plus icon at the top right of the tables section. -3) Enter the table name. -4) Enter the primary key. - - *The primary key is also often referred to as the hash attribute in the studio, and it defines the unique identifier for each row in your table.* -5) Click the green check mark. +1. Select the desired database from the databases section. +2. Click the plus icon at the top right of the tables section. +3. Enter the table name. +4. Enter the primary key. + _The primary key is also often referred to as the hash attribute in the studio, and it defines the unique identifier for each row in your table._ + +5. Click the green check mark. #### Delete a Table + Deleting a table is permanent and irreversible. Deleting a table removes all data within it. -1) Select the desired database from the databases section. -2) Click the minus icon at the top right of the tables section. -3) Identify the appropriate table to delete and click the red minus sign in the same row. -4) Click the red check mark to confirm deletion. +1. Select the desired database from the databases section. +2. Click the minus icon at the top right of the tables section. +3. Identify the appropriate table to delete and click the red minus sign in the same row. +4. Click the red check mark to confirm deletion. ## Manage Table Data The following section assumes you have selected the appropriate table from the database/table browser. - - #### Filter Table Data -1) Click the magnifying glass icon at the top right of the table browser. -2) This expands the search filters. -3) The results will be filtered appropriately. - +1. Click the magnifying glass icon at the top right of the table browser. +2. This expands the search filters. +3. The results will be filtered appropriately. #### Load CSV Data -1) Click the data icon at the top right of the table browser. You will be directed to the CSV upload page where you can choose to import a CSV by URL or upload a CSV file. -2) To import a CSV by URL: - 1) Enter the URL in the **CSV file URL** textbox. - 2) Click **Import From URL**. - 3) The CSV will load, and you will be redirected back to browse table data. -3) To upload a CSV file: - 1) Click **Click or Drag to select a .csv file** (or drag your CSV file from your file browser). - 2) Navigate to your desired CSV file and select it. - 3) Click **Insert X Records**, where X is the number of records in your CSV. - 4) The CSV will load, and you will be redirected back to browse table data. - +1. Click the data icon at the top right of the table browser. You will be directed to the CSV upload page where you can choose to import a CSV by URL or upload a CSV file. +2. To import a CSV by URL: + 1. Enter the URL in the **CSV file URL** textbox. + 2. Click **Import From URL**. + 3. The CSV will load, and you will be redirected back to browse table data. +3. To upload a CSV file: + 1. Click **Click or Drag to select a .csv file** (or drag your CSV file from your file browser). + 2. Navigate to your desired CSV file and select it. + 3. Click **Insert X Records**, where X is the number of records in your CSV. + 4. The CSV will load, and you will be redirected back to browse table data. #### Add a Record -1) Click the plus icon at the top right of the table browser. -2) The Studio will pre-populate existing table attributes in JSON format. +1. Click the plus icon at the top right of the table browser. +2. The Studio will pre-populate existing table attributes in JSON format. - *The primary key is not included, but you can add it in and set it to your desired value. Auto-maintained fields are not included and cannot be manually set. You may enter a JSON array to insert multiple records in a single transaction.* -3) Enter values to be added to the record. + _The primary key is not included, but you can add it in and set it to your desired value. Auto-maintained fields are not included and cannot be manually set. You may enter a JSON array to insert multiple records in a single transaction._ - *You may add new attributes to the JSON; they will be reflexively added to the table.* -4) Click the **Add New** button. +3. Enter values to be added to the record. + _You may add new attributes to the JSON; they will be reflexively added to the table._ -#### Edit a Record +4. Click the **Add New** button. -1) Click the record/row you would like to edit. -2) Modify the desired values. +#### Edit a Record - *You may add new attributes to the JSON; they will be reflexively added to the table.* +1. Click the record/row you would like to edit. +2. Modify the desired values. -3) Click the **save icon**. + _You may add new attributes to the JSON; they will be reflexively added to the table._ +3. Click the **save icon**. #### Delete a Record Deleting a record is permanent and irreversible. If transaction logging is turned on, the delete transaction will be recorded as well as the data that was deleted. -1) Click the record/row you would like to delete. -2) Click the **delete icon**. -3) Confirm deletion by clicking the **check icon**. +1. Click the record/row you would like to delete. +2. Click the **delete icon**. +3. Confirm deletion by clicking the **check icon**. ## Browse Table Data @@ -115,18 +110,14 @@ The following section assumes you have selected the appropriate table from the d The first page of table data is automatically loaded on table selection. Paging controls are at the bottom of the table. Here you can: -* Page left and right using the arrows. -* Type in the desired page. -* Change the page size (the amount of records displayed in the table). - +- Page left and right using the arrows. +- Type in the desired page. +- Change the page size (the amount of records displayed in the table). #### Refresh Table Data Click the refresh icon at the top right of the table browser. - - #### Automatically Refresh Table Data Toggle the auto switch at the top right of the table browser. The table data will now automatically refresh every 15 seconds. Filters and pages will remain set for refreshed data. - diff --git a/site/versioned_docs/version-4.4/administration/harper-studio/manage-instance-roles.md b/site/versioned_docs/version-4.4/administration/harper-studio/manage-instance-roles.md index d0f8c82d..5a1e36e2 100644 --- a/site/versioned_docs/version-4.4/administration/harper-studio/manage-instance-roles.md +++ b/site/versioned_docs/version-4.4/administration/harper-studio/manage-instance-roles.md @@ -8,69 +8,70 @@ Harper users and roles can be managed directly through the Harper Studio. It is Instance role configuration is handled through the **roles** page of the Harper Studio, accessed with the following instructions: -1) Navigate to the Harper Studio Organizations page. +1. Navigate to the Harper Studio Organizations page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **roles** in the instance control bar. +4. Click **roles** in the instance control bar. -*Note, the **roles** page will only be available to super users.* +_Note, the **roles** page will only be available to super users._ +The _roles management_ screen consists of the following panels: +- **super users** -The *roles management* screen consists of the following panels: + Displays all super user roles for this instance. -* **super users** +- **cluster users** - Displays all super user roles for this instance. -* **cluster users** + Displays all cluster user roles for this instance. - Displays all cluster user roles for this instance. -* **standard roles** +- **standard roles** - Displays all standard roles for this instance. -* **role permission editing** + Displays all standard roles for this instance. - Once a role is selected for editing, permissions will be displayed here in JSON format. +- **role permission editing** -*Note, when new tables are added that are not configured, the Studio will generate configuration values with permissions defaulting to `false`.* + Once a role is selected for editing, permissions will be displayed here in JSON format. + +_Note, when new tables are added that are not configured, the Studio will generate configuration values with permissions defaulting to `false`._ ## Role Management #### Create a Role -1) Click the plus icon at the top right of the appropriate role section. +1. Click the plus icon at the top right of the appropriate role section. -2) Enter the role name. +2. Enter the role name. -3) Click the green check mark. +3. Click the green check mark. -4) Optionally toggle the **manage databases/tables** switch to specify the `structure_user` config. +4. Optionally toggle the **manage databases/tables** switch to specify the `structure_user` config. -5) Configure the role permissions in the role permission editing panel. +5. Configure the role permissions in the role permission editing panel. - *Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel.* + _Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel._ -6) Click **Update Role Permissions**. +6. Click **Update Role Permissions**. #### Modify a Role -1) Click the appropriate role from the appropriate role section. +1. Click the appropriate role from the appropriate role section. -2) Modify the role permissions in the role permission editing panel. +2. Modify the role permissions in the role permission editing panel. - *Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel.* + _Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel._ -3) Click **Update Role Permissions**. +3. Click **Update Role Permissions**. #### Delete a Role Deleting a role is permanent and irreversible. A role cannot be remove if users are associated with it. -1) Click the minus icon at the top right of the roles section. +1. Click the minus icon at the top right of the roles section. -2) Identify the appropriate role to delete and click the red minus sign in the same row. +2. Identify the appropriate role to delete and click the red minus sign in the same row. -3) Click the red check mark to confirm deletion. \ No newline at end of file +3. Click the red check mark to confirm deletion. diff --git a/site/versioned_docs/version-4.4/administration/harper-studio/manage-instance-users.md b/site/versioned_docs/version-4.4/administration/harper-studio/manage-instance-users.md index 23bcaa49..e125464a 100644 --- a/site/versioned_docs/version-4.4/administration/harper-studio/manage-instance-users.md +++ b/site/versioned_docs/version-4.4/administration/harper-studio/manage-instance-users.md @@ -8,54 +8,46 @@ Harper users and roles can be managed directly through the Harper Studio. It is Instance user configuration is handled through the **users** page of the Harper Studio, accessed with the following instructions: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **users** in the instance control bar. +4. Click **users** in the instance control bar. -*Note, the **users** page will only be available to super users.* +_Note, the **users** page will only be available to super users._ ## Add a User Harper instance users can be added with the following instructions. -1) In the **add user** panel on the left enter: - - * New user username. - - * New user password. - - * Select a role. - - *Learn more about role management here: [Manage Instance Roles](./manage-instance-roles).* - -2) Click **Add User**. - +1. In the **add user** panel on the left enter: + - New user username. + - New user password. + - Select a role. + + _Learn more about role management here: [Manage Instance Roles](./manage-instance-roles)._ + +2. Click **Add User**. + ## Edit a User Harper instance users can be modified with the following instructions. -1) In the **existing users** panel, click the row of the user you would like to edit. +1. In the **existing users** panel, click the row of the user you would like to edit. + +2. To change a user’s password: + 1. In the **Change user password** section, enter the new password. + 2. Click **Update Password**. -2) To change a user’s password: +3. To change a user’s role: + 1. In the **Change user role** section, select the new role. + 2. Click **Update Role**. - 1) In the **Change user password** section, enter the new password. - - 2) Click **Update Password**. - -3) To change a user’s role: +4. To delete a user: + 1. In the **Delete User** section, type the username into the textbox. - 1) In the **Change user role** section, select the new role. - - 2) Click **Update Role**. - -4) To delete a user: + _This is done for confirmation purposes._ - 1) In the **Delete User** section, type the username into the textbox. - - *This is done for confirmation purposes.* - - 2) Click **Delete User**. \ No newline at end of file + 2. Click **Delete User**. diff --git a/site/versioned_docs/version-4.4/administration/harper-studio/manage-replication.md b/site/versioned_docs/version-4.4/administration/harper-studio/manage-replication.md index 02951470..3fd92514 100644 --- a/site/versioned_docs/version-4.4/administration/harper-studio/manage-replication.md +++ b/site/versioned_docs/version-4.4/administration/harper-studio/manage-replication.md @@ -6,65 +6,66 @@ title: Manage Replication Harper instance clustering and replication can be configured directly through the Harper Studio. It is recommended to read through the [clustering documentation](../../developers/clustering/) first to gain a strong understanding of Harper clustering behavior. - - All clustering configuration is handled through the **replication** page of the Harper Studio, accessed with the following instructions: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **replication** in the instance control bar. +4. Click **replication** in the instance control bar. Note, the **replication** page will only be available to super users. --- + ## Initial Configuration Harper instances do not have clustering configured by default. The Harper Studio will walk you through the initial configuration. Upon entering the **replication** screen for the first time you will need to complete the following configuration. Configurations are set in the **enable clustering** panel on the left while actions are described in the middle of the screen. It is worth reviewing the [Creating a Cluster User](../../developers/clustering/creating-a-cluster-user) document before proceeding. -1) Enter Cluster User username. (Defaults to `cluster_user`). -2) Enter Cluster Password. -3) Review and/or Set Cluster Node Name. -4) Click **Enable Clustering**. - +1. Enter Cluster User username. (Defaults to `cluster_user`). +2. Enter Cluster Password. +3. Review and/or Set Cluster Node Name. +4. Click **Enable Clustering**. + At this point the Studio will restart your Harper Instance, required for the configuration changes to take effect. --- ## Manage Clustering + Once initial clustering configuration is completed you a presented with a clustering management screen with the following properties: -* **connected instances** +- **connected instances** + + Displays all instances within the Studio Organization that this instance manages a connection with. - Displays all instances within the Studio Organization that this instance manages a connection with. +- **unconnected instances** -* **unconnected instances** + Displays all instances within the Studio Organization that this instance does not manage a connection with. - Displays all instances within the Studio Organization that this instance does not manage a connection with. +- **unregistered instances** -* **unregistered instances** + Displays all instances outside the Studio Organization that this instance manages a connection with. - Displays all instances outside the Studio Organization that this instance manages a connection with. +- **manage clustering** -* **manage clustering** + Once instances are connected, this will display clustering management options for all connected instances and all databases and tables. - Once instances are connected, this will display clustering management options for all connected instances and all databases and tables. --- ## Connect an Instance Harper Instances can be clustered together with the following instructions. -1) Ensure clustering has been configured on both instances and a cluster user with identical credentials exists on both. +1. Ensure clustering has been configured on both instances and a cluster user with identical credentials exists on both. -2) Identify the instance you would like to connect from the **unconnected instances** panel. +2. Identify the instance you would like to connect from the **unconnected instances** panel. -3) Click the plus icon next the appropriate instance. +3. Click the plus icon next the appropriate instance. -4) If configurations are correct, all databases will sync across the cluster, then appear in the **manage clustering** panel. If there is a configuration issue, a red exclamation icon will appear, click it to learn more about what could be causing the issue. +4. If configurations are correct, all databases will sync across the cluster, then appear in the **manage clustering** panel. If there is a configuration issue, a red exclamation icon will appear, click it to learn more about what could be causing the issue. --- @@ -72,9 +73,9 @@ Harper Instances can be clustered together with the following instructions. Harper Instances can be disconnected with the following instructions. -1) Identify the instance you would like to disconnect from the **connected instances** panel. +1. Identify the instance you would like to disconnect from the **connected instances** panel. -2) Click the minus icon next the appropriate instance. +2. Click the minus icon next the appropriate instance. --- @@ -82,8 +83,8 @@ Harper Instances can be disconnected with the following instructions. Subscriptions must be configured in order to move data between connected instances. Read more about subscriptions here: Creating A Subscription. The **manage clustering** panel displays a table with each row representing an channel per instance. Cells are bolded to indicate a change in the column. Publish and subscribe replication can be configured per table with the following instructions: -1) Identify the instance, database, and table for replication to be configured. +1. Identify the instance, database, and table for replication to be configured. -2) For publish, click the toggle switch in the **publish** column. +2. For publish, click the toggle switch in the **publish** column. -3) For subscribe, click the toggle switch in the **subscribe** column. \ No newline at end of file +3. For subscribe, click the toggle switch in the **subscribe** column. diff --git a/site/versioned_docs/version-4.4/administration/harper-studio/organizations.md b/site/versioned_docs/version-4.4/administration/harper-studio/organizations.md index d486abbc..1bb56dd1 100644 --- a/site/versioned_docs/version-4.4/administration/harper-studio/organizations.md +++ b/site/versioned_docs/version-4.4/administration/harper-studio/organizations.md @@ -3,43 +3,46 @@ title: Organizations --- # Organizations -Harper Studio organizations provide the ability to group Harper Cloud Instances. Organization behavior is as follows: -* Billing occurs at the organization level to a single credit card. -* Organizations retain their own unique Harper Cloud subdomain. -* Cloud instances reside within an organization. -* Studio users can be invited to organizations to share instances. +Harper Studio organizations provide the ability to group Harper Cloud Instances. Organization behavior is as follows: +- Billing occurs at the organization level to a single credit card. +- Organizations retain their own unique Harper Cloud subdomain. +- Cloud instances reside within an organization. +- Studio users can be invited to organizations to share instances. An organization is automatically created for you when you sign up for Harper Studio. If you only have one organization, the Studio will automatically bring you to your organization’s page. --- ## List Organizations + A summary view of all organizations your user belongs to can be viewed on the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. You can navigate to this page at any time by clicking the **all organizations** link at the top of the Harper Studio. ## Create a New Organization + A new organization can be created as follows: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the **Create a New Organization** card. -3) Fill out new organization details - * Enter Organization Name - *This is used for descriptive purposes only.* - * Enter Organization Subdomain - *Part of the URL that will be used to identify your Harper Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com).* -4) Click Create Organization. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the **Create a New Organization** card. +3. Fill out new organization details + - Enter Organization Name + _This is used for descriptive purposes only._ + - Enter Organization Subdomain + _Part of the URL that will be used to identify your Harper Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com)._ +4. Click Create Organization. ## Delete an Organization An organization cannot be deleted until all instances have been removed. An organization can be deleted as follows: -1) Navigate to the Harper Studio Organizations page. -2) Identify the proper organization card and click the trash can icon. -3) Enter the organization name into the text box. +1. Navigate to the Harper Studio Organizations page. +2. Identify the proper organization card and click the trash can icon. +3. Enter the organization name into the text box. + + _This is done for confirmation purposes to ensure you do not accidentally delete an organization._ - *This is done for confirmation purposes to ensure you do not accidentally delete an organization.* -4) Click the **Do It** button. +4. Click the **Do It** button. ## Manage Users @@ -49,11 +52,11 @@ Harper Studio organization owners can manage users including inviting new users, A new user can be invited to an organization as follows: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) In the **add user** box, enter the new user’s email address. -5) Click **Add User**. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. In the **add user** box, enter the new user’s email address. +5. Click **Add User**. Users may or may not already be Harper Studio users when adding them to an organization. If the Harper Studio account already exists, the user will receive an email notification alerting them to the organization invitation. If the user does not have a Harper Studio account, they will receive an email welcoming them to Harper Studio. @@ -63,11 +66,11 @@ Users may or may not already be Harper Studio users when adding them to an organ Organization owners have full access to the organization including the ability to manage organization users, create, modify, and delete instances, and delete the organization. Users must have accepted their invitation prior to being promoted to an owner. A user’s organization owner status can be toggled owner as follows: -1) Navigate to the Harper Studio Organizations page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) Click the appropriate user from the **existing users** section. -5) Toggle the **Is Owner** switch to the desired status. +1. Navigate to the Harper Studio Organizations page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. Click the appropriate user from the **existing users** section. +5. Toggle the **Is Owner** switch to the desired status. --- @@ -75,35 +78,32 @@ Organization owners have full access to the organization including the ability t Users may be removed from an organization at any time. Removing a user from an organization will not delete their Harper Studio account, it will only remove their access to the specified organization. A user can be removed from an organization as follows: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) Click the appropriate user from the **existing users** section. -5) Type **DELETE** in the text box in the **Delete User** row. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. Click the appropriate user from the **existing users** section. +5. Type **DELETE** in the text box in the **Delete User** row. - *This is done for confirmation purposes to ensure you do not accidentally delete a user.* -6) Click **Delete User**. + _This is done for confirmation purposes to ensure you do not accidentally delete a user._ + +6. Click **Delete User**. ## Manage Billing Billing is configured per organization and will be billed to the stored credit card at appropriate intervals (monthly or annually depending on the registered instance). Billing settings can be configured as follows: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **billing** at the top of the screen. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **billing** at the top of the screen. Here organization owners can view invoices, manage coupons, and manage the associated credit card. - - -*Harper billing and payments are managed via Stripe.* - - +_Harper billing and payments are managed via Stripe._ ### Add a Coupon Coupons are applicable towards any paid tier or enterprise instance and you can change your subscription at any time. Coupons can be added to your Organization as follows: -1) In the coupons panel of the **billing** page, enter your coupon code. -2) Click **Add Coupon**. -3) The coupon will then be available and displayed in the coupons panel. \ No newline at end of file +1. In the coupons panel of the **billing** page, enter your coupon code. +2. Click **Add Coupon**. +3. The coupon will then be available and displayed in the coupons panel. diff --git a/site/versioned_docs/version-4.4/administration/jobs.md b/site/versioned_docs/version-4.4/administration/jobs.md index e71dd9cf..84859ffd 100644 --- a/site/versioned_docs/version-4.4/administration/jobs.md +++ b/site/versioned_docs/version-4.4/administration/jobs.md @@ -10,7 +10,7 @@ Harper Jobs are asynchronous tasks performed by the Operations API. Jobs uses an asynchronous methodology to account for the potential of a long-running operation. For example, exporting millions of records to S3 could take some time, so that job is started and the id is provided to check on the status. -The job status can be **COMPLETE** or **IN\_PROGRESS**. +The job status can be **COMPLETE** or **IN_PROGRESS**. ## Example Job Operations diff --git a/site/versioned_docs/version-4.4/administration/logging/audit-logging.md b/site/versioned_docs/version-4.4/administration/logging/audit-logging.md index cfec1062..209b4981 100644 --- a/site/versioned_docs/version-4.4/administration/logging/audit-logging.md +++ b/site/versioned_docs/version-4.4/administration/logging/audit-logging.md @@ -12,7 +12,7 @@ Audit log is enabled by default. To disable the audit log, set `logging.auditLog ### Audit Log Operations -#### read\_audit\_log +#### read_audit_log The `read_audit_log` operation is flexible, enabling users to query with many parameters. All operations search on a single table. Filter options include timestamps, usernames, and table hash values. Additional examples found in the [Harper API documentation](../../developers/operations-api/logs). @@ -20,116 +20,107 @@ The `read_audit_log` operation is flexible, enabling users to query with many pa ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "timestamp", - "search_values": [ - 1660585740558 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "timestamp", + "search_values": [1660585740558] } ``` There are three outcomes using timestamp. -* `"search_values": []` - All records returned for specified table -* `"search_values": [1660585740558]` - All records after provided timestamp -* `"search_values": [1660585740558, 1760585759710]` - Records "from" and "to" provided timestamp +- `"search_values": []` - All records returned for specified table +- `"search_values": [1660585740558]` - All records after provided timestamp +- `"search_values": [1660585740558, 1760585759710]` - Records "from" and "to" provided timestamp -*** +--- **Search by Username** ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "username", - "search_values": [ - "admin" - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "username", + "search_values": ["admin"] } ``` The above example will return all records whose `username` is "admin." -*** +--- **Search by Primary Key** ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "hash_value", - "search_values": [ - 318 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "hash_value", + "search_values": [318] } ``` The above example will return all records whose primary key (`hash_value`) is 318. -*** +--- -#### read\_audit\_log Response +#### read_audit_log Response The example that follows provides records of operations performed on a table. One thing of note is that the `read_audit_log` operation gives you the `original_records`. ```json { - "operation": "update", - "user_name": "HDB_ADMIN", - "timestamp": 1607035559122.277, - "hash_values": [ - 1, - 2 - ], - "records": [ - { - "id": 1, - "breed": "Muttzilla", - "age": 6, - "__updatedtime__": 1607035559122 - }, - { - "id": 2, - "age": 7, - "__updatedtime__": 1607035559121 - } - ], - "original_records": [ - { - "__createdtime__": 1607035556801, - "__updatedtime__": 1607035556801, - "age": 5, - "breed": "Mutt", - "id": 2, - "name": "Penny" - }, - { - "__createdtime__": 1607035556801, - "__updatedtime__": 1607035556801, - "age": 5, - "breed": "Mutt", - "id": 1, - "name": "Harper" - } - ] + "operation": "update", + "user_name": "HDB_ADMIN", + "timestamp": 1607035559122.277, + "hash_values": [1, 2], + "records": [ + { + "id": 1, + "breed": "Muttzilla", + "age": 6, + "__updatedtime__": 1607035559122 + }, + { + "id": 2, + "age": 7, + "__updatedtime__": 1607035559121 + } + ], + "original_records": [ + { + "__createdtime__": 1607035556801, + "__updatedtime__": 1607035556801, + "age": 5, + "breed": "Mutt", + "id": 2, + "name": "Penny" + }, + { + "__createdtime__": 1607035556801, + "__updatedtime__": 1607035556801, + "age": 5, + "breed": "Mutt", + "id": 1, + "name": "Harper" + } + ] } ``` -#### delete\_audit\_logs\_before +#### delete_audit_logs_before Just like with transaction logs, you can clean up your audit logs with the `delete_audit_logs_before` operation. It will delete audit log data according to the given parameters. The example below will delete records older than the timestamp provided. ```json { - "operation": "delete_audit_logs_before", - "schema": "dev", - "table": "cat", - "timestamp": 1598290282817 + "operation": "delete_audit_logs_before", + "schema": "dev", + "table": "cat", + "timestamp": 1598290282817 } ``` diff --git a/site/versioned_docs/version-4.4/administration/logging/index.md b/site/versioned_docs/version-4.4/administration/logging/index.md index 7a9588ce..e04b8adb 100644 --- a/site/versioned_docs/version-4.4/administration/logging/index.md +++ b/site/versioned_docs/version-4.4/administration/logging/index.md @@ -6,6 +6,6 @@ title: Logging Harper provides many different logging options for various features and functionality. -* [Standard Logging](./standard-logging): Harper maintains a log of events that take place throughout operation. -* [Audit Logging](./audit-logging): Harper uses a standard Harper table to track transactions. For each table a user creates, a corresponding table will be created to track transactions against that table. -* [Transaction Logging](./transaction-logging): Harper stores a verbose history of all transactions logged for specified database tables, including original data records. +- [Standard Logging](./standard-logging): Harper maintains a log of events that take place throughout operation. +- [Audit Logging](./audit-logging): Harper uses a standard Harper table to track transactions. For each table a user creates, a corresponding table will be created to track transactions against that table. +- [Transaction Logging](./transaction-logging): Harper stores a verbose history of all transactions logged for specified database tables, including original data records. diff --git a/site/versioned_docs/version-4.4/administration/logging/standard-logging.md b/site/versioned_docs/version-4.4/administration/logging/standard-logging.md index c7c2fe7a..a5116ed7 100644 --- a/site/versioned_docs/version-4.4/administration/logging/standard-logging.md +++ b/site/versioned_docs/version-4.4/administration/logging/standard-logging.md @@ -22,15 +22,15 @@ For example, a typical log entry looks like: The components of a log entry are: -* timestamp - This is the date/time stamp when the event occurred -* level - This is an associated log level that gives a rough guide to the importance and urgency of the message. The available log levels in order of least urgent (and more verbose) are: `trace`, `debug`, `info`, `warn`, `error`, `fatal`, and `notify`. -* thread/ID - This reports the name of the thread and the thread ID that the event was reported on. Note that NATS logs are recorded by their process name and there is no thread id for them since they are a separate process. Key threads are: - * main - This is the thread that is responsible for managing all other threads and routes incoming requests to the other threads - * http - These are the worker threads that handle the primary workload of incoming HTTP requests to the operations API and custom functions. - * Clustering\* - These are threads and processes that handle replication. - * job - These are job threads that have been started to handle operations that are executed in a separate job thread. -* tags - Logging from a custom function will include a "custom-function" tag in the log entry. Most logs will not have any additional tags. -* message - This is the main message that was reported. +- timestamp - This is the date/time stamp when the event occurred +- level - This is an associated log level that gives a rough guide to the importance and urgency of the message. The available log levels in order of least urgent (and more verbose) are: `trace`, `debug`, `info`, `warn`, `error`, `fatal`, and `notify`. +- thread/ID - This reports the name of the thread and the thread ID that the event was reported on. Note that NATS logs are recorded by their process name and there is no thread id for them since they are a separate process. Key threads are: + - main - This is the thread that is responsible for managing all other threads and routes incoming requests to the other threads + - http - These are the worker threads that handle the primary workload of incoming HTTP requests to the operations API and custom functions. + - Clustering\* - These are threads and processes that handle replication. + - job - These are job threads that have been started to handle operations that are executed in a separate job thread. +- tags - Logging from a custom function will include a "custom-function" tag in the log entry. Most logs will not have any additional tags. +- message - This is the main message that was reported. We try to keep logging to a minimum by default, to do this the default log level is `error`. If you require more information from the logs, increasing the log level down will provide that. @@ -54,12 +54,12 @@ To access specific logs you may query the Harper API. Logs can be queried using ```json { - "operation": "read_log", - "start": 0, - "limit": 1000, - "level": "error", - "from": "2021-01-25T22:05:27.464+0000", - "until": "2021-01-25T23:05:27.464+0000", - "order": "desc" + "operation": "read_log", + "start": 0, + "limit": 1000, + "level": "error", + "from": "2021-01-25T22:05:27.464+0000", + "until": "2021-01-25T23:05:27.464+0000", + "order": "desc" } ``` diff --git a/site/versioned_docs/version-4.4/administration/logging/transaction-logging.md b/site/versioned_docs/version-4.4/administration/logging/transaction-logging.md index 48860fdd..9003ff04 100644 --- a/site/versioned_docs/version-4.4/administration/logging/transaction-logging.md +++ b/site/versioned_docs/version-4.4/administration/logging/transaction-logging.md @@ -14,71 +14,71 @@ If you would like to use the transaction log, but have not set up clustering yet ## Transaction Log Operations -### read\_transaction\_log +### read_transaction_log The `read_transaction_log` operation returns a prescribed set of records, based on given parameters. The example below will give a maximum of 2 records within the timestamps provided. ```json { - "operation": "read_transaction_log", - "schema": "dev", - "table": "dog", - "from": 1598290235769, - "to": 1660249020865, - "limit": 2 + "operation": "read_transaction_log", + "schema": "dev", + "table": "dog", + "from": 1598290235769, + "to": 1660249020865, + "limit": 2 } ``` _See example response below._ -### read\_transaction\_log Response +### read_transaction_log Response ```json [ - { - "operation": "insert", - "user": "admin", - "timestamp": 1660165619736, - "records": [ - { - "id": 1, - "dog_name": "Penny", - "owner_name": "Kyle", - "breed_id": 154, - "age": 7, - "weight_lbs": 38, - "__updatedtime__": 1660165619688, - "__createdtime__": 1660165619688 - } - ] - }, - { - "operation": "update", - "user": "admin", - "timestamp": 1660165620040, - "records": [ - { - "id": 1, - "dog_name": "Penny B", - "__updatedtime__": 1660165620036 - } - ] - } + { + "operation": "insert", + "user": "admin", + "timestamp": 1660165619736, + "records": [ + { + "id": 1, + "dog_name": "Penny", + "owner_name": "Kyle", + "breed_id": 154, + "age": 7, + "weight_lbs": 38, + "__updatedtime__": 1660165619688, + "__createdtime__": 1660165619688 + } + ] + }, + { + "operation": "update", + "user": "admin", + "timestamp": 1660165620040, + "records": [ + { + "id": 1, + "dog_name": "Penny B", + "__updatedtime__": 1660165620036 + } + ] + } ] ``` _See example request above._ -### delete\_transaction\_logs\_before +### delete_transaction_logs_before The `delete_transaction_logs_before` operation will delete transaction log data according to the given parameters. The example below will delete records older than the timestamp provided. ```json { - "operation": "delete_transaction_logs_before", - "schema": "dev", - "table": "dog", - "timestamp": 1598290282817 + "operation": "delete_transaction_logs_before", + "schema": "dev", + "table": "dog", + "timestamp": 1598290282817 } ``` diff --git a/site/versioned_docs/version-4.4/deployments/_category_.json b/site/versioned_docs/version-4.4/deployments/_category_.json index 8fdd6e17..95644c6b 100644 --- a/site/versioned_docs/version-4.4/deployments/_category_.json +++ b/site/versioned_docs/version-4.4/deployments/_category_.json @@ -1,12 +1,10 @@ { - "label": "Deployments", - "position": 3, - "link": { - "type": "generated-index", - "title": "Deployments Documentation", - "description": "Installation and deployment guides for HarperDB", - "keywords": [ - "deployments" - ] - } -} \ No newline at end of file + "label": "Deployments", + "position": 3, + "link": { + "type": "generated-index", + "title": "Deployments Documentation", + "description": "Installation and deployment guides for HarperDB", + "keywords": ["deployments"] + } +} diff --git a/site/versioned_docs/version-4.4/deployments/configuration.md b/site/versioned_docs/version-4.4/deployments/configuration.md index a54698ea..6022d05f 100644 --- a/site/versioned_docs/version-4.4/deployments/configuration.md +++ b/site/versioned_docs/version-4.4/deployments/configuration.md @@ -8,7 +8,7 @@ Harper is configured through a [YAML](https://yaml.org/) file called `harperdb-c Some configuration will be populated by default in the config file on install, regardless of whether it is used. -*** +--- ## Using the Configuration File and Naming Conventions @@ -32,7 +32,7 @@ To use a custom configuration file to set values on install, use the CLI/ENV var To install Harper overtop of an existing configuration file, set `HDB_CONFIG` to the root path of your install `/harperdb-config.yaml` -*** +--- ## Configuration Options @@ -55,7 +55,7 @@ For HTTP clients that support (Brotli) compression encoding, responses that are ```yaml http: - compressionThreshold: 1200 + compressionThreshold: 1200 ``` `cors` - _Type_: boolean; _Default_: true @@ -96,16 +96,16 @@ The length of time in milliseconds after which a request will timeout. ```yaml http: - cors: true - corsAccessList: - - null - headersTimeout: 60000 - maxHeaderSize: 8192 - https: false - keepAliveTimeout: 30000 - port: 9926 - securePort: null - timeout: 120000 + cors: true + corsAccessList: + - null + headersTimeout: 60000 + maxHeaderSize: 8192 + https: false + keepAliveTimeout: 30000 + port: 9926 + securePort: null + timeout: 120000 ``` `mlts` - _Type_: boolean | object; _Default_: false @@ -136,7 +136,7 @@ http: user: user-name ``` -*** +--- ### `threads` @@ -172,7 +172,7 @@ threads: This specifies the heap memory limit for each thread, in megabytes. The default heap limit is a heuristic based on available memory and thread count. -*** +--- ### `replication` @@ -182,7 +182,7 @@ The `replication` section configures [Harper replication](../developers/replicat replication: hostname: server-one url: wss://server-one:9925 - databases: "*" + databases: '*' routes: - wss://server-two:9925 port: null @@ -204,7 +204,7 @@ Configure which databases to replicate. This can be a string for all database or ```yaml replication: - databases: + databases: - db1 - db2 ``` @@ -244,7 +244,7 @@ When true, Harper will verify certificates against the Node.js bundled CA store. Replication will first attempt to catch up using the audit log. If unsuccessful, it will perform a full table copy. When set to `false`, replication will only use the audit log. -*** +--- ### `clustering` using NATS @@ -254,11 +254,11 @@ _Note: There exist two ways to create clusters and replicate data in Harper. One Clustering offers a lot of different configurations, however in a majority of cases the only options you will need to pay attention to are: -* `clustering.enabled` Enable the clustering processes. -* `clustering.hubServer.cluster.network.port` The port other nodes will connect to. This port must be accessible from other cluster nodes. -* `clustering.hubServer.cluster.network.routes`The connections to other instances. -* `clustering.nodeName` The name of your node, must be unique within the cluster. -* `clustering.user` The name of the user credentials used for Inter-node authentication. +- `clustering.enabled` Enable the clustering processes. +- `clustering.hubServer.cluster.network.port` The port other nodes will connect to. This port must be accessible from other cluster nodes. +- `clustering.hubServer.cluster.network.routes`The connections to other instances. +- `clustering.nodeName` The name of your node, must be unique within the cluster. +- `clustering.user` The name of the user credentials used for Inter-node authentication. `enabled` - _Type_: boolean; _Default_: false @@ -268,7 +268,7 @@ _Note: If you enabled clustering but do not create and add a cluster user you wi ```yaml clustering: - enabled: true + enabled: true ``` `clustering.hubServer.cluster` @@ -407,7 +407,7 @@ The maximum number of messages a consumer can process in one go. The number of Harper threads that are delegated to ingesting messages. -*** +--- `logLevel` - _Type_: string; _Default_: error @@ -469,7 +469,7 @@ When true, all transactions that are received from other nodes are republished t When true, hub server will verify client certificate using the CA certificate. -*** +--- `user` - _Type_: string; _Default_: null @@ -481,10 +481,10 @@ The user can be created either through the API using an `add_user` request with ```yaml clustering: - user: cluster_person + user: cluster_person ``` -*** +--- ### `localStudio` @@ -499,7 +499,7 @@ localStudio: enabled: false ``` -*** +--- ### `logging` @@ -520,9 +520,9 @@ To access the audit logs, use the API operation `read_audit_log`. It will provid ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog" + "operation": "read_audit_log", + "schema": "dev", + "table": "dog" } ``` @@ -634,7 +634,7 @@ logging: logSuccessful: false ``` -*** +--- ### `authentication` @@ -746,7 +746,7 @@ Path to the certificate authority file. Path to the private key file. -*** +--- ### `componentsRoot` @@ -758,7 +758,7 @@ The path to the folder containing the local component files. componentsRoot: ~/hdb/components ``` -*** +--- ### `rootPath` @@ -770,7 +770,7 @@ The Harper database and applications/API/interface are decoupled from each other rootPath: /Users/jonsnow/hdb ``` -*** +--- ### `storage` @@ -877,7 +877,7 @@ storage: pageSize: 4096 ``` -*** +--- ### `tls` @@ -913,16 +913,15 @@ tls: - certificate: ~/hdb/keys/certificate1.pem certificateAuthority: ~/hdb/keys/ca1.pem privateKey: ~/hdb/keys/privateKey1.pem - host: example.com # the host is optional, and if not provided, this certificate's common name will be used as the host name. + host: example.com # the host is optional, and if not provided, this certificate's common name will be used as the host name. - certificate: ~/hdb/keys/certificate2.pem certificateAuthority: ~/hdb/keys/ca2.pem privateKey: ~/hdb/keys/privateKey2.pem - ``` Note that a `tls` section can also be defined in the `operationsApi` section, which will override the root `tls` section for the operations API. -*** +--- ### `mqtt` @@ -982,7 +981,7 @@ mqtt: required: true ``` -*** +--- ### `databases` @@ -1034,20 +1033,22 @@ Using the API: ```json { - "operation": "set_configuration", - "databases": [{ - "nameOfDatabase": { - "tables": { - "nameOfTable": { - "path": "/path/to/table" - } - } - } - }] + "operation": "set_configuration", + "databases": [ + { + "nameOfDatabase": { + "tables": { + "nameOfTable": { + "path": "/path/to/table" + } + } + } + } + ] } ``` -*** +--- ### Components diff --git a/site/versioned_docs/version-4.4/deployments/harper-cli.md b/site/versioned_docs/version-4.4/deployments/harper-cli.md index 90c8e61e..e559df01 100644 --- a/site/versioned_docs/version-4.4/deployments/harper-cli.md +++ b/site/versioned_docs/version-4.4/deployments/harper-cli.md @@ -37,7 +37,7 @@ harperdb install harperdb install --TC_AGREEMENT yes --HDB_ADMIN_USERNAME HDB_ADMIN --HDB_ADMIN_PASSWORD password --ROOTPATH /tmp/hdb/ --OPERATIONSAPI_NETWORK_PORT 9925 ``` -*** +--- ### Starting Harper @@ -47,7 +47,7 @@ To start Harper after it is installed, run the following command: harperdb start ``` -*** +--- ### Stopping Harper @@ -57,7 +57,7 @@ To stop Harper once it is running, run the following command: harperdb stop ``` -*** +--- ### Restarting Harper @@ -67,7 +67,7 @@ To restart Harper once it is running, run the following command: harperdb restart ``` -*** +--- ### Getting the Harper Version @@ -77,7 +77,7 @@ To check the version of Harper that is installed run the following command: harperdb version ``` -*** +--- ### Renew self-signed certificates @@ -87,7 +87,7 @@ To renew the Harper generated self-signed certificates, run: harperdb renew-certs ``` -*** +--- ### Copy a database with compaction @@ -103,7 +103,7 @@ For example, to copy the default database: harperdb copy-db data /home/user/hdb/database/copy.mdb ``` -*** +--- ### Get all available CLI commands @@ -113,7 +113,7 @@ To display all available Harper CLI commands along with a brief description run: harperdb help ``` -*** +--- ### Get the status of Harper and clustering @@ -123,13 +123,13 @@ To display the status of the Harper process, the clustering hub and leaf process harperdb status ``` -*** +--- ### Backups Harper uses a transactional commit process that ensures that data on disk is always transactionally consistent with storage. This means that Harper maintains database integrity in the event of a crash. It also means that you can use any standard volume snapshot tool to make a backup of a Harper database. Database files are stored in the hdb/database directory. As long as the snapshot is an atomic snapshot of these database files, the data can be copied/moved back into the database directory to restore a previous backup (with Harper shut down) , and database integrity will be preserved. Note that simply copying an in-use database file (using `cp`, for example) is _not_ a snapshot, and this would progressively read data from the database at different points in time, which yields unreliable copy that likely will not be usable. Standard copying is only reliable for a database file that is not in use. -*** +--- ## Operations API through the CLI diff --git a/site/versioned_docs/version-4.4/deployments/harper-cloud/alarms.md b/site/versioned_docs/version-4.4/deployments/harper-cloud/alarms.md index 72b4e7a7..372807e5 100644 --- a/site/versioned_docs/version-4.4/deployments/harper-cloud/alarms.md +++ b/site/versioned_docs/version-4.4/deployments/harper-cloud/alarms.md @@ -8,13 +8,13 @@ Harper Cloud instance alarms are triggered when certain conditions are met. Once ### Heading Definitions -* **Alarm**: Title of the alarm. -* **Threshold**: Definition of the alarm threshold. -* **Intervals**: The number of occurrences before an alarm is triggered and the period that the metric is evaluated over. -* **Proposed Remedy**: Recommended solution to avoid the alert in the future. +- **Alarm**: Title of the alarm. +- **Threshold**: Definition of the alarm threshold. +- **Intervals**: The number of occurrences before an alarm is triggered and the period that the metric is evaluated over. +- **Proposed Remedy**: Recommended solution to avoid the alert in the future. -| Alarm | Threshold | Intervals | Proposed Remedy | -| ------- | ---------- | --------- | ------------------------------------------------------------------------------------------------------------------------------ | +| Alarm | Threshold | Intervals | Proposed Remedy | +| ------- | ---------- | --------- | --------------------------------------------------------------------------------------------------------------------------- | | Storage | > 90% Disk | 1 x 5min | [Increased storage volume](../../administration/harper-studio/instance-configuration#update-instance-storage) | | CPU | > 90% Avg | 2 x 5min | [Increase instance size for additional CPUs](../../administration/harper-studio/instance-configuration#update-instance-ram) | | Memory | > 90% RAM | 2 x 5min | [Increase instance size](../../administration/harper-studio/instance-configuration#update-instance-ram) | diff --git a/site/versioned_docs/version-4.4/deployments/harper-cloud/iops-impact.md b/site/versioned_docs/version-4.4/deployments/harper-cloud/iops-impact.md index 9a8a0732..18e9f948 100644 --- a/site/versioned_docs/version-4.4/deployments/harper-cloud/iops-impact.md +++ b/site/versioned_docs/version-4.4/deployments/harper-cloud/iops-impact.md @@ -28,15 +28,18 @@ For assistance in estimating IOPS requirements feel free to contact Harper Suppo ## Example Use Case IOPS Requirements -* **Sensor Data Collection** +- **Sensor Data Collection** - In the case of IoT sensors where data collection will be sustained, high IOPS are required. While there are not typically large queries going on in this case, there is a high volume of data being ingested. This implies that IOPS will be sustained at a high level. For example, if you are collecting 100 records per second you would expect to need roughly 3,000 IOPS just to handle the data inserts. -* **Data Analytics/BI Server** + In the case of IoT sensors where data collection will be sustained, high IOPS are required. While there are not typically large queries going on in this case, there is a high volume of data being ingested. This implies that IOPS will be sustained at a high level. For example, if you are collecting 100 records per second you would expect to need roughly 3,000 IOPS just to handle the data inserts. - Providing a server for analytics purposes typically requires a larger machine. Typically these cases involve large scale SQL joins and aggregations, which puts a large strain on reads. Harper utilizes an in-memory cache, which provides a significant performance boost on machines with large amounts of memory. However, if disparate datasets are constantly being queried and/or new data is frequently being loaded, you will find that the system still needs to have high IOPS to meet performance demand. -* **Web Services** +- **Data Analytics/BI Server** - Typical web service implementations with discrete reads and writes often do not need high IOPS to perform as expected. This is often the case in more transactional systems without the requirement for high performance load. A good rule to follow is that any Harper operation that requires a data scan will be IOPS intensive, but if these are not frequent then the EBS boost will suffice. Queries utilizing equals operations in either SQL or NoSQL do not require a scan due to Harper’s native indexing. -* **High Performance Database** + Providing a server for analytics purposes typically requires a larger machine. Typically these cases involve large scale SQL joins and aggregations, which puts a large strain on reads. Harper utilizes an in-memory cache, which provides a significant performance boost on machines with large amounts of memory. However, if disparate datasets are constantly being queried and/or new data is frequently being loaded, you will find that the system still needs to have high IOPS to meet performance demand. - Ultimately, if performance is your top priority, Harper should be run on bare metal hardware. Cloud providers offer these options at a higher cost, but they come with obvious performance improvements. +- **Web Services** + + Typical web service implementations with discrete reads and writes often do not need high IOPS to perform as expected. This is often the case in more transactional systems without the requirement for high performance load. A good rule to follow is that any Harper operation that requires a data scan will be IOPS intensive, but if these are not frequent then the EBS boost will suffice. Queries utilizing equals operations in either SQL or NoSQL do not require a scan due to Harper’s native indexing. + +- **High Performance Database** + + Ultimately, if performance is your top priority, Harper should be run on bare metal hardware. Cloud providers offer these options at a higher cost, but they come with obvious performance improvements. diff --git a/site/versioned_docs/version-4.4/deployments/harper-cloud/verizon-5g-wavelength-instances.md b/site/versioned_docs/version-4.4/deployments/harper-cloud/verizon-5g-wavelength-instances.md index 31796700..b6104f7c 100644 --- a/site/versioned_docs/version-4.4/deployments/harper-cloud/verizon-5g-wavelength-instances.md +++ b/site/versioned_docs/version-4.4/deployments/harper-cloud/verizon-5g-wavelength-instances.md @@ -28,4 +28,4 @@ AWS EBS gp2 volumes have a baseline performance level, which determines the numb Smaller gp2 volumes are perfect for trying out the functionality of Harper, and might also work well for applications that don’t perform many database transactions. For applications that perform a moderate or high number of transactions, we recommend that you use a larger Harper volume. Learn more about the [impact of IOPS on performance here](./iops-impact). -You can read more about [AWS EBS gp2 volume IOPS here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html#ebsvolumetypes\_gp2). +You can read more about [AWS EBS gp2 volume IOPS here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html#ebsvolumetypes_gp2). diff --git a/site/versioned_docs/version-4.4/deployments/install-harper/index.md b/site/versioned_docs/version-4.4/deployments/install-harper/index.md index ea2f1a45..9c6a3bda 100644 --- a/site/versioned_docs/version-4.4/deployments/install-harper/index.md +++ b/site/versioned_docs/version-4.4/deployments/install-harper/index.md @@ -55,7 +55,7 @@ npm install -g harperdb-X.X.X.tgz harperdb install Harper comes with binaries for standard AMD64/x64 or ARM64 CPU architectures on Linux, Windows (x64 only), and Mac (including Apple Silicon). However, if you are installing on a less common platform (Alpine, for example), you will need to ensure that you have build tools installed for the installation process to compile the binaries (this is handled automatically), including: -* [Go](https://go.dev/dl/): version 1.19.1 -* GCC -* Make -* Python v3.7, v3.8, v3.9, or v3.10 +- [Go](https://go.dev/dl/): version 1.19.1 +- GCC +- Make +- Python v3.7, v3.8, v3.9, or v3.10 diff --git a/site/versioned_docs/version-4.4/deployments/install-harper/linux.md b/site/versioned_docs/version-4.4/deployments/install-harper/linux.md index 93c25ec9..27a9dc79 100644 --- a/site/versioned_docs/version-4.4/deployments/install-harper/linux.md +++ b/site/versioned_docs/version-4.4/deployments/install-harper/linux.md @@ -8,7 +8,7 @@ If you wish to install locally or already have a configured server, see the basi The following is a recommended way to configure Linux and install Harper. These instructions should work reasonably well for any public cloud or on-premises Linux instance. -*** +--- These instructions assume that the following has already been completed: @@ -22,7 +22,7 @@ While you will need to access Harper through port 9925 for the administration th For this example, we will use an AWS Ubuntu Server 22.04 LTS m5.large EC2 Instance with an additional General Purpose SSD EBS volume and the default “ubuntu” user account. -*** +--- ### (Optional) LVM Configuration @@ -85,7 +85,7 @@ Run `lsblk` and note the device name of the additional volume lsblk ``` -Create an ext4 filesystem on the volume (The below commands assume the device name is nvme1n1. If you used LVM to create logical volume, replace /dev/nvme1n1 with /dev/hdb\_vg/hdb\_lv) +Create an ext4 filesystem on the volume (The below commands assume the device name is nvme1n1. If you used LVM to create logical volume, replace /dev/nvme1n1 with /dev/hdb_vg/hdb_lv) ```bash sudo mkfs.ext4 -L hdb_data /dev/nvme1n1 diff --git a/site/versioned_docs/version-4.4/deployments/upgrade-hdb-instance.md b/site/versioned_docs/version-4.4/deployments/upgrade-hdb-instance.md index 7d5662cc..768b9323 100644 --- a/site/versioned_docs/version-4.4/deployments/upgrade-hdb-instance.md +++ b/site/versioned_docs/version-4.4/deployments/upgrade-hdb-instance.md @@ -12,10 +12,11 @@ Upgrading Harper is a two-step process. First the latest version of Harper must 1. Install the latest version of Harper using `npm install -g harperdb`. - Note `-g` should only be used if you installed Harper globally (which is recommended). + Note `-g` should only be used if you installed Harper globally (which is recommended). + 1. Run `harperdb` to initiate the upgrade process. - Harper will then prompt you for all appropriate inputs and then run the upgrade directives. + Harper will then prompt you for all appropriate inputs and then run the upgrade directives. ## Node Version Manager (nvm) @@ -89,7 +90,7 @@ Start Harper harperdb start ``` -*** +--- ## Upgrading Nats to Plexus 4.4 @@ -103,8 +104,8 @@ To enable Plexus on a node that is already running NATS, you will need to update ```yaml replication: - url: wss://my-cluster-node-1:9925 - hostname: node-1 + url: wss://my-cluster-node-1:9925 + hostname: node-1 ``` `replication.url` – This should be set to the URL of the current Harper instance. @@ -114,22 +115,22 @@ replication: ### Upgrade Steps 1. Set up the bridge node: - * Choose one node to be the bridge node. - * On this node, follow the "Enabling Plexus" steps from the previous section, but **do not disable NATS clustering on this instance.** - * Stop the instance and perform the upgrade. - * Start the instance. This node should now be running both Plexus and NATS. + - Choose one node to be the bridge node. + - On this node, follow the "Enabling Plexus" steps from the previous section, but **do not disable NATS clustering on this instance.** + - Stop the instance and perform the upgrade. + - Start the instance. This node should now be running both Plexus and NATS. 1. Upgrade a node: - * Choose a node that needs upgrading and enable Plexus by following the "Enable Plexus" steps. - * Disable NATS by setting `clustering.enabled` to `false`. - * Stop the instance and upgrade it. - * Start the instance. - * Call [`add_node`](../developers/operations-api/clustering#add-node) on the upgraded instance. In this call, omit `subscriptions` so that a fully replicating cluster is built. The target node for this call should be the bridge node. _Note: depending on your setup, you may need to expand this `add_node` call to include_ [_authorization and/or tls information_](../developers/operations-api/clustering#add-node)_._ + - Choose a node that needs upgrading and enable Plexus by following the "Enable Plexus" steps. + - Disable NATS by setting `clustering.enabled` to `false`. + - Stop the instance and upgrade it. + - Start the instance. + - Call [`add_node`](../developers/operations-api/clustering#add-node) on the upgraded instance. In this call, omit `subscriptions` so that a fully replicating cluster is built. The target node for this call should be the bridge node. _Note: depending on your setup, you may need to expand this `add_node` call to include_ [_authorization and/or tls information_](../developers/operations-api/clustering#add-node)_._ ```json { - "operation": "add_node", - "hostname:": "node-1", - "url": "wss://my-cluster-node-1:9925" + "operation": "add_node", + "hostname:": "node-1", + "url": "wss://my-cluster-node-1:9925" } ``` diff --git a/site/versioned_docs/version-4.4/developers/_category_.json b/site/versioned_docs/version-4.4/developers/_category_.json index 9fe399bf..fdc723e5 100644 --- a/site/versioned_docs/version-4.4/developers/_category_.json +++ b/site/versioned_docs/version-4.4/developers/_category_.json @@ -1,12 +1,10 @@ { - "label": "Developers", - "position": 1, - "link": { - "type": "generated-index", - "title": "Developers Documentation", - "description": "Comprehensive guides and references for building applications with HarperDB", - "keywords": [ - "developers" - ] - } -} \ No newline at end of file + "label": "Developers", + "position": 1, + "link": { + "type": "generated-index", + "title": "Developers Documentation", + "description": "Comprehensive guides and references for building applications with HarperDB", + "keywords": ["developers"] + } +} diff --git a/site/versioned_docs/version-4.4/developers/applications/caching.md b/site/versioned_docs/version-4.4/developers/applications/caching.md index 2ef7b1c4..79e48440 100644 --- a/site/versioned_docs/version-4.4/developers/applications/caching.md +++ b/site/versioned_docs/version-4.4/developers/applications/caching.md @@ -21,9 +21,10 @@ You may also note that we can define a time-to-live (TTL) expiration on the tabl While you can provide a single expiration time, there are actually several expiration timings that are potentially relevant, and can be independently configured. These settings are available as directive properties on the table configuration (like `expiration` above): stale expiration: The point when a request for a record should trigger a request to origin (but might possibly return the current stale record depending on policy) must-revalidate expiration: The point when a request for a record must make a request to origin first and return the latest value from origin. eviction expiration: The point when a record is actually removed from the caching table. You can provide a single expiration and it defines the behavior for all three. You can also provide three settings for expiration, through table directives: -* expiration - The amount of time until a record goes stale. -* eviction - The amount of time after expiration before a record can be evicted (defaults to zero). -* scanInterval - The interval for scanning for expired records (defaults to one quarter of the total of expiration and eviction). + +- expiration - The amount of time until a record goes stale. +- eviction - The amount of time after expiration before a record can be evicted (defaults to zero). +- scanInterval - The interval for scanning for expired records (defaults to one quarter of the total of expiration and eviction). ## Define External Data Source @@ -32,8 +33,8 @@ Next, you need to define the source for your cache. External data sources could ```javascript class ThirdPartyAPI extends Resource { async get() { - return (await fetch(`https://some-api.com/${this.getId()}`)).json(); - } + return (await fetch(`https://some-api.com/${this.getId()}`)).json(); + } } ``` @@ -68,11 +69,11 @@ In the example above, we simply retrieved data to fulfill a cache request. We ma ```javascript class ThirdPartyAPI extends Resource { - async get() { - let response = await fetch(`https://some-api.com/${this.getId()}`); - this.getContext().lastModified = response.headers.get('Last-Modified'); - return response.json(); - } + async get() { + let response = await fetch(`https://some-api.com/${this.getId()}`); + this.getContext().lastModified = response.headers.get('Last-Modified'); + return response.json(); + } } ``` @@ -108,10 +109,11 @@ One way to provide more active caching is to specifically invalidate individual ```javascript const { MyTable } = tables; export class MyTableEndpoint extends MyTable { - async post(data) { - if (data.invalidate) // use this flag as a marker - this.invalidate(); - } + async post(data) { + if (data.invalidate) + // use this flag as a marker + this.invalidate(); + } } ``` @@ -142,20 +144,20 @@ class ThirdPartyAPI extends Resource { Notification events should always include an `id` property to indicate the primary key of the updated record. The event should have a `value` property for `put` and `message` event types. The `timestamp` is optional and can be used to indicate the exact timestamp of the change. The following event `type`s are supported: -* `put` - This indicates that the record has been updated and provides the new value of the record. -* `invalidate` - Alternately, you can notify with an event type of `invalidate` to indicate that the data has changed, but without the overhead of actually sending the data (the `value` property is not needed), so the data only needs to be sent if and when the data is requested through the cache. An `invalidate` will evict the entry and update the timestamp to indicate that there is new data that should be requested (if needed). -* `delete` - This indicates that the record has been deleted. -* `message` - This indicates a message is being passed through the record. The record value has not changed, but this is used for [publish/subscribe messaging](../real-time). -* `transaction` - This indicates that there are multiple writes that should be treated as a single atomic transaction. These writes should be included as an array of data notification events in the `writes` property. +- `put` - This indicates that the record has been updated and provides the new value of the record. +- `invalidate` - Alternately, you can notify with an event type of `invalidate` to indicate that the data has changed, but without the overhead of actually sending the data (the `value` property is not needed), so the data only needs to be sent if and when the data is requested through the cache. An `invalidate` will evict the entry and update the timestamp to indicate that there is new data that should be requested (if needed). +- `delete` - This indicates that the record has been deleted. +- `message` - This indicates a message is being passed through the record. The record value has not changed, but this is used for [publish/subscribe messaging](../real-time). +- `transaction` - This indicates that there are multiple writes that should be treated as a single atomic transaction. These writes should be included as an array of data notification events in the `writes` property. And the following properties can be defined on event objects: -* `type`: The event type as described above. -* `id`: The primary key of the record that updated -* `value`: The new value of the record that updated (for put and message) -* `writes`: An array of event properties that are part of a transaction (used in conjunction with the transaction event type). -* `table`: The name of the table with the record that was updated. This can be used with events within a transaction to specify events across multiple tables. -* `timestamp`: The timestamp of when the data change occurred +- `type`: The event type as described above. +- `id`: The primary key of the record that updated +- `value`: The new value of the record that updated (for put and message) +- `writes`: An array of event properties that are part of a transaction (used in conjunction with the transaction event type). +- `table`: The name of the table with the record that was updated. This can be used with events within a transaction to specify events across multiple tables. +- `timestamp`: The timestamp of when the data change occurred With an active external data source with a `subscribe` method, the data source will proactively notify the cache, ensuring a fresh and efficient active cache. Note that with an active data source, we still use the `sourcedFrom` method to register the source for a caching table, and the table will automatically detect and call the subscribe method on the data source. @@ -174,13 +176,13 @@ An alternative to using asynchronous generators is to use a subscription stream ```javascript class ThirdPartyAPI extends Resource { - subscribe() { - const subscription = super.subscribe(); - setupListeningToRemoteService().on('update', (event) => { - subscription.send(event); - }); - return subscription; - } + subscribe() { + const subscription = super.subscribe(); + setupListeningToRemoteService().on('update', (event) => { + subscription.send(event); + }); + return subscription; + } } ``` @@ -216,12 +218,12 @@ When you are using a caching table, it is important to remember that any resourc ```javascript class MyCache extends tables.MyCache { - async post(data) { - // if the data is not cached locally, retrieves from source: - await this.ensuredLoaded(); - // now we can be sure that the data is loaded, and can access properties - this.quantity = this.quantity - data.purchases; - } + async post(data) { + // if the data is not cached locally, retrieves from source: + await this.ensuredLoaded(); + // now we can be sure that the data is loaded, and can access properties + this.quantity = this.quantity - data.purchases; + } } ``` @@ -267,21 +269,24 @@ Cache-Control: only-if-cached, no-store You may also use the `stale-if-error` to indicate if it is acceptable to return a stale cached resource when the data source returns an error (network connection error, 500, 502, 503, or 504). The `must-revalidate` directive can indicate a stale cached resource can not be returned, even when the data source has an error (by default a stale cached resource is returned when there is a network connection error). - ## Caching Flow + It may be helpful to understand the flow of a cache request. When a request is made to a caching table: -* Harper will first create a resource instance to handle the process, and ensure that the data is loaded for the resource instance. To do this, it will first check if the record is in the table/cache. - * If the record is not in the cache, Harper will first check if there is a current request to get the record from the source. If there is, Harper will wait for the request to complete and return the record from the cache. - * If not, Harper will call the `get()` method on the source to retrieve the record. The record will then be stored in the cache. - * If the record is in the cache, Harper will check if the record is stale. If the record is not stale, Harper will immediately return the record from the cache. If the record is stale, Harper will call the `get()` method on the source to retrieve the record. - * The record will then be stored in the cache. This will write the record to the cache in a separate asynchronous/background write-behind transaction, so it does not block the current request, then return the data immediately once it has it. -* The `get()` method will be called on the resource instance to return the record to the client (or perform any querying on the record). If this is overriden, the method will be called at this time. + +- Harper will first create a resource instance to handle the process, and ensure that the data is loaded for the resource instance. To do this, it will first check if the record is in the table/cache. + - If the record is not in the cache, Harper will first check if there is a current request to get the record from the source. If there is, Harper will wait for the request to complete and return the record from the cache. + - If not, Harper will call the `get()` method on the source to retrieve the record. The record will then be stored in the cache. + - If the record is in the cache, Harper will check if the record is stale. If the record is not stale, Harper will immediately return the record from the cache. If the record is stale, Harper will call the `get()` method on the source to retrieve the record. + - The record will then be stored in the cache. This will write the record to the cache in a separate asynchronous/background write-behind transaction, so it does not block the current request, then return the data immediately once it has it. +- The `get()` method will be called on the resource instance to return the record to the client (or perform any querying on the record). If this is overriden, the method will be called at this time. ### Caching Flow with Write-Through + When a writes are performed on a caching table (in `put()` or `post()` method, for example), the flow is slightly different: -* Harper will have first created a resource instance to handle the process, and this resource instance that will be the current `this` for a call to `put()` or `post()`. -* If a `put()` or `update()` is called, for example, this action will be record in the current transaction. -* Once the transaction is committed (which is done automatically as the request handler completes), the transaction write will be sent to the source to update the data. - * The local writes will wait for the source to confirm the writes have completed (note that this effectively allows you to perform a two-phase transactional write to the source, and the source can confirm the writes have completed before the transaction is committed locally). - * The transaction writes will then be written the local caching table. -* The transaction handler will wait for the local commit to be written, then the transaction will be resolved and a response will be sent to the client. + +- Harper will have first created a resource instance to handle the process, and this resource instance that will be the current `this` for a call to `put()` or `post()`. +- If a `put()` or `update()` is called, for example, this action will be record in the current transaction. +- Once the transaction is committed (which is done automatically as the request handler completes), the transaction write will be sent to the source to update the data. + - The local writes will wait for the source to confirm the writes have completed (note that this effectively allows you to perform a two-phase transactional write to the source, and the source can confirm the writes have completed before the transaction is committed locally). + - The transaction writes will then be written the local caching table. +- The transaction handler will wait for the local commit to be written, then the transaction will be resolved and a response will be sent to the client. diff --git a/site/versioned_docs/version-4.4/developers/applications/debugging.md b/site/versioned_docs/version-4.4/developers/applications/debugging.md index c7c085bf..bd9d2622 100644 --- a/site/versioned_docs/version-4.4/developers/applications/debugging.md +++ b/site/versioned_docs/version-4.4/developers/applications/debugging.md @@ -18,13 +18,13 @@ For local debugging and development, it is recommended that you use standard con Harper Logger Functions -* `trace(message)`: Write a 'trace' level log, if the configured level allows for it. -* `debug(message)`: Write a 'debug' level log, if the configured level allows for it. -* `info(message)`: Write a 'info' level log, if the configured level allows for it. -* `warn(message)`: Write a 'warn' level log, if the configured level allows for it. -* `error(message)`: Write a 'error' level log, if the configured level allows for it. -* `fatal(message)`: Write a 'fatal' level log, if the configured level allows for it. -* `notify(message)`: Write a 'notify' level log. +- `trace(message)`: Write a 'trace' level log, if the configured level allows for it. +- `debug(message)`: Write a 'debug' level log, if the configured level allows for it. +- `info(message)`: Write a 'info' level log, if the configured level allows for it. +- `warn(message)`: Write a 'warn' level log, if the configured level allows for it. +- `error(message)`: Write a 'error' level log, if the configured level allows for it. +- `fatal(message)`: Write a 'fatal' level log, if the configured level allows for it. +- `notify(message)`: Write a 'notify' level log. For example, you can log a warning: diff --git a/site/versioned_docs/version-4.4/developers/applications/define-routes.md b/site/versioned_docs/version-4.4/developers/applications/define-routes.md index 3dd91c18..720f4f06 100644 --- a/site/versioned_docs/version-4.4/developers/applications/define-routes.md +++ b/site/versioned_docs/version-4.4/developers/applications/define-routes.md @@ -16,23 +16,23 @@ fastifyRoutes: # This loads files that define fastify routes using fastify's aut By default, route URLs are configured to be: -* \[**Instance URL**]:\[**HTTP Port**]/\[**Project Name**]/\[**Route URL**] +- \[**Instance URL**]:\[**HTTP Port**]/\[**Project Name**]/\[**Route URL**] However, you can specify the path to be `/` if you wish to have your routes handling the root path of incoming URLs. -* The route below, using the default config, within the **dogs** project, with a route of **breeds** would be available at **http:/localhost:9926/dogs/breeds**. +- The route below, using the default config, within the **dogs** project, with a route of **breeds** would be available at **http:/localhost:9926/dogs/breeds**. In effect, this route is just a pass-through to Harper. The same result could have been achieved by hitting the core Harper API, since it uses **hdbCore.preValidation** and **hdbCore.request**, which are defined in the “helper methods” section, below. ```javascript export default async (server, { hdbCore, logger }) => { - server.route({ - url: '/', - method: 'POST', - preValidation: hdbCore.preValidation, - handler: hdbCore.request, - }) -} + server.route({ + url: '/', + method: 'POST', + preValidation: hdbCore.preValidation, + handler: hdbCore.request, + }); +}; ``` ## Custom Handlers @@ -69,20 +69,20 @@ Below is an example of a route that uses a custom validation hook: import customValidation from '../helpers/customValidation'; export default async (server, { hdbCore, logger }) => { - server.route({ - url: '/:id', - method: 'GET', - preValidation: (request) => customValidation(request, logger), - handler: (request) => { - request.body= { - operation: 'sql', - sql: `SELECT * FROM dev.dog WHERE id = ${request.params.id}` - }; - - return hdbCore.requestWithoutAuthentication(request); - } - }); -} + server.route({ + url: '/:id', + method: 'GET', + preValidation: (request) => customValidation(request, logger), + handler: (request) => { + request.body = { + operation: 'sql', + sql: `SELECT * FROM dev.dog WHERE id = ${request.params.id}`, + }; + + return hdbCore.requestWithoutAuthentication(request); + }, + }); +}; ``` Notice we imported customValidation from the **helpers** directory. To include a helper, and to see the actual code within customValidation, see [Helper Methods](./define-routes#helper-methods). @@ -95,24 +95,25 @@ When declaring routes, you are given access to 2 helper methods: hdbCore and log hdbCore contains three functions that allow you to authenticate an inbound request, and execute operations against Harper directly, by passing the standard Operations API. -* **preValidation** +- **preValidation** + + This is an array of functions used for fastify authentication. The second function takes the authorization header from the inbound request and executes the same authentication as the standard Harper Operations API (for example, `hdbCore.preValidation[1](./req, resp, callback)`). It will determine if the user exists, and if they are allowed to perform this operation. **If you use the request method, you have to use preValidation to get the authenticated user**. - This is an array of functions used for fastify authentication. The second function takes the authorization header from the inbound request and executes the same authentication as the standard Harper Operations API (for example, `hdbCore.preValidation[1](./req, resp, callback)`). It will determine if the user exists, and if they are allowed to perform this operation. **If you use the request method, you have to use preValidation to get the authenticated user**. -* **request** +- **request** - This will execute a request with Harper using the operations API. The `request.body` should contain a standard Harper operation and must also include the `hdb_user` property that was in `request.body` provided in the callback. -* **requestWithoutAuthentication** + This will execute a request with Harper using the operations API. The `request.body` should contain a standard Harper operation and must also include the `hdb_user` property that was in `request.body` provided in the callback. - Executes a request against Harper without any security checks around whether the inbound user is allowed to make this request. For security purposes, you should always take the following precautions when using this method: +- **requestWithoutAuthentication** - * Properly handle user-submitted values, including url params. User-submitted values should only be used for `search_value` and for defining values in records. Special care should be taken to properly escape any values if user-submitted values are used for SQL. + Executes a request against Harper without any security checks around whether the inbound user is allowed to make this request. For security purposes, you should always take the following precautions when using this method: + - Properly handle user-submitted values, including url params. User-submitted values should only be used for `search_value` and for defining values in records. Special care should be taken to properly escape any values if user-submitted values are used for SQL. **logger** This helper allows you to write directly to the log file, hdb.log. It’s useful for debugging during development, although you may also use the console logger. There are 5 functions contained within logger, each of which pertains to a different **logging.level** configuration in your harperdb-config.yaml file. -* logger.trace(‘Starting the handler for /dogs’) -* logger.debug(‘This should only fire once’) -* logger.warn(‘This should never ever fire’) -* logger.error(‘This did not go well’) -* logger.fatal(‘This did not go very well at all’) +- logger.trace(‘Starting the handler for /dogs’) +- logger.debug(‘This should only fire once’) +- logger.warn(‘This should never ever fire’) +- logger.error(‘This did not go well’) +- logger.fatal(‘This did not go very well at all’) diff --git a/site/versioned_docs/version-4.4/developers/applications/defining-roles.md b/site/versioned_docs/version-4.4/developers/applications/defining-roles.md index d6c766fc..55dd5885 100644 --- a/site/versioned_docs/version-4.4/developers/applications/defining-roles.md +++ b/site/versioned_docs/version-4.4/developers/applications/defining-roles.md @@ -8,7 +8,9 @@ In addition to [defining a database schema](./defining-schemas), you can also de roles: files: roles.yaml ``` + Now you can create a roles.yaml in your application directory: + ```yaml declared-role: super_user: false # This is a boolean value that indicates if the role is a super user or not @@ -32,12 +34,13 @@ declared-role: With this in place, where Harper starts up, it will create the roles in the roles.yaml file if they do not already exist. If they do exist, it will update the roles with the new permissions. This allows you to manage your roles in your application code and have them automatically created or updated when the application starts. The structure of the roles.yaml file is: + ```yaml : permission: # contains the permissions for the role, this structure is optional, and you can place flags like super_user here as a shortcut super_user: : # each database with permissions can be added as named properties on the role - tables: # this structure is optional, and table names can be placed directly under the database as a shortcut + tables: # this structure is optional, and table names can be placed directly under the database as a shortcut : read: # indicates if the role has read permission to this table insert: # indicates if the role has insert permission to this table @@ -48,4 +51,4 @@ The structure of the roles.yaml file is: read: insert: update: -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.4/developers/applications/defining-schemas.md b/site/versioned_docs/version-4.4/developers/applications/defining-schemas.md index 35db07d9..1af9fcc3 100644 --- a/site/versioned_docs/version-4.4/developers/applications/defining-schemas.md +++ b/site/versioned_docs/version-4.4/developers/applications/defining-schemas.md @@ -40,10 +40,10 @@ type TableName @table By default the table name is inherited from the type name (in this case the table name would be "TableName"). The `@table` directive supports several optional arguments (all of these are optional and can be freely combined): -* `@table(table: "table_name")` - This allows you to explicitly specify the table name. -* `@table(database: "database_name")` - This allows you to specify which database the table belongs to. This defaults to the "data" database. -* `@table(expiration: 3600)` - Sets an expiration time on entries in the table before they are automatically cleared (primarily useful for caching tables). This is specified in seconds. -* `@table(audit: true)` - This enables the audit log for the table so that a history of record changes are recorded. This defaults to [configuration file's setting for `auditLog`](../../deployments/configuration#logging). +- `@table(table: "table_name")` - This allows you to explicitly specify the table name. +- `@table(database: "database_name")` - This allows you to specify which database the table belongs to. This defaults to the "data" database. +- `@table(expiration: 3600)` - Sets an expiration time on entries in the table before they are automatically cleared (primarily useful for caching tables). This is specified in seconds. +- `@table(audit: true)` - This enables the audit log for the table so that a history of record changes are recorded. This defaults to [configuration file's setting for `auditLog`](../../deployments/configuration#logging). #### `@export` @@ -134,7 +134,7 @@ type Product @table { ```javascript tables.Product.setComputedAttribute('totalPrice', (record) => { - return record.price + (record.price * record.taxRate); + return record.price + record.price * record.taxRate; }); ``` @@ -169,7 +169,7 @@ The field directives can be used for information about each attribute in table t #### `@primaryKey` -The `@primaryKey` directive specifies that an attribute is the primary key for a table. These must be unique and when records are created, this will be auto-generated if no primary key is provided. When a primary key is auto-generated, it will be a UUID (as a string) if the primary key type is `String` or `ID`. If the primary key type is `Int`, `Long`, or `Any`, then the primary key will be an auto-incremented number. Using numeric primary keys is more efficient than using UUIDs. Note that if the type is `Int`, the primary key will be limited to 32-bit, which can be limiting and problematic for large tables. It is recommended that if you will be relying on auto-generated keys, that you use a primary key type of `Long` or `Any` (the latter will allow you to also use strings as primary keys). +The `@primaryKey` directive specifies that an attribute is the primary key for a table. These must be unique and when records are created, this will be auto-generated if no primary key is provided. When a primary key is auto-generated, it will be a UUID (as a string) if the primary key type is `String` or `ID`. If the primary key type is `Int`, `Long`, or `Any`, then the primary key will be an auto-incremented number. Using numeric primary keys is more efficient than using UUIDs. Note that if the type is `Int`, the primary key will be limited to 32-bit, which can be limiting and problematic for large tables. It is recommended that if you will be relying on auto-generated keys, that you use a primary key type of `Long` or `Any` (the latter will allow you to also use strings as primary keys). #### `@indexed` @@ -195,16 +195,16 @@ If you do not define a schema for a table and create a table through the operati Harper supports the following field types in addition to user defined (object) types: -* `String`: String/text. -* `Int`: A 32-bit signed integer (from -2147483648 to 2147483647). -* `Long`: A 54-bit signed integer (from -9007199254740992 to 9007199254740992). -* `Float`: Any number (any number that can be represented as a [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision_floating-point_format). Note that all numbers are stored in the most compact representation available). -* `BigInt`: Any integer (negative or positive) with less than 300 digits. (Note that `BigInt` is a distinct and separate type from standard numbers in JavaScript, so custom code should handle this type appropriately.) -* `Boolean`: true or false. -* `ID`: A string (but indicates it is not intended to be human readable). -* `Any`: Any primitive, object, or array is allowed. -* `Date`: A Date object. -* `Bytes`: Binary data (as a Buffer or Uint8Array). +- `String`: String/text. +- `Int`: A 32-bit signed integer (from -2147483648 to 2147483647). +- `Long`: A 54-bit signed integer (from -9007199254740992 to 9007199254740992). +- `Float`: Any number (any number that can be represented as a [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision_floating-point_format). Note that all numbers are stored in the most compact representation available). +- `BigInt`: Any integer (negative or positive) with less than 300 digits. (Note that `BigInt` is a distinct and separate type from standard numbers in JavaScript, so custom code should handle this type appropriately.) +- `Boolean`: true or false. +- `ID`: A string (but indicates it is not intended to be human readable). +- `Any`: Any primitive, object, or array is allowed. +- `Date`: A Date object. +- `Bytes`: Binary data (as a Buffer or Uint8Array). #### Renaming Tables diff --git a/site/versioned_docs/version-4.4/developers/applications/example-projects.md b/site/versioned_docs/version-4.4/developers/applications/example-projects.md index c3e23aae..3c2342a3 100644 --- a/site/versioned_docs/version-4.4/developers/applications/example-projects.md +++ b/site/versioned_docs/version-4.4/developers/applications/example-projects.md @@ -6,32 +6,32 @@ title: Example Projects **Library of example Harper applications and components:** -* [Authorization in Harper using Okta Customer Identity Cloud](https://www.harperdb.io/post/authorization-in-harperdb-using-okta-customer-identity-cloud), by Yitaek Hwang +- [Authorization in Harper using Okta Customer Identity Cloud](https://www.harperdb.io/post/authorization-in-harperdb-using-okta-customer-identity-cloud), by Yitaek Hwang -* [How to Speed Up your Applications by Caching at the Edge with Harper](https://dev.to/doabledanny/how-to-speed-up-your-applications-by-caching-at-the-edge-with-harperdb-3o2l), by Danny Adams +- [How to Speed Up your Applications by Caching at the Edge with Harper](https://dev.to/doabledanny/how-to-speed-up-your-applications-by-caching-at-the-edge-with-harperdb-3o2l), by Danny Adams -* [OAuth Authentication in Harper using Auth0 & Node.js](https://www.harperdb.io/post/oauth-authentication-in-harperdb-using-auth0-and-node-js), by Lucas Santos +- [OAuth Authentication in Harper using Auth0 & Node.js](https://www.harperdb.io/post/oauth-authentication-in-harperdb-using-auth0-and-node-js), by Lucas Santos -* [How To Create a CRUD API with Next.js & Harper Custom Functions](https://www.harperdb.io/post/create-a-crud-api-w-next-js-harperdb), by Colby Fayock +- [How To Create a CRUD API with Next.js & Harper Custom Functions](https://www.harperdb.io/post/create-a-crud-api-w-next-js-harperdb), by Colby Fayock -* [Build a Dynamic REST API with Custom Functions](https://harperdb.io/blog/build-a-dynamic-rest-api-with-custom-functions/), by Terra Roush +- [Build a Dynamic REST API with Custom Functions](https://harperdb.io/blog/build-a-dynamic-rest-api-with-custom-functions/), by Terra Roush -* [How to use Harper Custom Functions to Build your Entire Backend](https://dev.to/andrewbaisden/how-to-use-harperdb-custom-functions-to-build-your-entire-backend-a2m), by Andrew Baisden +- [How to use Harper Custom Functions to Build your Entire Backend](https://dev.to/andrewbaisden/how-to-use-harperdb-custom-functions-to-build-your-entire-backend-a2m), by Andrew Baisden -* [Using TensorFlowJS & Harper Custom Functions for Machine Learning](https://harperdb.io/blog/using-tensorflowjs-harperdb-for-machine-learning/), by Kevin Ashcraft +- [Using TensorFlowJS & Harper Custom Functions for Machine Learning](https://harperdb.io/blog/using-tensorflowjs-harperdb-for-machine-learning/), by Kevin Ashcraft -* [Build & Deploy a Fitness App with Python & Harper](https://www.youtube.com/watch?v=KMkmA4i2FQc), by Patrick Löber +- [Build & Deploy a Fitness App with Python & Harper](https://www.youtube.com/watch?v=KMkmA4i2FQc), by Patrick Löber -* [Create a Discord Slash Bot using Harper Custom Functions](https://geekysrm.hashnode.dev/discord-slash-bot-with-harperdb-custom-functions), by Soumya Ranjan Mohanty +- [Create a Discord Slash Bot using Harper Custom Functions](https://geekysrm.hashnode.dev/discord-slash-bot-with-harperdb-custom-functions), by Soumya Ranjan Mohanty -* [How I used Harper Custom Functions to Build a Web App for my Newsletter](https://blog.hrithwik.me/how-i-used-harperdb-custom-functions-to-build-a-web-app-for-my-newsletter), by Hrithwik Bharadwaj +- [How I used Harper Custom Functions to Build a Web App for my Newsletter](https://blog.hrithwik.me/how-i-used-harperdb-custom-functions-to-build-a-web-app-for-my-newsletter), by Hrithwik Bharadwaj -* [How I used Harper Custom Functions and Recharts to create Dashboard](https://blog.greenroots.info/how-to-create-dashboard-with-harperdb-custom-functions-and-recharts), by Tapas Adhikary +- [How I used Harper Custom Functions and Recharts to create Dashboard](https://blog.greenroots.info/how-to-create-dashboard-with-harperdb-custom-functions-and-recharts), by Tapas Adhikary -* [How To Use Harper Custom Functions With Your React App](https://dev.to/tyaga001/how-to-use-harperdb-custom-functions-with-your-react-app-2c43), by Ankur Tyagi +- [How To Use Harper Custom Functions With Your React App](https://dev.to/tyaga001/how-to-use-harperdb-custom-functions-with-your-react-app-2c43), by Ankur Tyagi -* [Build a Web App Using Harper’s Custom Functions](https://www.youtube.com/watch?v=rz6prItVJZU), livestream by Jaxon Repp +- [Build a Web App Using Harper’s Custom Functions](https://www.youtube.com/watch?v=rz6prItVJZU), livestream by Jaxon Repp -* [How to Web Scrape Using Python, Snscrape & Custom Functions](https://hackernoon.com/how-to-web-scrape-using-python-snscrape-and-harperdb), by Davis David +- [How to Web Scrape Using Python, Snscrape & Custom Functions](https://hackernoon.com/how-to-web-scrape-using-python-snscrape-and-harperdb), by Davis David -* [What’s the Big Deal w/ Custom Functions](https://rss.com/podcasts/harperdb-select-star/278933/), Select* Podcast +- [What’s the Big Deal w/ Custom Functions](https://rss.com/podcasts/harperdb-select-star/278933/), Select\* Podcast diff --git a/site/versioned_docs/version-4.4/developers/applications/index.md b/site/versioned_docs/version-4.4/developers/applications/index.md index 4148bb7b..0d44d670 100644 --- a/site/versioned_docs/version-4.4/developers/applications/index.md +++ b/site/versioned_docs/version-4.4/developers/applications/index.md @@ -68,7 +68,7 @@ To create your own application from scratch, you'll may want to initialize it as Here's an example for a github repo: ```shell -> git remote set-url origin git@github.com:// +> git remote set-url origin git@github.com:// ``` Locally developing your application and then committing your app to a source control is a great way to manage your code and configuration, and then you can [directly deploy from your repository](./#deploying-your-application). @@ -230,9 +230,9 @@ Congratulations, you now have created a secure database application backend with This guide assumes that you're building a Harper application locally. If you have a cloud instance available, you can deploy it by doing the following: -* Commit and push your application component directory code (i.e., the `my-app` directory) to a Github repo. In this tutorial we started with a clone of the application-template. To commit and push to your own repository, change the origin to your repo: `git remote set-url origin git@github.com:your-account/your-repo.git` -* Go to the applications section of your target cloud instance in the Harper Studio. -* In the left-hand menu of the applications IDE, click 'deploy' and specify a package location reference that follows the [npm package specification](https://docs.npmjs.com/cli/v8/using-npm/package-spec) (i.e., a string like `HarperDB/Application-Template` or a URL like `https://github.com/HarperDB/application-template`, for example, that npm knows how to install). +- Commit and push your application component directory code (i.e., the `my-app` directory) to a Github repo. In this tutorial we started with a clone of the application-template. To commit and push to your own repository, change the origin to your repo: `git remote set-url origin git@github.com:your-account/your-repo.git` +- Go to the applications section of your target cloud instance in the Harper Studio. +- In the left-hand menu of the applications IDE, click 'deploy' and specify a package location reference that follows the [npm package specification](https://docs.npmjs.com/cli/v8/using-npm/package-spec) (i.e., a string like `HarperDB/Application-Template` or a URL like `https://github.com/HarperDB/application-template`, for example, that npm knows how to install). You can also deploy your application from your repository by directly using the [`deploy_component` operation](../operations-api/components#deploy-component). @@ -294,8 +294,7 @@ Here we have focused on customizing how we retrieve data, but we may also want t ```javascript export class CustomDog extends Dog { async post(data) { - if (data.action === 'add-trick') - this.tricks.push(data.trick); + if (data.action === 'add-trick') this.tricks.push(data.trick); } } ``` @@ -332,9 +331,10 @@ We can also directly implement the Resource class and use it to create new data ```javascript const { Breed } = tables; // our Breed table -class BreedSource extends Resource { // define a data source +class BreedSource extends Resource { + // define a data source async get() { - return (await fetch(`https://best-dog-site.com/${this.getId()}`)).json(); + return (await fetch(`https://best-dog-site.com/${this.getId()}`)).json(); } } // define that our breed table is a cache of data from the data source above, with a specified expiration @@ -353,10 +353,10 @@ This config file allows you define a location for static files, as well (that ar Each configuration entry can have the following properties, in addition to properties that may be specific to the individual component: -* `files`: This specifies the set of files that should be handled the component. This is a glob pattern, so a set of files can be specified like "directory/**". -* `path`: This is the URL path that is handled by this component. -* `root`: This specifies the root directory for mapping file paths to the URLs. For example, if you want all the files in `web/**` to be available in the root URL path via the static handler, you could specify a root of `web`, to indicate that the web directory maps to the root URL path. -* `package`: This is used to specify that this component is a third party package, and can be loaded from the specified package reference (which can be an NPM package, Github reference, URL, etc.). +- `files`: This specifies the set of files that should be handled the component. This is a glob pattern, so a set of files can be specified like "directory/\*\*". +- `path`: This is the URL path that is handled by this component. +- `root`: This specifies the root directory for mapping file paths to the URLs. For example, if you want all the files in `web/**` to be available in the root URL path via the static handler, you could specify a root of `web`, to indicate that the web directory maps to the root URL path. +- `package`: This is used to specify that this component is a third party package, and can be loaded from the specified package reference (which can be an NPM package, Github reference, URL, etc.). ## Define Fastify Routes diff --git a/site/versioned_docs/version-4.4/developers/clustering/certificate-management.md b/site/versioned_docs/version-4.4/developers/clustering/certificate-management.md index 11ff0a6c..43839a4b 100644 --- a/site/versioned_docs/version-4.4/developers/clustering/certificate-management.md +++ b/site/versioned_docs/version-4.4/developers/clustering/certificate-management.md @@ -34,7 +34,7 @@ Since these new certificates can be issued with correct CNs, you should set `ins ### Certificate Requirements -* Certificates must have an `Extended Key Usage` that defines both `TLS Web Server Authentication` and `TLS Web Client Authentication` as these certificates will be used to accept connections from other Harper nodes and to make requests to other Harper nodes. Example: +- Certificates must have an `Extended Key Usage` that defines both `TLS Web Server Authentication` and `TLS Web Client Authentication` as these certificates will be used to accept connections from other Harper nodes and to make requests to other Harper nodes. Example: ``` X509v3 Key Usage: critical @@ -43,8 +43,8 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication ``` -* If you are using an intermediate CA to issue the certificates, the entire certificate chain (to the root CA) must be included in the `certificateAuthority` file. -* If your certificates expire you will need a way to issue new certificates to the nodes and then restart Harper. If you are using a public CA such as LetsEncrypt, a tool like `certbot` can be used to renew certificates. +- If you are using an intermediate CA to issue the certificates, the entire certificate chain (to the root CA) must be included in the `certificateAuthority` file. +- If your certificates expire you will need a way to issue new certificates to the nodes and then restart Harper. If you are using a public CA such as LetsEncrypt, a tool like `certbot` can be used to renew certificates. ### Certificate Troubleshooting diff --git a/site/versioned_docs/version-4.4/developers/clustering/creating-a-cluster-user.md b/site/versioned_docs/version-4.4/developers/clustering/creating-a-cluster-user.md index 5569ff04..0a8b2a6c 100644 --- a/site/versioned_docs/version-4.4/developers/clustering/creating-a-cluster-user.md +++ b/site/versioned_docs/version-4.4/developers/clustering/creating-a-cluster-user.md @@ -16,11 +16,11 @@ There are multiple ways a `cluster_user` can be created, they are: ```json { - "operation": "add_user", - "role": "cluster_user", - "username": "cluster_account", - "password": "letsCluster123!", - "active": true + "operation": "add_user", + "role": "cluster_user", + "username": "cluster_account", + "password": "letsCluster123!", + "active": true } ``` @@ -30,8 +30,8 @@ This can be done through the API by calling `set_configuration` or by editing th ```json { - "operation": "set_configuration", - "clustering_user": "cluster_account" + "operation": "set_configuration", + "clustering_user": "cluster_account" } ``` diff --git a/site/versioned_docs/version-4.4/developers/clustering/enabling-clustering.md b/site/versioned_docs/version-4.4/developers/clustering/enabling-clustering.md index 2b80d4e7..606bc29c 100644 --- a/site/versioned_docs/version-4.4/developers/clustering/enabling-clustering.md +++ b/site/versioned_docs/version-4.4/developers/clustering/enabling-clustering.md @@ -23,8 +23,8 @@ _Note: When making any changes to the `harperdb-config.yaml` file Harper must be ```json { - "operation": "set_configuration", - "clustering_enabled": true + "operation": "set_configuration", + "clustering_enabled": true } ``` diff --git a/site/versioned_docs/version-4.4/developers/clustering/establishing-routes.md b/site/versioned_docs/version-4.4/developers/clustering/establishing-routes.md index 894b9e9f..7840a30e 100644 --- a/site/versioned_docs/version-4.4/developers/clustering/establishing-routes.md +++ b/site/versioned_docs/version-4.4/developers/clustering/establishing-routes.md @@ -43,9 +43,9 @@ There are multiple ways to set routes, they are: ```json { - "operation": "cluster_set_routes", - "server": "hub", - "routes":[ {"host": "3.735.184.8", "port": 9932} ] + "operation": "cluster_set_routes", + "server": "hub", + "routes": [{ "host": "3.735.184.8", "port": 9932 }] } ``` @@ -67,7 +67,7 @@ The API also has `cluster_get_routes` for getting all routes in the config and ` ```json { - "operation": "cluster_delete_routes", - "routes":[ {"host": "3.735.184.8", "port": 9932} ] + "operation": "cluster_delete_routes", + "routes": [{ "host": "3.735.184.8", "port": 9932 }] } ``` diff --git a/site/versioned_docs/version-4.4/developers/clustering/index.md b/site/versioned_docs/version-4.4/developers/clustering/index.md index 14556f3c..95c3433c 100644 --- a/site/versioned_docs/version-4.4/developers/clustering/index.md +++ b/site/versioned_docs/version-4.4/developers/clustering/index.md @@ -8,24 +8,24 @@ Harper 4.0 - 4.3 used a clustering system based on NATS for replication. In 4.4+ Harper’s clustering engine replicates data between instances of Harper using a highly performant, bi-directional pub/sub model on a per-table basis. Data replicates asynchronously with eventual consistency across the cluster following the defined pub/sub configuration. Individual transactions are sent in the order in which they were transacted, once received by the destination instance, they are processed in an ACID-compliant manner. Conflict resolution follows a last writer wins model based on recorded transaction time on the transaction and the timestamp on the record on the node. -*** +--- ### Common Use Case A common use case is an edge application collecting and analyzing sensor data that creates an alert if a sensor value exceeds a given threshold: -* The edge application should not be making outbound http requests for security purposes. -* There may not be a reliable network connection. -* Not all sensor data will be sent to the cloud--either because of the unreliable network connection, or maybe it’s just a pain to store it. -* The edge node should be inaccessible from outside the firewall. -* The edge node will send alerts to the cloud with a snippet of sensor data containing the offending sensor readings. +- The edge application should not be making outbound http requests for security purposes. +- There may not be a reliable network connection. +- Not all sensor data will be sent to the cloud--either because of the unreliable network connection, or maybe it’s just a pain to store it. +- The edge node should be inaccessible from outside the firewall. +- The edge node will send alerts to the cloud with a snippet of sensor data containing the offending sensor readings. Harper simplifies the architecture of such an application with its bi-directional, table-level replication: -* The edge instance subscribes to a “thresholds” table on the cloud instance, so the application only makes localhost calls to get the thresholds. -* The application continually pushes sensor data into a “sensor\_data” table via the localhost API, comparing it to the threshold values as it does so. -* When a threshold violation occurs, the application adds a record to the “alerts” table. -* The application appends to that record array “sensor\_data” entries for the 60 seconds (or minutes, or days) leading up to the threshold violation. -* The edge instance publishes the “alerts” table up to the cloud instance. +- The edge instance subscribes to a “thresholds” table on the cloud instance, so the application only makes localhost calls to get the thresholds. +- The application continually pushes sensor data into a “sensor_data” table via the localhost API, comparing it to the threshold values as it does so. +- When a threshold violation occurs, the application adds a record to the “alerts” table. +- The application appends to that record array “sensor_data” entries for the 60 seconds (or minutes, or days) leading up to the threshold violation. +- The edge instance publishes the “alerts” table up to the cloud instance. By letting Harper focus on the fault-tolerant logistics of transporting your data, you get to write less code. By moving data only when and where it’s needed, you lower storage and bandwidth costs. And by restricting your app to only making local calls to Harper, you reduce the overall exposure of your application to outside forces. diff --git a/site/versioned_docs/version-4.4/developers/clustering/managing-subscriptions.md b/site/versioned_docs/version-4.4/developers/clustering/managing-subscriptions.md index 8d2cafef..f043c9d1 100644 --- a/site/versioned_docs/version-4.4/developers/clustering/managing-subscriptions.md +++ b/site/versioned_docs/version-4.4/developers/clustering/managing-subscriptions.md @@ -4,12 +4,14 @@ title: Managing subscriptions Tables are replicated when the table is designated as replicating and there is subscription between the nodes. Tables designated as replicating by default, but can be changed by setting `replicate` to `false` in the table definition: + ```graphql type Product @table(replicate: false) { - id: ID! - name: String! + id: ID! + name: String! } ``` + Or in your harperdb-config.yaml, you can set the default replication behavior for databases, and indicate which databases should be replicated by default: @@ -17,22 +19,20 @@ should be replicated by default: replication: databases: data ``` + If a table is not in the list of databases to be replicated, it will not be replicated unless the table is specifically set to replicate: ```graphql type Product @table(replicate: true) { - id: ID! - name: String! + id: ID! + name: String! } ``` -Reading hdb_nodes (what we do _to_ the node, not what the node does). +Reading hdb*nodes (what we do \_to* the node, not what the node does). The subscription can be set to publish, subscribe, or both. - - - # Managing subscriptions Subscriptions can be added, updated, or removed through the API. @@ -43,22 +43,22 @@ To add a single node and create one or more subscriptions use `set_node_replicat ```json { - "operation": "set_node_replication", - "node_name": "Node2", - "subscriptions": [ - { - "database": "data", - "table": "dog", - "publish": false, - "subscribe": true - }, - { - "database": "data", - "table": "chicken", - "publish": true, - "subscribe": true - } - ] + "operation": "set_node_replication", + "node_name": "Node2", + "subscriptions": [ + { + "database": "data", + "table": "dog", + "publish": false, + "subscribe": true + }, + { + "database": "data", + "table": "chicken", + "publish": true, + "subscribe": true + } + ] } ``` @@ -68,16 +68,16 @@ To update one or more subscriptions with a single node you can also use `set_nod ```json { - "operation": "set_node_replication", - "node_name": "Node2", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ] + "operation": "set_node_replication", + "node_name": "Node2", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ] } ``` @@ -87,37 +87,37 @@ To add or update subscriptions with one or more nodes in one API call use `confi ```json { - "operation": "configure_cluster", - "connections": [ - { - "node_name": "Node2", - "subscriptions": [ - { - "database": "dev", - "table": "chicken", - "publish": false, - "subscribe": true - }, - { - "database": "prod", - "table": "dog", - "publish": true, - "subscribe": true - } - ] - }, - { - "node_name": "Node3", - "subscriptions": [ - { - "database": "dev", - "table": "chicken", - "publish": true, - "subscribe": false - } - ] - } - ] + "operation": "configure_cluster", + "connections": [ + { + "node_name": "Node2", + "subscriptions": [ + { + "database": "dev", + "table": "chicken", + "publish": false, + "subscribe": true + }, + { + "database": "prod", + "table": "dog", + "publish": true, + "subscribe": true + } + ] + }, + { + "node_name": "Node3", + "subscriptions": [ + { + "database": "dev", + "table": "chicken", + "publish": true, + "subscribe": false + } + ] + } + ] } ``` @@ -131,17 +131,17 @@ There is an optional property called `start_time` that can be passed in the subs ```json { - "operation": "set_node_replication", - "node_name": "Node2", - "subscriptions": [ - { - "database": "dev", - "table": "dog", - "publish": false, - "subscribe": true, - "start_time": "2022-09-02T20:06:35.993Z" - } - ] + "operation": "set_node_replication", + "node_name": "Node2", + "subscriptions": [ + { + "database": "dev", + "table": "dog", + "publish": false, + "subscribe": true, + "start_time": "2022-09-02T20:06:35.993Z" + } + ] } ``` @@ -157,8 +157,8 @@ To remove a node and all its subscriptions use `remove_node`. ```json { - "operation":"remove_node", - "node_name":"Node2" + "operation": "remove_node", + "node_name": "Node2" } ``` @@ -168,32 +168,32 @@ To get the status of all connected nodes and see their subscriptions use `cluste ```json { - "node_name": "Node1", - "is_enabled": true, - "connections": [ - { - "node_name": "Node2", - "status": "open", - "ports": { - "clustering": 9932, - "operations_api": 9925 - }, - "latency_ms": 65, - "uptime": "11m 19s", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ], - "system_info": { - "hdb_version": "4.0.0", - "node_version": "16.17.1", - "platform": "linux" - } - } - ] + "node_name": "Node1", + "is_enabled": true, + "connections": [ + { + "node_name": "Node2", + "status": "open", + "ports": { + "clustering": 9932, + "operations_api": 9925 + }, + "latency_ms": 65, + "uptime": "11m 19s", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ], + "system_info": { + "hdb_version": "4.0.0", + "node_version": "16.17.1", + "platform": "linux" + } + } + ] } ``` diff --git a/site/versioned_docs/version-4.4/developers/clustering/naming-a-node.md b/site/versioned_docs/version-4.4/developers/clustering/naming-a-node.md index 67ac2c49..7a512efb 100644 --- a/site/versioned_docs/version-4.4/developers/clustering/naming-a-node.md +++ b/site/versioned_docs/version-4.4/developers/clustering/naming-a-node.md @@ -27,8 +27,8 @@ _Note: When making any changes to the `harperdb-config.yaml` file Harper must be ```json { - "operation": "set_configuration", - "clustering_nodeName":"Node1" + "operation": "set_configuration", + "clustering_nodeName": "Node1" } ``` diff --git a/site/versioned_docs/version-4.4/developers/clustering/subscription-overview.md b/site/versioned_docs/version-4.4/developers/clustering/subscription-overview.md index 7b478fdf..66b013db 100644 --- a/site/versioned_docs/version-4.4/developers/clustering/subscription-overview.md +++ b/site/versioned_docs/version-4.4/developers/clustering/subscription-overview.md @@ -10,7 +10,7 @@ _Note: ‘local’ and ‘remote’ will often be referred to. In the context of A subscription consists of: -`database` - the name of the database that the table you are creating the subscription for belongs to. *Note, this was previously referred to as schema and may occasionally still be referenced that way.* +`database` - the name of the database that the table you are creating the subscription for belongs to. _Note, this was previously referred to as schema and may occasionally still be referenced that way._ `table` - the name of the table the subscription will apply to. diff --git a/site/versioned_docs/version-4.4/developers/clustering/things-worth-knowing.md b/site/versioned_docs/version-4.4/developers/clustering/things-worth-knowing.md index f378dfd9..3e976ef6 100644 --- a/site/versioned_docs/version-4.4/developers/clustering/things-worth-knowing.md +++ b/site/versioned_docs/version-4.4/developers/clustering/things-worth-knowing.md @@ -6,21 +6,21 @@ title: Things Worth Knowing Additional information that will help you define your clustering topology. -*** +--- ### Transactions Transactions that are replicated across the cluster are: -* Insert -* Update -* Upsert -* Delete -* Bulk loads - * CSV data load - * CSV file load - * CSV URL load - * Import from S3 +- Insert +- Update +- Upsert +- Delete +- Bulk loads + - CSV data load + - CSV file load + - CSV URL load + - Import from S3 When adding or updating a node any databases and tables in the subscription that don’t exist on the remote node will be automatically created. @@ -28,13 +28,13 @@ When adding or updating a node any databases and tables in the subscription that Users and roles are not replicated across the cluster. -*** +--- ### Queueing Harper has built-in resiliency for when network connectivity is lost within a subscription. When connections are reestablished, a catchup routine is executed to ensure data that was missed, specific to the subscription, is sent/received as defined. -*** +--- ### Topologies diff --git a/site/versioned_docs/version-4.4/developers/components/built-in.md b/site/versioned_docs/version-4.4/developers/components/built-in.md index 274d6ab5..3743e8c4 100644 --- a/site/versioned_docs/version-4.4/developers/components/built-in.md +++ b/site/versioned_docs/version-4.4/developers/components/built-in.md @@ -6,14 +6,14 @@ title: Built-In Components Harper provides extended features using built-in components. They do **not** need to be installed with a package manager, and simply must be specified in a config to run. These are used throughout many Harper docs, guides, and examples. Unlike external components which have their own semantic versions, built-in components follow Harper's semantic version. -* [Built-In Components](./built-in#built-in-components) - * [fastifyRoutes](./built-in#fastifyroutes) - * [graphql](./built-in#graphql) - * [graphqlSchema](./built-in#graphqlschema) - * [jsResource](./built-in#jsresource) - * [rest](./built-in#rest) - * [roles](./built-in#roles) - * [static](./built-in#static) +- [Built-In Components](./built-in#built-in-components) + - [fastifyRoutes](./built-in#fastifyroutes) + - [graphql](./built-in#graphql) + - [graphqlSchema](./built-in#graphqlschema) + - [jsResource](./built-in#jsresource) + - [rest](./built-in#rest) + - [roles](./built-in#roles) + - [static](./built-in#static) ## fastifyRoutes diff --git a/site/versioned_docs/version-4.4/developers/components/managing.md b/site/versioned_docs/version-4.4/developers/components/managing.md index 5acf800c..ced912a3 100644 --- a/site/versioned_docs/version-4.4/developers/components/managing.md +++ b/site/versioned_docs/version-4.4/developers/components/managing.md @@ -31,21 +31,21 @@ Alternatively, to mimic interfacing with a hosted Harper instance, use operation 1. Start up Harper with `harperdb` 1. _Deploy_ the component to the local instance by executing: - ```sh - harperdb deploy_component \ - project= \ - package= \ - restart=true - ``` - - * Make sure to omit the `target` option so that it _deploys_ to the Harper instance running locally - * The `package=` option creates a symlink to the component simplifying restarts - * By default, the `deploy_component` operation command will _deploy_ the current directory by packaging it up and streaming the bytes. By specifying `package`, it skips this and references the file path directly - * The `restart=true` option automatically restarts Harper threads after the component is deployed - * If set to `'rolling'`, a rolling restart will be triggered after the component is deployed + ```sh + harperdb deploy_component \ + project= \ + package= \ + restart=true + ``` + - Make sure to omit the `target` option so that it _deploys_ to the Harper instance running locally + - The `package=` option creates a symlink to the component simplifying restarts + - By default, the `deploy_component` operation command will _deploy_ the current directory by packaging it up and streaming the bytes. By specifying `package`, it skips this and references the file path directly + - The `restart=true` option automatically restarts Harper threads after the component is deployed + - If set to `'rolling'`, a rolling restart will be triggered after the component is deployed + 1. In another terminal, use the `harperdb restart` command to restart the instance's threads at any time - * With `package=`, the component source is symlinked so changes will automatically be picked up between restarts - * If `package` was omitted, run the `deploy_component` command again with any new changes + - With `package=`, the component source is symlinked so changes will automatically be picked up between restarts + - If `package` was omitted, run the `deploy_component` command again with any new changes 1. To remove the component use `harperdb drop_component project=` Similar to the previous section, if the main thread needs to be restarted, start and stop the Harper instance manually (with the component deployed). Upon Harper startup, the component will automatically be loaded and executed across all threads. @@ -103,11 +103,11 @@ A local component can be deployed to a remote instance by **omitting** the `pack Furthermore, the `package` field can be set to any valid [npm dependency value](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#dependencies). -* For components deployed to npm, specify the package name: `package="@harperdb/status-check"` -* For components on GitHub, specify the URL: `package="https://github.com/HarperDB/status-check"`, or the shorthand `package=HarperDB/status-check` -* Private repositories also work if the correct SSH keys are on the server: `package="git+ssh:/git@github.com:HarperDB/secret-component.git"` - * Reference the [SSH Key](../operations-api/components#add-ssh-key) operations for more information on managing SSH keys on a remote instance -* Even tarball URLs are supported: `package="https://example.com/component.tar.gz"` +- For components deployed to npm, specify the package name: `package="@harperdb/status-check"` +- For components on GitHub, specify the URL: `package="https://github.com/HarperDB/status-check"`, or the shorthand `package=HarperDB/status-check` +- Private repositories also work if the correct SSH keys are on the server: `package="git+ssh:/git@github.com:HarperDB/secret-component.git"` + - Reference the [SSH Key](../operations-api/components#add-ssh-key) operations for more information on managing SSH keys on a remote instance +- Even tarball URLs are supported: `package="https://example.com/component.tar.gz"` > When using git tags, we highly recommend that you use the semver directive to ensure consistent and reliable installation by npm. In addition to tags, you can also reference branches or commit numbers. @@ -133,7 +133,7 @@ The configuration is very similar to that of `config.yaml`. Entries are comprise ```yaml status-check: - package: "@harperdb/status-check" + package: '@harperdb/status-check' ``` The key difference between this and a component's `config.yaml` is that the name does **not** need to be associated with a `package.json` dependency. When Harper starts up, it transforms these configurations into a `package.json` file, and then executes a form of `npm install`. Thus, the `package: ` can be any valid dependency syntax such as npm packages, GitHub repos, tarballs, and local directories are all supported. @@ -142,7 +142,7 @@ Given a root config like: ```yaml myGithubComponent: - package: HarperDB-Add-Ons/package#v2.2.0 # install from GitHub + package: HarperDB-Add-Ons/package#v2.2.0 # install from GitHub myNPMComponent: package: harperdb # install from npm myTarBall: @@ -157,13 +157,13 @@ Harper will generate a `package.json` like: ```json { - "dependencies": { - "myGithubComponent": "github:HarperDB-Add-Ons/package#v2.2.0", - "myNPMComponent": "npm:harperdb", - "myTarBall": "file:/Users/harper/cool-component.tar", - "myLocal": "file:/Users/harper/local", - "myWebsite": "https://harperdb-component" - } + "dependencies": { + "myGithubComponent": "github:HarperDB-Add-Ons/package#v2.2.0", + "myNPMComponent": "npm:harperdb", + "myTarBall": "file:/Users/harper/cool-component.tar", + "myLocal": "file:/Users/harper/local", + "myWebsite": "https://harperdb-component" + } } ``` diff --git a/site/versioned_docs/version-4.4/developers/components/reference.md b/site/versioned_docs/version-4.4/developers/components/reference.md index 002258eb..4b709f86 100644 --- a/site/versioned_docs/version-4.4/developers/components/reference.md +++ b/site/versioned_docs/version-4.4/developers/components/reference.md @@ -40,9 +40,9 @@ Any custom component **must** be configured with the `package` option in order f ```json { - "dependencies": { - "@harperdb/nextjs": "^1.0.0" - } + "dependencies": { + "@harperdb/nextjs": "^1.0.0" + } } ``` @@ -58,9 +58,9 @@ Since npm allows for a [variety of dependency configurations](https://docs.npmjs ```json { - "dependencies": { - "harper-nextjs-test-feature": "HarperDB/nextjs#test-feature" - } + "dependencies": { + "harper-nextjs-test-feature": "HarperDB/nextjs#test-feature" + } } ``` @@ -129,9 +129,9 @@ Other than their execution behavior, the `handleFile()` and `setupFile()` method Any [Resource Extension](#resource-extension) can be configured with the `files`, `path`, and `root` options. These options control how _files_ and _directories_ are resolved in order to be passed to the extension's `handleFile()`, `setupFile()`, `handleDirectory()`, and `setupDirectory()` methods. -- **files** - `string` - *required* - Specifies the set of files and directories that should be handled by the component. Can be a glob pattern. -- **path** - `string` - *optional* - Specifies the URL path to be handled by the component. -- **root** - `string` - *optional* - Specifies the root directory for mapping file paths to the URLs. +- **files** - `string` - _required_ - Specifies the set of files and directories that should be handled by the component. Can be a glob pattern. +- **path** - `string` - _optional_ - Specifies the URL path to be handled by the component. +- **root** - `string` - _optional_ - Specifies the root directory for mapping file paths to the URLs. For example, to configure the [static](./built-in#static) component to server all files from `web` to the root URL path: @@ -161,28 +161,29 @@ export function setupDirectory() {} function handleDirectory() {} function setupFile() {} -module.exports = { handleDirectory, setupFile } +module.exports = { handleDirectory, setupFile }; ``` When returned by a [Protocol Extension](#protocol-extension), these methods should be defined on the object instead: ```js export function start() { - return { - handleFile () {} - } + return { + handleFile() {}, + }; } ``` ##### `handleFile(contents, urlPath, path, resources): void | Promise` + ##### `setupFile(contents, urlPath, path, resources): void | Promise` These methods are for processing individual files. They can be async. > Remember! -> +> > `setupFile()` is executed **once** on the **main thread** during the main start sequence. -> +> > `handleFile()` is executed on **worker threads** and is executed again during restarts. Parameters: @@ -196,6 +197,7 @@ Parameters: Returns: `void | Promise` ##### `handleDirectory(urlPath, path, resources): boolean | void | Promise` + ##### `setupDirectory(urlPath, path, resources): boolean | void | Promise` These methods are for processing directories. They can be async. @@ -203,9 +205,9 @@ These methods are for processing directories. They can be async. If the function returns or resolves a truthy value, then the component loading sequence will end and no other entries within the directory will be processed. > Remember! -> +> > `setupFile()` is executed **once** on the **main thread** during the main start sequence. -> +> > `handleFile()` is executed on **worker threads** and is executed again during restarts. Parameters: @@ -242,6 +244,7 @@ Many protocol extensions will use the `port` and `securePort` options for config A Protocol Extension is made up of two distinct methods, [`start()`](#startoptions-resourceextension--promiseresourceextension) and [`startOnMainThread()`](#startonmainthreadoptions-resourceextension--promiseresourceextension). Similar to a Resource Extension, the `start()` method is executed on _all worker threads_, and _executed again on restarts_. The `startOnMainThread()` method is **only** executed **once** during the initial system start sequence. These methods have identical `options` object parameter, and can both return a Resource Extension (i.e. an object containing one or more of the methods listed above). ##### `start(options): ResourceExtension | Promise` + ##### `startOnMainThread(options): ResourceExtension | Promise` Parameters: diff --git a/site/versioned_docs/version-4.4/developers/miscellaneous/google-data-studio.md b/site/versioned_docs/version-4.4/developers/miscellaneous/google-data-studio.md index 53236fea..02fea100 100644 --- a/site/versioned_docs/version-4.4/developers/miscellaneous/google-data-studio.md +++ b/site/versioned_docs/version-4.4/developers/miscellaneous/google-data-studio.md @@ -23,15 +23,15 @@ Get started by selecting the Harper connector from the [Google Data Studio Partn 1. Check the box for “Secure Connections Only” if you want to always use HTTPS connections for this data source; entering a Web URL that starts with https:// will do the same thing, if you prefer. 1. Check the box for “Allow Bad Certs” if your Harper instance does not have a valid SSL certificate. [Harper Cloud](../../deployments/harper-cloud/) always has valid certificates, and so will never require this to be checked. Instances you set up yourself may require this, if you are using self-signed certs. If you are using [Harper Cloud](../../deployments/harper-cloud/) or another instance you know should always have valid SSL certificates, do not check this box. 1. Choose your Query Type. This determines what information the configuration will ask for after pressing the Next button. - * Table will ask you for a Schema and a Table to return all fields of using `SELECT *`. - * SQL will ask you for the SQL query you’re using to retrieve fields from the database. You may `JOIN` multiple tables together, and use Harper specific SQL functions, along with the usual power SQL grants. + - Table will ask you for a Schema and a Table to return all fields of using `SELECT *`. + - SQL will ask you for the SQL query you’re using to retrieve fields from the database. You may `JOIN` multiple tables together, and use Harper specific SQL functions, along with the usual power SQL grants. 1. When all information is entered correctly, press the Connect button in the top right of the new Data Source view to generate the Schema. You may also want to name the data source at this point. If the connector encounters any errors, a dialog box will tell you what went wrong so you can correct the issue. 1. If there are no errors, you now have a data source you can use in your reports! You may change the types of the generated fields in the Schema view if you need to (for instance, changing a Number field to a specific currency), as well as creating new fields from the report view that do calculations on other fields. ## Considerations -* Both Postman and the [Harper Studio](../../deployments/harper-cloud/) app have ways to convert a user:password pair to a Basic Auth token. Use either to create the token for the connector’s user. - * You may sign out of your current user by going to the instances tab in Harper Studio, then clicking on the lock icon at the top-right of a given instance’s box. Click the lock again to sign in as any user. The Basic Auth token will be visible in the Authorization header portion of any code created in the Sample Code tab. -* It’s highly recommended that you create a read-only user role in Harper Studio, and create a user with that role for your data sources to use. This prevents that authorization token from being used to alter your database, should someone else ever get ahold of it. -* The RecordCount field is intended for use as a metric, for counting how many instances of a given set of values appear in a report’s data set. -* _Do not attempt to create fields with spaces in their names_ for any data sources! Google Data Studio will crash when attempting to retrieve a field with such a name, producing a System Error instead of a useful chart on your reports. Using CamelCase or snake\_case gets around this. +- Both Postman and the [Harper Studio](../../deployments/harper-cloud/) app have ways to convert a user:password pair to a Basic Auth token. Use either to create the token for the connector’s user. + - You may sign out of your current user by going to the instances tab in Harper Studio, then clicking on the lock icon at the top-right of a given instance’s box. Click the lock again to sign in as any user. The Basic Auth token will be visible in the Authorization header portion of any code created in the Sample Code tab. +- It’s highly recommended that you create a read-only user role in Harper Studio, and create a user with that role for your data sources to use. This prevents that authorization token from being used to alter your database, should someone else ever get ahold of it. +- The RecordCount field is intended for use as a metric, for counting how many instances of a given set of values appear in a report’s data set. +- _Do not attempt to create fields with spaces in their names_ for any data sources! Google Data Studio will crash when attempting to retrieve a field with such a name, producing a System Error instead of a useful chart on your reports. Using CamelCase or snake_case gets around this. diff --git a/site/versioned_docs/version-4.4/developers/miscellaneous/index.md b/site/versioned_docs/version-4.4/developers/miscellaneous/index.md index 13ee450a..f80dc499 100644 --- a/site/versioned_docs/version-4.4/developers/miscellaneous/index.md +++ b/site/versioned_docs/version-4.4/developers/miscellaneous/index.md @@ -4,4 +4,4 @@ title: Miscellaneous # Miscellaneous -This section covers a grouping of reference documents for various external developer tools, packages, SDKs, etc. \ No newline at end of file +This section covers a grouping of reference documents for various external developer tools, packages, SDKs, etc. diff --git a/site/versioned_docs/version-4.4/developers/miscellaneous/query-optimization.md b/site/versioned_docs/version-4.4/developers/miscellaneous/query-optimization.md index 4a2dbc6c..139b862b 100644 --- a/site/versioned_docs/version-4.4/developers/miscellaneous/query-optimization.md +++ b/site/versioned_docs/version-4.4/developers/miscellaneous/query-optimization.md @@ -28,10 +28,10 @@ Conditions can be applied to primary key fields or other indexed fields (known a Harper supports relationships between tables, allowing for "join" queries that. This does result in more complex queries with potentially larger performance overhead, as more lookups are necessary to connect matched or selected data with other tables. Similar principles apply to conditions which use relationships. Indexed fields and comparators that leverage the ordering are still valuable for performance. It is also important that if a condition on a table is connected to another table's foreign key, that that foreign key also be indexed. Likewise, if a query `select`s data from a related table that uses a foreign key to relate, that it is indexed. The same principles of higher cardinality applies here as well, more unique values allow for efficient lookups. - ### Sorting + Queries can also specify a sort order. This can also significantly impact performance. If a query specifies a sort order on an indexed field, the database can use the index to quickly retrieve the data in the specified order. A sort order can be used in conjunction with a condition on the same (indexed) field can utilize the index for ordering. However, if the sort order is not on an indexed field, or the query specifies conditions on different fields, Harper will generally need to sort the data after retrieving it, which can be slow for large datasets. The same principles apply to sorting as they do to conditions. Sorting on a primary key is generally faster than sorting on a secondary index, if the condition aligns with the sort order. ### Streaming -One of the unique and powerful features of Harper's querying functionality is the ability to stream query results. When possible, Harper can return records from a query as they are found, rather than waiting for the entire query to complete. This can significantly improve performance for large queries, as it allows the application to start processing results or sending the initial data before the entire query is complete (improving time-to-first-byte speed, for example). However, using a sort order on a query with conditions that are not on an aligned index requires that the entire query result be loaded in order to perform the sorting, which defeats the streaming benefits. \ No newline at end of file +One of the unique and powerful features of Harper's querying functionality is the ability to stream query results. When possible, Harper can return records from a query as they are found, rather than waiting for the entire query to complete. This can significantly improve performance for large queries, as it allows the application to start processing results or sending the initial data before the entire query is complete (improving time-to-first-byte speed, for example). However, using a sort order on a query with conditions that are not on an aligned index requires that the entire query result be loaded in order to perform the sorting, which defeats the streaming benefits. diff --git a/site/versioned_docs/version-4.4/developers/miscellaneous/sdks.md b/site/versioned_docs/version-4.4/developers/miscellaneous/sdks.md index 33ec0bed..2397c294 100644 --- a/site/versioned_docs/version-4.4/developers/miscellaneous/sdks.md +++ b/site/versioned_docs/version-4.4/developers/miscellaneous/sdks.md @@ -7,15 +7,15 @@ description: >- # SDKs -| SDK/Tool | Description | Installation | -| ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------- | -| [HarperDB.NET.Client](https://www.nuget.org/packages/HarperDB.NET.Client) | A Dot Net Core client to execute operations against HarperDB | `dotnet add package HarperDB.NET.Client --version 1.1.0` | -| [Websocket Client](https://www.npmjs.com/package/harperdb-websocket-client) | A Javascript client for real-time access to HarperDB transactions | `npm i -s harperdb-websocket-client` | +| SDK/Tool | Description | Installation | +| ------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | +| [HarperDB.NET.Client](https://www.nuget.org/packages/HarperDB.NET.Client) | A Dot Net Core client to execute operations against HarperDB | `dotnet add package HarperDB.NET.Client --version 1.1.0` | +| [Websocket Client](https://www.npmjs.com/package/harperdb-websocket-client) | A Javascript client for real-time access to HarperDB transactions | `npm i -s harperdb-websocket-client` | | [Gatsby HarperDB Source](https://www.npmjs.com/package/gatsby-source-harperdb) | Use Harper as the data source for a Gatsby project at the build time | `npm i -s gatsby-source-harperdb` | | [HarperDB.EntityFrameworkCore](https://www.nuget.org/packages/HarperDB.EntityFrameworkCore) | The Harper EntityFrameworkCore Provider Package for .NET 6.0 | `dotnet add package HarperDB.EntityFrameworkCore --version 1.0.0` | | [Python SDK](https://pypi.org/project/harperdb/) | Python3 implementations of Harper API functions with wrappers for an object-oriented interface | `pip3 install harperdb` | | [HarperDB Flutter SDK](https://github.com/HarperDB/harperdb-sdk-flutter) | A Harper SDK for Flutter | `flutter pub add harperdb` | -| [React Hook](https://www.npmjs.com/package/use-harperdb) | A ReactJS Hook for HarperDB | `npm i -s use-harperdb` | +| [React Hook](https://www.npmjs.com/package/use-harperdb) | A ReactJS Hook for HarperDB | `npm i -s use-harperdb` | | [Node Red Node](https://flows.nodered.org/node/node-red-contrib-harperdb) | Easy drag and drop connections to Harper using the Node-Red platform | `npm i -s node-red-contrib-harperdb` | | [NodeJS SDK](https://www.npmjs.com/package/harperive) | A Harper SDK for NodeJS | `npm i -s harperive` | | [HarperDB Cargo Crate](https://crates.io/crates/harperdb) | A Harper SDK for Rust | `Cargo.toml > harperdb = '1.0.0'` | diff --git a/site/versioned_docs/version-4.4/developers/operations-api/advanced-json-sql-examples.md b/site/versioned_docs/version-4.4/developers/operations-api/advanced-json-sql-examples.md index 5b7a2c8e..ec300e2e 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/advanced-json-sql-examples.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/advanced-json-sql-examples.md @@ -1,1780 +1,1775 @@ --- -title: Advanced JSON SQL Examples +title: Advanced JSON SQL Examples --- -# Advanced JSON SQL Examples +# Advanced JSON SQL Examples ## Create movies database + Create a new database called "movies" using the 'create_database' operation. _Note: Creating a database is optional, if one is not created Harper will default to using a database named `data`_ ### Body + ```json { - "operation": "create_database", - "database": "movies" + "operation": "create_database", + "database": "movies" } ``` ### Response: 200 + ```json { - "message": "database 'movies' successfully created" + "message": "database 'movies' successfully created" } ``` --- ## Create movie Table + Creates a new table called "movie" inside the database "movies" using the ‘create_table’ operation. ### Body ```json { - "operation": "create_table", - "database": "movies", - "table": "movie", - "primary_key": "id" + "operation": "create_table", + "database": "movies", + "table": "movie", + "primary_key": "id" } ``` ### Response: 200 + ```json { - "message": "table 'movies.movie' successfully created." + "message": "table 'movies.movie' successfully created." } ``` - --- ## Create credits Table + Creates a new table called "credits" inside the database "movies" using the ‘create_table’ operation. ### Body ```json { - "operation": "create_table", - "database": "movies", - "table": "credits", - "primary_key": "movie_id" + "operation": "create_table", + "database": "movies", + "table": "credits", + "primary_key": "movie_id" } ``` ### Response: 200 + ```json { - "message": "table 'movies.credits' successfully created." + "message": "table 'movies.credits' successfully created." } ``` - --- ## Bulk Insert movie Via CSV + Inserts data from a hosted CSV file into the "movie" table using the 'csv_url_load' operation. ### Body ```json { - "operation": "csv_url_load", - "database": "movies", - "table": "movie", - "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/movie.csv" + "operation": "csv_url_load", + "database": "movies", + "table": "movie", + "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/movie.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 1889eee4-23c1-4945-9bb7-c805fc20726c" + "message": "Starting job with id 1889eee4-23c1-4945-9bb7-c805fc20726c" } ``` - --- ## Bulk Insert credits Via CSV + Inserts data from a hosted CSV file into the "credits" table using the 'csv_url_load' operation. ### Body ```json { - "operation": "csv_url_load", - "database": "movies", - "table": "credits", - "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/credits.csv" + "operation": "csv_url_load", + "database": "movies", + "table": "credits", + "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/credits.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 3a14cd74-67f3-41e9-8ccd-45ffd0addc2c", - "job_id": "3a14cd74-67f3-41e9-8ccd-45ffd0addc2c" + "message": "Starting job with id 3a14cd74-67f3-41e9-8ccd-45ffd0addc2c", + "job_id": "3a14cd74-67f3-41e9-8ccd-45ffd0addc2c" } ``` - --- ## View raw data + In the following example we will be running expressions on the keywords & production_companies attributes, so for context we are displaying what the raw data looks like. ### Body ```json { - "operation": "sql", - "sql": "SELECT title, rank, keywords, production_companies FROM movies.movie ORDER BY rank LIMIT 10" + "operation": "sql", + "sql": "SELECT title, rank, keywords, production_companies FROM movies.movie ORDER BY rank LIMIT 10" } ``` ### Response: 200 + ```json [ - { - "title": "Ad Astra", - "rank": 1, - "keywords": [ - { - "id": 305, - "name": "moon" - }, - { - "id": 697, - "name": "loss of loved one" - }, - { - "id": 839, - "name": "planet mars" - }, - { - "id": 14626, - "name": "astronaut" - }, - { - "id": 157265, - "name": "moon colony" - }, - { - "id": 162429, - "name": "solar system" - }, - { - "id": 240119, - "name": "father son relationship" - }, - { - "id": 244256, - "name": "near future" - }, - { - "id": 257878, - "name": "planet neptune" - }, - { - "id": 260089, - "name": "space walk" - } - ], - "production_companies": [ - { - "id": 490, - "name": "New Regency Productions", - "origin_country": "" - }, - { - "id": 79963, - "name": "Keep Your Head", - "origin_country": "" - }, - { - "id": 73492, - "name": "MadRiver Pictures", - "origin_country": "" - }, - { - "id": 81, - "name": "Plan B Entertainment", - "origin_country": "US" - }, - { - "id": 30666, - "name": "RT Features", - "origin_country": "BR" - }, - { - "id": 30148, - "name": "Bona Film Group", - "origin_country": "CN" - }, - { - "id": 22213, - "name": "TSG Entertainment", - "origin_country": "US" - } - ] - }, - { - "title": "Extraction", - "rank": 2, - "keywords": [ - { - "id": 3070, - "name": "mercenary" - }, - { - "id": 4110, - "name": "mumbai (bombay), india" - }, - { - "id": 9717, - "name": "based on comic" - }, - { - "id": 9730, - "name": "crime boss" - }, - { - "id": 11107, - "name": "rescue mission" - }, - { - "id": 18712, - "name": "based on graphic novel" - }, - { - "id": 265216, - "name": "dhaka (dacca), bangladesh" - } - ], - "production_companies": [ - { - "id": 106544, - "name": "AGBO", - "origin_country": "US" - }, - { - "id": 109172, - "name": "Thematic Entertainment", - "origin_country": "US" - }, - { - "id": 92029, - "name": "TGIM Films", - "origin_country": "US" - } - ] - }, - { - "title": "To the Beat! Back 2 School", - "rank": 3, - "keywords": [ - { - "id": 10873, - "name": "school" - } - ], - "production_companies": [] - }, - { - "title": "Bloodshot", - "rank": 4, - "keywords": [ - { - "id": 2651, - "name": "nanotechnology" - }, - { - "id": 9715, - "name": "superhero" - }, - { - "id": 9717, - "name": "based on comic" - }, - { - "id": 164218, - "name": "psychotronic" - }, - { - "id": 255024, - "name": "shared universe" - }, - { - "id": 258575, - "name": "valiant comics" - } - ], - "production_companies": [ - { - "id": 34, - "name": "Sony Pictures", - "origin_country": "US" - }, - { - "id": 10246, - "name": "Cross Creek Pictures", - "origin_country": "US" - }, - { - "id": 6573, - "name": "Mimran Schur Pictures", - "origin_country": "US" - }, - { - "id": 333, - "name": "Original Film", - "origin_country": "US" - }, - { - "id": 103673, - "name": "The Hideaway Entertainment", - "origin_country": "US" - }, - { - "id": 124335, - "name": "Valiant Entertainment", - "origin_country": "US" - }, - { - "id": 5, - "name": "Columbia Pictures", - "origin_country": "US" - }, - { - "id": 1225, - "name": "One Race", - "origin_country": "US" - }, - { - "id": 30148, - "name": "Bona Film Group", - "origin_country": "CN" - } - ] - }, - { - "title": "The Call of the Wild", - "rank": 5, - "keywords": [ - { - "id": 818, - "name": "based on novel or book" - }, - { - "id": 4542, - "name": "gold rush" - }, - { - "id": 15162, - "name": "dog" - }, - { - "id": 155821, - "name": "sled dogs" - }, - { - "id": 189390, - "name": "yukon" - }, - { - "id": 207928, - "name": "19th century" - }, - { - "id": 259987, - "name": "cgi animation" - }, - { - "id": 263806, - "name": "1890s" - } - ], - "production_companies": [ - { - "id": 787, - "name": "3 Arts Entertainment", - "origin_country": "US" - }, - { - "id": 127928, - "name": "20th Century Studios", - "origin_country": "US" - }, - { - "id": 22213, - "name": "TSG Entertainment", - "origin_country": "US" - } - ] - }, - { - "title": "Sonic the Hedgehog", - "rank": 6, - "keywords": [ - { - "id": 282, - "name": "video game" - }, - { - "id": 6054, - "name": "friendship" - }, - { - "id": 10842, - "name": "good vs evil" - }, - { - "id": 41645, - "name": "based on video game" - }, - { - "id": 167043, - "name": "road movie" - }, - { - "id": 172142, - "name": "farting" - }, - { - "id": 188933, - "name": "bar fight" - }, - { - "id": 226967, - "name": "amistad" - }, - { - "id": 245230, - "name": "live action remake" - }, - { - "id": 258111, - "name": "fantasy" - }, - { - "id": 260223, - "name": "videojuego" - } - ], - "production_companies": [ - { - "id": 333, - "name": "Original Film", - "origin_country": "US" - }, - { - "id": 10644, - "name": "Blur Studios", - "origin_country": "US" - }, - { - "id": 77884, - "name": "Marza Animation Planet", - "origin_country": "JP" - }, - { - "id": 4, - "name": "Paramount", - "origin_country": "US" - }, - { - "id": 113750, - "name": "SEGA", - "origin_country": "JP" - }, - { - "id": 100711, - "name": "DJ2 Entertainment", - "origin_country": "" - }, - { - "id": 24955, - "name": "Paramount Animation", - "origin_country": "US" - } - ] - }, - { - "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", - "rank": 7, - "keywords": [ - { - "id": 849, - "name": "dc comics" - }, - { - "id": 9717, - "name": "based on comic" - }, - { - "id": 187056, - "name": "woman director" - }, - { - "id": 229266, - "name": "dc extended universe" - } - ], - "production_companies": [ - { - "id": 9993, - "name": "DC Entertainment", - "origin_country": "US" - }, - { - "id": 82968, - "name": "LuckyChap Entertainment", - "origin_country": "GB" - }, - { - "id": 103462, - "name": "Kroll & Co Entertainment", - "origin_country": "US" - }, - { - "id": 174, - "name": "Warner Bros. Pictures", - "origin_country": "US" - }, - { - "id": 429, - "name": "DC Comics", - "origin_country": "US" - }, - { - "id": 128064, - "name": "DC Films", - "origin_country": "US" - }, - { - "id": 101831, - "name": "Clubhouse Pictures", - "origin_country": "US" - } - ] - }, - { - "title": "Justice League Dark: Apokolips War", - "rank": 8, - "keywords": [ - { - "id": 849, - "name": "dc comics" - } - ], - "production_companies": [ - { - "id": 2785, - "name": "Warner Bros. Animation", - "origin_country": "US" - }, - { - "id": 9993, - "name": "DC Entertainment", - "origin_country": "US" - }, - { - "id": 429, - "name": "DC Comics", - "origin_country": "US" - } - ] - }, - { - "title": "Parasite", - "rank": 9, - "keywords": [ - { - "id": 1353, - "name": "underground" - }, - { - "id": 5318, - "name": "seoul" - }, - { - "id": 5732, - "name": "birthday party" - }, - { - "id": 5752, - "name": "private lessons" - }, - { - "id": 9866, - "name": "basement" - }, - { - "id": 10453, - "name": "con artist" - }, - { - "id": 11935, - "name": "working class" - }, - { - "id": 12565, - "name": "psychological thriller" - }, - { - "id": 13126, - "name": "limousine driver" - }, - { - "id": 14514, - "name": "class differences" - }, - { - "id": 14864, - "name": "rich poor" - }, - { - "id": 17997, - "name": "housekeeper" - }, - { - "id": 18015, - "name": "tutor" - }, - { - "id": 18035, - "name": "family" - }, - { - "id": 33421, - "name": "crime family" - }, - { - "id": 173272, - "name": "flood" - }, - { - "id": 188861, - "name": "smell" - }, - { - "id": 198673, - "name": "unemployed" - }, - { - "id": 237462, - "name": "wealthy family" - } - ], - "production_companies": [ - { - "id": 7036, - "name": "CJ Entertainment", - "origin_country": "KR" - }, - { - "id": 4399, - "name": "Barunson E&A", - "origin_country": "KR" - } - ] - }, - { - "title": "Star Wars: The Rise of Skywalker", - "rank": 10, - "keywords": [ - { - "id": 161176, - "name": "space opera" - } - ], - "production_companies": [ - { - "id": 1, - "name": "Lucasfilm", - "origin_country": "US" - }, - { - "id": 11461, - "name": "Bad Robot", - "origin_country": "US" - }, - { - "id": 2, - "name": "Walt Disney Pictures", - "origin_country": "US" - }, - { - "id": 120404, - "name": "British Film Commission", - "origin_country": "" - } - ] - } + { + "title": "Ad Astra", + "rank": 1, + "keywords": [ + { + "id": 305, + "name": "moon" + }, + { + "id": 697, + "name": "loss of loved one" + }, + { + "id": 839, + "name": "planet mars" + }, + { + "id": 14626, + "name": "astronaut" + }, + { + "id": 157265, + "name": "moon colony" + }, + { + "id": 162429, + "name": "solar system" + }, + { + "id": 240119, + "name": "father son relationship" + }, + { + "id": 244256, + "name": "near future" + }, + { + "id": 257878, + "name": "planet neptune" + }, + { + "id": 260089, + "name": "space walk" + } + ], + "production_companies": [ + { + "id": 490, + "name": "New Regency Productions", + "origin_country": "" + }, + { + "id": 79963, + "name": "Keep Your Head", + "origin_country": "" + }, + { + "id": 73492, + "name": "MadRiver Pictures", + "origin_country": "" + }, + { + "id": 81, + "name": "Plan B Entertainment", + "origin_country": "US" + }, + { + "id": 30666, + "name": "RT Features", + "origin_country": "BR" + }, + { + "id": 30148, + "name": "Bona Film Group", + "origin_country": "CN" + }, + { + "id": 22213, + "name": "TSG Entertainment", + "origin_country": "US" + } + ] + }, + { + "title": "Extraction", + "rank": 2, + "keywords": [ + { + "id": 3070, + "name": "mercenary" + }, + { + "id": 4110, + "name": "mumbai (bombay), india" + }, + { + "id": 9717, + "name": "based on comic" + }, + { + "id": 9730, + "name": "crime boss" + }, + { + "id": 11107, + "name": "rescue mission" + }, + { + "id": 18712, + "name": "based on graphic novel" + }, + { + "id": 265216, + "name": "dhaka (dacca), bangladesh" + } + ], + "production_companies": [ + { + "id": 106544, + "name": "AGBO", + "origin_country": "US" + }, + { + "id": 109172, + "name": "Thematic Entertainment", + "origin_country": "US" + }, + { + "id": 92029, + "name": "TGIM Films", + "origin_country": "US" + } + ] + }, + { + "title": "To the Beat! Back 2 School", + "rank": 3, + "keywords": [ + { + "id": 10873, + "name": "school" + } + ], + "production_companies": [] + }, + { + "title": "Bloodshot", + "rank": 4, + "keywords": [ + { + "id": 2651, + "name": "nanotechnology" + }, + { + "id": 9715, + "name": "superhero" + }, + { + "id": 9717, + "name": "based on comic" + }, + { + "id": 164218, + "name": "psychotronic" + }, + { + "id": 255024, + "name": "shared universe" + }, + { + "id": 258575, + "name": "valiant comics" + } + ], + "production_companies": [ + { + "id": 34, + "name": "Sony Pictures", + "origin_country": "US" + }, + { + "id": 10246, + "name": "Cross Creek Pictures", + "origin_country": "US" + }, + { + "id": 6573, + "name": "Mimran Schur Pictures", + "origin_country": "US" + }, + { + "id": 333, + "name": "Original Film", + "origin_country": "US" + }, + { + "id": 103673, + "name": "The Hideaway Entertainment", + "origin_country": "US" + }, + { + "id": 124335, + "name": "Valiant Entertainment", + "origin_country": "US" + }, + { + "id": 5, + "name": "Columbia Pictures", + "origin_country": "US" + }, + { + "id": 1225, + "name": "One Race", + "origin_country": "US" + }, + { + "id": 30148, + "name": "Bona Film Group", + "origin_country": "CN" + } + ] + }, + { + "title": "The Call of the Wild", + "rank": 5, + "keywords": [ + { + "id": 818, + "name": "based on novel or book" + }, + { + "id": 4542, + "name": "gold rush" + }, + { + "id": 15162, + "name": "dog" + }, + { + "id": 155821, + "name": "sled dogs" + }, + { + "id": 189390, + "name": "yukon" + }, + { + "id": 207928, + "name": "19th century" + }, + { + "id": 259987, + "name": "cgi animation" + }, + { + "id": 263806, + "name": "1890s" + } + ], + "production_companies": [ + { + "id": 787, + "name": "3 Arts Entertainment", + "origin_country": "US" + }, + { + "id": 127928, + "name": "20th Century Studios", + "origin_country": "US" + }, + { + "id": 22213, + "name": "TSG Entertainment", + "origin_country": "US" + } + ] + }, + { + "title": "Sonic the Hedgehog", + "rank": 6, + "keywords": [ + { + "id": 282, + "name": "video game" + }, + { + "id": 6054, + "name": "friendship" + }, + { + "id": 10842, + "name": "good vs evil" + }, + { + "id": 41645, + "name": "based on video game" + }, + { + "id": 167043, + "name": "road movie" + }, + { + "id": 172142, + "name": "farting" + }, + { + "id": 188933, + "name": "bar fight" + }, + { + "id": 226967, + "name": "amistad" + }, + { + "id": 245230, + "name": "live action remake" + }, + { + "id": 258111, + "name": "fantasy" + }, + { + "id": 260223, + "name": "videojuego" + } + ], + "production_companies": [ + { + "id": 333, + "name": "Original Film", + "origin_country": "US" + }, + { + "id": 10644, + "name": "Blur Studios", + "origin_country": "US" + }, + { + "id": 77884, + "name": "Marza Animation Planet", + "origin_country": "JP" + }, + { + "id": 4, + "name": "Paramount", + "origin_country": "US" + }, + { + "id": 113750, + "name": "SEGA", + "origin_country": "JP" + }, + { + "id": 100711, + "name": "DJ2 Entertainment", + "origin_country": "" + }, + { + "id": 24955, + "name": "Paramount Animation", + "origin_country": "US" + } + ] + }, + { + "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", + "rank": 7, + "keywords": [ + { + "id": 849, + "name": "dc comics" + }, + { + "id": 9717, + "name": "based on comic" + }, + { + "id": 187056, + "name": "woman director" + }, + { + "id": 229266, + "name": "dc extended universe" + } + ], + "production_companies": [ + { + "id": 9993, + "name": "DC Entertainment", + "origin_country": "US" + }, + { + "id": 82968, + "name": "LuckyChap Entertainment", + "origin_country": "GB" + }, + { + "id": 103462, + "name": "Kroll & Co Entertainment", + "origin_country": "US" + }, + { + "id": 174, + "name": "Warner Bros. Pictures", + "origin_country": "US" + }, + { + "id": 429, + "name": "DC Comics", + "origin_country": "US" + }, + { + "id": 128064, + "name": "DC Films", + "origin_country": "US" + }, + { + "id": 101831, + "name": "Clubhouse Pictures", + "origin_country": "US" + } + ] + }, + { + "title": "Justice League Dark: Apokolips War", + "rank": 8, + "keywords": [ + { + "id": 849, + "name": "dc comics" + } + ], + "production_companies": [ + { + "id": 2785, + "name": "Warner Bros. Animation", + "origin_country": "US" + }, + { + "id": 9993, + "name": "DC Entertainment", + "origin_country": "US" + }, + { + "id": 429, + "name": "DC Comics", + "origin_country": "US" + } + ] + }, + { + "title": "Parasite", + "rank": 9, + "keywords": [ + { + "id": 1353, + "name": "underground" + }, + { + "id": 5318, + "name": "seoul" + }, + { + "id": 5732, + "name": "birthday party" + }, + { + "id": 5752, + "name": "private lessons" + }, + { + "id": 9866, + "name": "basement" + }, + { + "id": 10453, + "name": "con artist" + }, + { + "id": 11935, + "name": "working class" + }, + { + "id": 12565, + "name": "psychological thriller" + }, + { + "id": 13126, + "name": "limousine driver" + }, + { + "id": 14514, + "name": "class differences" + }, + { + "id": 14864, + "name": "rich poor" + }, + { + "id": 17997, + "name": "housekeeper" + }, + { + "id": 18015, + "name": "tutor" + }, + { + "id": 18035, + "name": "family" + }, + { + "id": 33421, + "name": "crime family" + }, + { + "id": 173272, + "name": "flood" + }, + { + "id": 188861, + "name": "smell" + }, + { + "id": 198673, + "name": "unemployed" + }, + { + "id": 237462, + "name": "wealthy family" + } + ], + "production_companies": [ + { + "id": 7036, + "name": "CJ Entertainment", + "origin_country": "KR" + }, + { + "id": 4399, + "name": "Barunson E&A", + "origin_country": "KR" + } + ] + }, + { + "title": "Star Wars: The Rise of Skywalker", + "rank": 10, + "keywords": [ + { + "id": 161176, + "name": "space opera" + } + ], + "production_companies": [ + { + "id": 1, + "name": "Lucasfilm", + "origin_country": "US" + }, + { + "id": 11461, + "name": "Bad Robot", + "origin_country": "US" + }, + { + "id": 2, + "name": "Walt Disney Pictures", + "origin_country": "US" + }, + { + "id": 120404, + "name": "British Film Commission", + "origin_country": "" + } + ] + } ] ``` - --- ## Simple search_json call -This query uses search_json to convert the keywords object array to a simple string array. The expression '[name]' tells the function to extract all values for the name attribute and wrap them in an array. + +This query uses search_json to convert the keywords object array to a simple string array. The expression '[name]' tells the function to extract all values for the name attribute and wrap them in an array. ### Body ```json { - "operation": "sql", - "sql": "SELECT title, rank, search_json('[name]', keywords) as keywords FROM movies.movie ORDER BY rank LIMIT 10" + "operation": "sql", + "sql": "SELECT title, rank, search_json('[name]', keywords) as keywords FROM movies.movie ORDER BY rank LIMIT 10" } ``` ### Response: 200 + ```json [ - { - "title": "Ad Astra", - "rank": 1, - "keywords": [ - "moon", - "loss of loved one", - "planet mars", - "astronaut", - "moon colony", - "solar system", - "father son relationship", - "near future", - "planet neptune", - "space walk" - ] - }, - { - "title": "Extraction", - "rank": 2, - "keywords": [ - "mercenary", - "mumbai (bombay), india", - "based on comic", - "crime boss", - "rescue mission", - "based on graphic novel", - "dhaka (dacca), bangladesh" - ] - }, - { - "title": "To the Beat! Back 2 School", - "rank": 3, - "keywords": [ - "school" - ] - }, - { - "title": "Bloodshot", - "rank": 4, - "keywords": [ - "nanotechnology", - "superhero", - "based on comic", - "psychotronic", - "shared universe", - "valiant comics" - ] - }, - { - "title": "The Call of the Wild", - "rank": 5, - "keywords": [ - "based on novel or book", - "gold rush", - "dog", - "sled dogs", - "yukon", - "19th century", - "cgi animation", - "1890s" - ] - }, - { - "title": "Sonic the Hedgehog", - "rank": 6, - "keywords": [ - "video game", - "friendship", - "good vs evil", - "based on video game", - "road movie", - "farting", - "bar fight", - "amistad", - "live action remake", - "fantasy", - "videojuego" - ] - }, - { - "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", - "rank": 7, - "keywords": [ - "dc comics", - "based on comic", - "woman director", - "dc extended universe" - ] - }, - { - "title": "Justice League Dark: Apokolips War", - "rank": 8, - "keywords": [ - "dc comics" - ] - }, - { - "title": "Parasite", - "rank": 9, - "keywords": [ - "underground", - "seoul", - "birthday party", - "private lessons", - "basement", - "con artist", - "working class", - "psychological thriller", - "limousine driver", - "class differences", - "rich poor", - "housekeeper", - "tutor", - "family", - "crime family", - "flood", - "smell", - "unemployed", - "wealthy family" - ] - }, - { - "title": "Star Wars: The Rise of Skywalker", - "rank": 10, - "keywords": [ - "space opera" - ] - } + { + "title": "Ad Astra", + "rank": 1, + "keywords": [ + "moon", + "loss of loved one", + "planet mars", + "astronaut", + "moon colony", + "solar system", + "father son relationship", + "near future", + "planet neptune", + "space walk" + ] + }, + { + "title": "Extraction", + "rank": 2, + "keywords": [ + "mercenary", + "mumbai (bombay), india", + "based on comic", + "crime boss", + "rescue mission", + "based on graphic novel", + "dhaka (dacca), bangladesh" + ] + }, + { + "title": "To the Beat! Back 2 School", + "rank": 3, + "keywords": ["school"] + }, + { + "title": "Bloodshot", + "rank": 4, + "keywords": ["nanotechnology", "superhero", "based on comic", "psychotronic", "shared universe", "valiant comics"] + }, + { + "title": "The Call of the Wild", + "rank": 5, + "keywords": [ + "based on novel or book", + "gold rush", + "dog", + "sled dogs", + "yukon", + "19th century", + "cgi animation", + "1890s" + ] + }, + { + "title": "Sonic the Hedgehog", + "rank": 6, + "keywords": [ + "video game", + "friendship", + "good vs evil", + "based on video game", + "road movie", + "farting", + "bar fight", + "amistad", + "live action remake", + "fantasy", + "videojuego" + ] + }, + { + "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", + "rank": 7, + "keywords": ["dc comics", "based on comic", "woman director", "dc extended universe"] + }, + { + "title": "Justice League Dark: Apokolips War", + "rank": 8, + "keywords": ["dc comics"] + }, + { + "title": "Parasite", + "rank": 9, + "keywords": [ + "underground", + "seoul", + "birthday party", + "private lessons", + "basement", + "con artist", + "working class", + "psychological thriller", + "limousine driver", + "class differences", + "rich poor", + "housekeeper", + "tutor", + "family", + "crime family", + "flood", + "smell", + "unemployed", + "wealthy family" + ] + }, + { + "title": "Star Wars: The Rise of Skywalker", + "rank": 10, + "keywords": ["space opera"] + } ] ``` - --- ## Use search_json in a where clause -This example shows how we can use SEARCH_JSON to filter out records in a WHERE clause. The production_companies attribute holds an object array of companies that produced each movie, we want to only see movies which were produced by Marvel Studios. Our expression is a filter '$[name="Marvel Studios"]' this tells the function to iterate the production_companies array and only return entries where the name is "Marvel Studios". + +This example shows how we can use SEARCH_JSON to filter out records in a WHERE clause. The production_companies attribute holds an object array of companies that produced each movie, we want to only see movies which were produced by Marvel Studios. Our expression is a filter '$[name="Marvel Studios"]' this tells the function to iterate the production_companies array and only return entries where the name is "Marvel Studios". ### Body ```json { - "operation": "sql", - "sql": "SELECT title, release_date FROM movies.movie where search_json('$[name=\"Marvel Studios\"]', production_companies) IS NOT NULL ORDER BY release_date" + "operation": "sql", + "sql": "SELECT title, release_date FROM movies.movie where search_json('$[name=\"Marvel Studios\"]', production_companies) IS NOT NULL ORDER BY release_date" } ``` ### Response: 200 + ```json [ - { - "title": "Iron Man", - "release_date": "2008-04-30" - }, - { - "title": "The Incredible Hulk", - "release_date": "2008-06-12" - }, - { - "title": "Iron Man 2", - "release_date": "2010-04-28" - }, - { - "title": "Thor", - "release_date": "2011-04-21" - }, - { - "title": "Captain America: The First Avenger", - "release_date": "2011-07-22" - }, - { - "title": "Marvel One-Shot: The Consultant", - "release_date": "2011-09-12" - }, - { - "title": "Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer", - "release_date": "2011-10-25" - }, - { - "title": "The Avengers", - "release_date": "2012-04-25" - }, - { - "title": "Marvel One-Shot: Item 47", - "release_date": "2012-09-13" - }, - { - "title": "Iron Man 3", - "release_date": "2013-04-18" - }, - { - "title": "Marvel One-Shot: Agent Carter", - "release_date": "2013-09-08" - }, - { - "title": "Thor: The Dark World", - "release_date": "2013-10-29" - }, - { - "title": "Marvel One-Shot: All Hail the King", - "release_date": "2014-02-04" - }, - { - "title": "Marvel Studios: Assembling a Universe", - "release_date": "2014-03-18" - }, - { - "title": "Captain America: The Winter Soldier", - "release_date": "2014-03-20" - }, - { - "title": "Guardians of the Galaxy", - "release_date": "2014-07-30" - }, - { - "title": "Avengers: Age of Ultron", - "release_date": "2015-04-22" - }, - { - "title": "Ant-Man", - "release_date": "2015-07-14" - }, - { - "title": "Captain America: Civil War", - "release_date": "2016-04-27" - }, - { - "title": "Team Thor", - "release_date": "2016-08-28" - }, - { - "title": "Doctor Strange", - "release_date": "2016-10-25" - }, - { - "title": "Guardians of the Galaxy Vol. 2", - "release_date": "2017-04-19" - }, - { - "title": "Spider-Man: Homecoming", - "release_date": "2017-07-05" - }, - { - "title": "Thor: Ragnarok", - "release_date": "2017-10-25" - }, - { - "title": "Black Panther", - "release_date": "2018-02-13" - }, - { - "title": "Avengers: Infinity War", - "release_date": "2018-04-25" - }, - { - "title": "Ant-Man and the Wasp", - "release_date": "2018-07-04" - }, - { - "title": "Captain Marvel", - "release_date": "2019-03-06" - }, - { - "title": "Avengers: Endgame", - "release_date": "2019-04-24" - }, - { - "title": "Spider-Man: Far from Home", - "release_date": "2019-06-28" - }, - { - "title": "Black Widow", - "release_date": "2020-10-28" - }, - { - "title": "Untitled Spider-Man 3", - "release_date": "2021-11-04" - }, - { - "title": "Thor: Love and Thunder", - "release_date": "2022-02-10" - }, - { - "title": "Doctor Strange in the Multiverse of Madness", - "release_date": "2022-03-23" - }, - { - "title": "Untitled Marvel Project (3)", - "release_date": "2022-07-29" - }, - { - "title": "Guardians of the Galaxy Vol. 3", - "release_date": "2023-02-16" - } + { + "title": "Iron Man", + "release_date": "2008-04-30" + }, + { + "title": "The Incredible Hulk", + "release_date": "2008-06-12" + }, + { + "title": "Iron Man 2", + "release_date": "2010-04-28" + }, + { + "title": "Thor", + "release_date": "2011-04-21" + }, + { + "title": "Captain America: The First Avenger", + "release_date": "2011-07-22" + }, + { + "title": "Marvel One-Shot: The Consultant", + "release_date": "2011-09-12" + }, + { + "title": "Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer", + "release_date": "2011-10-25" + }, + { + "title": "The Avengers", + "release_date": "2012-04-25" + }, + { + "title": "Marvel One-Shot: Item 47", + "release_date": "2012-09-13" + }, + { + "title": "Iron Man 3", + "release_date": "2013-04-18" + }, + { + "title": "Marvel One-Shot: Agent Carter", + "release_date": "2013-09-08" + }, + { + "title": "Thor: The Dark World", + "release_date": "2013-10-29" + }, + { + "title": "Marvel One-Shot: All Hail the King", + "release_date": "2014-02-04" + }, + { + "title": "Marvel Studios: Assembling a Universe", + "release_date": "2014-03-18" + }, + { + "title": "Captain America: The Winter Soldier", + "release_date": "2014-03-20" + }, + { + "title": "Guardians of the Galaxy", + "release_date": "2014-07-30" + }, + { + "title": "Avengers: Age of Ultron", + "release_date": "2015-04-22" + }, + { + "title": "Ant-Man", + "release_date": "2015-07-14" + }, + { + "title": "Captain America: Civil War", + "release_date": "2016-04-27" + }, + { + "title": "Team Thor", + "release_date": "2016-08-28" + }, + { + "title": "Doctor Strange", + "release_date": "2016-10-25" + }, + { + "title": "Guardians of the Galaxy Vol. 2", + "release_date": "2017-04-19" + }, + { + "title": "Spider-Man: Homecoming", + "release_date": "2017-07-05" + }, + { + "title": "Thor: Ragnarok", + "release_date": "2017-10-25" + }, + { + "title": "Black Panther", + "release_date": "2018-02-13" + }, + { + "title": "Avengers: Infinity War", + "release_date": "2018-04-25" + }, + { + "title": "Ant-Man and the Wasp", + "release_date": "2018-07-04" + }, + { + "title": "Captain Marvel", + "release_date": "2019-03-06" + }, + { + "title": "Avengers: Endgame", + "release_date": "2019-04-24" + }, + { + "title": "Spider-Man: Far from Home", + "release_date": "2019-06-28" + }, + { + "title": "Black Widow", + "release_date": "2020-10-28" + }, + { + "title": "Untitled Spider-Man 3", + "release_date": "2021-11-04" + }, + { + "title": "Thor: Love and Thunder", + "release_date": "2022-02-10" + }, + { + "title": "Doctor Strange in the Multiverse of Madness", + "release_date": "2022-03-23" + }, + { + "title": "Untitled Marvel Project (3)", + "release_date": "2022-07-29" + }, + { + "title": "Guardians of the Galaxy Vol. 3", + "release_date": "2023-02-16" + } ] ``` - --- ## Use search_json to show the movies with the largest casts -This example shows how we can use SEARCH_JSON to perform a simple calculation on JSON and order by the results. The cast attribute holds an object array of details around the cast of a movie. We use the expression '$count(id)' that counts each id and returns the value back which we alias in SQL as cast_size which in turn gets used to sort the rows. + +This example shows how we can use SEARCH_JSON to perform a simple calculation on JSON and order by the results. The cast attribute holds an object array of details around the cast of a movie. We use the expression '$count(id)' that counts each id and returns the value back which we alias in SQL as cast_size which in turn gets used to sort the rows. ### Body ```json { - "operation": "sql", - "sql": "SELECT movie_title, search_json('$count(id)', `cast`) as cast_size FROM movies.credits ORDER BY cast_size DESC LIMIT 10" + "operation": "sql", + "sql": "SELECT movie_title, search_json('$count(id)', `cast`) as cast_size FROM movies.credits ORDER BY cast_size DESC LIMIT 10" } ``` ### Response: 200 + ```json [ - { - "movie_title": "Around the World in Eighty Days", - "cast_size": 312 - }, - { - "movie_title": "And the Oscar Goes To...", - "cast_size": 259 - }, - { - "movie_title": "Rock of Ages", - "cast_size": 223 - }, - { - "movie_title": "Mr. Smith Goes to Washington", - "cast_size": 213 - }, - { - "movie_title": "Les Misérables", - "cast_size": 208 - }, - { - "movie_title": "Jason Bourne", - "cast_size": 201 - }, - { - "movie_title": "The Muppets", - "cast_size": 191 - }, - { - "movie_title": "You Don't Mess with the Zohan", - "cast_size": 183 - }, - { - "movie_title": "The Irishman", - "cast_size": 173 - }, - { - "movie_title": "Spider-Man: Far from Home", - "cast_size": 173 - } + { + "movie_title": "Around the World in Eighty Days", + "cast_size": 312 + }, + { + "movie_title": "And the Oscar Goes To...", + "cast_size": 259 + }, + { + "movie_title": "Rock of Ages", + "cast_size": 223 + }, + { + "movie_title": "Mr. Smith Goes to Washington", + "cast_size": 213 + }, + { + "movie_title": "Les Misérables", + "cast_size": 208 + }, + { + "movie_title": "Jason Bourne", + "cast_size": 201 + }, + { + "movie_title": "The Muppets", + "cast_size": 191 + }, + { + "movie_title": "You Don't Mess with the Zohan", + "cast_size": 183 + }, + { + "movie_title": "The Irishman", + "cast_size": 173 + }, + { + "movie_title": "Spider-Man: Far from Home", + "cast_size": 173 + } ] ``` - --- ## search_json as a condition, in a select with a table join -This example shows how we can use SEARCH_JSON to find movies where at least of 2 our favorite actors from Marvel films have acted together then list the movie, its overview, release date, and the actors names and their characters. The WHERE clause performs a count on credits.cast attribute that have the matching actors. The SELECT performs the same filter on the cast attribute and performs a transform on each object to just return the actor's name and their character. + +This example shows how we can use SEARCH_JSON to find movies where at least of 2 our favorite actors from Marvel films have acted together then list the movie, its overview, release date, and the actors names and their characters. The WHERE clause performs a count on credits.cast attribute that have the matching actors. The SELECT performs the same filter on the cast attribute and performs a transform on each object to just return the actor's name and their character. ### Body ```json { - "operation": "sql", - "sql": "SELECT m.title, m.overview, m.release_date, search_json('$[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]].{\"actor\": name, \"character\": character}', c.`cast`) as characters FROM movies.credits c INNER JOIN movies.movie m ON c.movie_id = m.id WHERE search_json('$count($[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]])', c.`cast`) >= 2" + "operation": "sql", + "sql": "SELECT m.title, m.overview, m.release_date, search_json('$[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]].{\"actor\": name, \"character\": character}', c.`cast`) as characters FROM movies.credits c INNER JOIN movies.movie m ON c.movie_id = m.id WHERE search_json('$count($[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]])', c.`cast`) >= 2" } ``` ### Response: 200 + ```json [ - { - "title": "Out of Sight", - "overview": "Meet Jack Foley, a smooth criminal who bends the law and is determined to make one last heist. Karen Sisco is a federal marshal who chooses all the right moves … and all the wrong guys. Now they're willing to risk it all to find out if there's more between them than just the law.", - "release_date": "1998-06-26", - "characters": [ - { - "actor": "Don Cheadle", - "character": "Maurice Miller" - }, - { - "actor": "Samuel L. Jackson", - "character": "Hejira Henry (uncredited)" - } - ] - }, - { - "title": "Iron Man", - "overview": "After being held captive in an Afghan cave, billionaire engineer Tony Stark creates a unique weaponized suit of armor to fight evil.", - "release_date": "2008-04-30", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury (uncredited)" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - } - ] - }, - { - "title": "Captain America: The First Avenger", - "overview": "During World War II, Steve Rogers is a sickly man from Brooklyn who's transformed into super-soldier Captain America to aid in the war effort. Rogers must stop the Red Skull – Adolf Hitler's ruthless head of weaponry, and the leader of an organization that intends to use a mysterious device of untold powers for world domination.", - "release_date": "2011-07-22", - "characters": [ - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - } - ] - }, - { - "title": "In Good Company", - "overview": "Dan Foreman is a seasoned advertisement sales executive at a high-ranking publication when a corporate takeover results in him being placed under naive supervisor Carter Duryea, who is half his age. Matters are made worse when Dan's new supervisor becomes romantically involved with his daughter an 18 year-old college student Alex.", - "release_date": "2004-12-29", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Alex Foreman" - }, - { - "actor": "Clark Gregg", - "character": "Mark Steckle" - } - ] - }, - { - "title": "Zodiac", - "overview": "The true story of the investigation of the \"Zodiac Killer\", a serial killer who terrified the San Francisco Bay Area, taunting police with his ciphers and letters. The case becomes an obsession for three men as their lives and careers are built and destroyed by the endless trail of clues.", - "release_date": "2007-03-02", - "characters": [ - { - "actor": "Mark Ruffalo", - "character": "Dave Toschi" - }, - { - "actor": "Robert Downey Jr.", - "character": "Paul Avery" - } - ] - }, - { - "title": "Hard Eight", - "overview": "A stranger mentors a young Reno gambler who weds a hooker and befriends a vulgar casino regular.", - "release_date": "1996-02-28", - "characters": [ - { - "actor": "Gwyneth Paltrow", - "character": "Clementine" - }, - { - "actor": "Samuel L. Jackson", - "character": "Jimmy" - } - ] - }, - { - "title": "The Spirit", - "overview": "Down these mean streets a man must come. A hero born, murdered, and born again. A Rookie cop named Denny Colt returns from the beyond as The Spirit, a hero whose mission is to fight against the bad forces from the shadows of Central City. The Octopus, who kills anyone unfortunate enough to see his face, has other plans; he is going to wipe out the entire city.", - "release_date": "2008-12-25", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Silken Floss" - }, - { - "actor": "Samuel L. Jackson", - "character": "Octopuss" - } - ] - }, - { - "title": "S.W.A.T.", - "overview": "Hondo Harrelson recruits Jim Street to join an elite unit of the Los Angeles Police Department. Together they seek out more members, including tough Deke Kay and single mom Chris Sanchez. The team's first big assignment is to escort crime boss Alex Montel to prison. It seems routine, but when Montel offers a huge reward to anyone who can break him free, criminals of various stripes step up for the prize.", - "release_date": "2003-08-08", - "characters": [ - { - "actor": "Samuel L. Jackson", - "character": "Sgt. Dan 'Hondo' Harrelson" - }, - { - "actor": "Jeremy Renner", - "character": "Brian Gamble" - } - ] - }, - { - "title": "Iron Man 2", - "overview": "With the world now aware of his dual life as the armored superhero Iron Man, billionaire inventor Tony Stark faces pressure from the government, the press and the public to share his technology with the military. Unwilling to let go of his invention, Stark, with Pepper Potts and James 'Rhodey' Rhodes at his side, must forge new alliances – and confront powerful enemies.", - "release_date": "2010-04-28", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - }, - { - "actor": "Scarlett Johansson", - "character": "Natalie Rushman / Natasha Romanoff / Black Widow" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - } - ] - }, - { - "title": "Thor", - "overview": "Against his father Odin's will, The Mighty Thor - a powerful but arrogant warrior god - recklessly reignites an ancient war. Thor is cast down to Earth and forced to live among humans as punishment. Once here, Thor learns what it takes to be a true hero when the most dangerous villain of his world sends the darkest forces of Asgard to invade Earth.", - "release_date": "2011-04-21", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye (uncredited)" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury (uncredited)" - } - ] - }, - { - "title": "View from the Top", - "overview": "A small-town woman tries to achieve her goal of becoming a flight attendant.", - "release_date": "2003-03-21", - "characters": [ - { - "actor": "Gwyneth Paltrow", - "character": "Donna" - }, - { - "actor": "Mark Ruffalo", - "character": "Ted Stewart" - } - ] - }, - { - "title": "The Nanny Diaries", - "overview": "A college graduate goes to work as a nanny for a rich New York family. Ensconced in their home, she has to juggle their dysfunction, a new romance, and the spoiled brat in her charge.", - "release_date": "2007-08-24", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Annie Braddock" - }, - { - "actor": "Chris Evans", - "character": "Hayden \"Harvard Hottie\"" - } - ] - }, - { - "title": "The Perfect Score", - "overview": "Six high school seniors decide to break into the Princeton Testing Center so they can steal the answers to their upcoming SAT tests and all get perfect scores.", - "release_date": "2004-01-30", - "characters": [ - { - "actor": "Chris Evans", - "character": "Kyle" - }, - { - "actor": "Scarlett Johansson", - "character": "Francesca Curtis" - } - ] - }, - { - "title": "The Avengers", - "overview": "When an unexpected enemy emerges and threatens global safety and security, Nick Fury, director of the international peacekeeping agency known as S.H.I.E.L.D., finds himself in need of a team to pull the world back from the brink of disaster. Spanning the globe, a daring recruitment effort begins!", - "release_date": "2012-04-25", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - } - ] - }, - { - "title": "Iron Man 3", - "overview": "When Tony Stark's world is torn apart by a formidable terrorist called the Mandarin, he starts an odyssey of rebuilding and retribution.", - "release_date": "2013-04-18", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / Iron Patriot" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner (uncredited)" - } - ] - }, - { - "title": "Marvel One-Shot: The Consultant", - "overview": "Agent Coulson informs Agent Sitwell that the World Security Council wishes Emil Blonsky to be released from prison to join the Avengers Initiative. As Nick Fury doesn't want to release Blonsky, the two agents decide to send a patsy to sabotage the meeting...", - "release_date": "2011-09-12", - "characters": [ - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark (archive footage)" - } - ] - }, - { - "title": "Thor: The Dark World", - "overview": "Thor fights to restore order across the cosmos… but an ancient race led by the vengeful Malekith returns to plunge the universe back into darkness. Faced with an enemy that even Odin and Asgard cannot withstand, Thor must embark on his most perilous and personal journey yet, one that will reunite him with Jane Foster and force him to sacrifice everything to save us all.", - "release_date": "2013-10-29", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Chris Evans", - "character": "Loki as Captain America (uncredited)" - } - ] - }, - { - "title": "Avengers: Age of Ultron", - "overview": "When Tony Stark tries to jumpstart a dormant peacekeeping program, things go awry and Earth’s Mightiest Heroes are put to the ultimate test as the fate of the planet hangs in the balance. As the villainous Ultron emerges, it is up to The Avengers to stop him from enacting his terrible plans, and soon uneasy alliances and unexpected action pave the way for an epic and unique global adventure.", - "release_date": "2015-04-22", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - } - ] - }, - { - "title": "Captain America: The Winter Soldier", - "overview": "After the cataclysmic events in New York with The Avengers, Steve Rogers, aka Captain America is living quietly in Washington, D.C. and trying to adjust to the modern world. But when a S.H.I.E.L.D. colleague comes under attack, Steve becomes embroiled in a web of intrigue that threatens to put the world at risk. Joining forces with the Black Widow, Captain America struggles to expose the ever-widening conspiracy while fighting off professional assassins sent to silence him at every turn. When the full scope of the villainous plot is revealed, Captain America and the Black Widow enlist the help of a new ally, the Falcon. However, they soon find themselves up against an unexpected and formidable enemy—the Winter Soldier.", - "release_date": "2014-03-20", - "characters": [ - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - } - ] - }, - { - "title": "Thanks for Sharing", - "overview": "A romantic comedy that brings together three disparate characters who are learning to face a challenging and often confusing world as they struggle together against a common demon—sex addiction.", - "release_date": "2013-09-19", - "characters": [ - { - "actor": "Mark Ruffalo", - "character": "Adam" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Phoebe" - } - ] - }, - { - "title": "Chef", - "overview": "When Chef Carl Casper suddenly quits his job at a prominent Los Angeles restaurant after refusing to compromise his creative integrity for its controlling owner, he is left to figure out what's next. Finding himself in Miami, he teams up with his ex-wife, his friend and his son to launch a food truck. Taking to the road, Chef Carl goes back to his roots to reignite his passion for the kitchen -- and zest for life and love.", - "release_date": "2014-05-08", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Molly" - }, - { - "actor": "Robert Downey Jr.", - "character": "Marvin" - } - ] - }, - { - "title": "Marvel Studios: Assembling a Universe", - "overview": "A look at the story behind Marvel Studios and the Marvel Cinematic Universe, featuring interviews and behind-the-scenes footage from all of the Marvel films, the Marvel One-Shots and \"Marvel's Agents of S.H.I.E.L.D.\"", - "release_date": "2014-03-18", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Himself / Tony Stark / Iron Man" - }, - { - "actor": "Chris Hemsworth", - "character": "Himself / Thor" - }, - { - "actor": "Chris Evans", - "character": "Himself / Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Himself / Bruce Banner / Hulk" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Herself" - }, - { - "actor": "Clark Gregg", - "character": "Himself" - }, - { - "actor": "Samuel L. Jackson", - "character": "Himself" - }, - { - "actor": "Scarlett Johansson", - "character": "Herself" - }, - { - "actor": "Jeremy Renner", - "character": "Himself" - } - ] - }, - { - "title": "Captain America: Civil War", - "overview": "Following the events of Age of Ultron, the collective governments of the world pass an act designed to regulate all superhuman activity. This polarizes opinion amongst the Avengers, causing two factions to side with Iron Man or Captain America, which causes an epic battle between former allies.", - "release_date": "2016-04-27", - "characters": [ - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - } - ] - }, - { - "title": "Thor: Ragnarok", - "overview": "Thor is imprisoned on the other side of the universe and finds himself in a race against time to get back to Asgard to stop Ragnarok, the destruction of his home-world and the end of Asgardian civilization, at the hands of an all-powerful new threat, the ruthless Hela.", - "release_date": "2017-10-25", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / Hulk" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow (archive footage / uncredited)" - } - ] - }, - { - "title": "Avengers: Endgame", - "overview": "After the devastating events of Avengers: Infinity War, the universe is in ruins due to the efforts of the Mad Titan, Thanos. With the help of remaining allies, the Avengers must assemble once more in order to undo Thanos' actions and restore order to the universe once and for all, no matter what consequences may be in store.", - "release_date": "2019-04-24", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / Hulk" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - }, - { - "actor": "Don Cheadle", - "character": "James Rhodes / War Machine" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Pepper Potts" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - } - ] - }, - { - "title": "Avengers: Infinity War", - "overview": "As the Avengers and their allies have continued to protect the world from threats too large for any one hero to handle, a new danger has emerged from the cosmic shadows: Thanos. A despot of intergalactic infamy, his goal is to collect all six Infinity Stones, artifacts of unimaginable power, and use them to inflict his twisted will on all of reality. Everything the Avengers have fought for has led up to this moment - the fate of Earth and existence itself has never been more uncertain.", - "release_date": "2018-04-25", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury (uncredited)" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - } - ] - }, - { - "title": "Captain Marvel", - "overview": "The story follows Carol Danvers as she becomes one of the universe’s most powerful heroes when Earth is caught in the middle of a galactic war between two alien races. Set in the 1990s, Captain Marvel is an all-new adventure from a previously unseen period in the history of the Marvel Cinematic Universe.", - "release_date": "2019-03-06", - "characters": [ - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Clark Gregg", - "character": "Agent Phil Coulson" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America (uncredited)" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow (uncredited)" - }, - { - "actor": "Don Cheadle", - "character": "James 'Rhodey' Rhodes / War Machine (uncredited)" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk (uncredited)" - } - ] - }, - { - "title": "Spider-Man: Homecoming", - "overview": "Following the events of Captain America: Civil War, Peter Parker, with the help of his mentor Tony Stark, tries to balance his life as an ordinary high school student in Queens, New York City, with fighting crime as his superhero alter ego Spider-Man as a new threat, the Vulture, emerges.", - "release_date": "2017-07-05", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - } - ] - }, - { - "title": "Team Thor", - "overview": "Discover what Thor was up to during the events of Captain America: Civil War.", - "release_date": "2016-08-28", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner" - } - ] - }, - { - "title": "Black Widow", - "overview": "Natasha Romanoff, also known as Black Widow, confronts the darker parts of her ledger when a dangerous conspiracy with ties to her past arises. Pursued by a force that will stop at nothing to bring her down, Natasha must deal with her history as a spy and the broken relationships left in her wake long before she became an Avenger.", - "release_date": "2020-10-28", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - } - ] - } + { + "title": "Out of Sight", + "overview": "Meet Jack Foley, a smooth criminal who bends the law and is determined to make one last heist. Karen Sisco is a federal marshal who chooses all the right moves … and all the wrong guys. Now they're willing to risk it all to find out if there's more between them than just the law.", + "release_date": "1998-06-26", + "characters": [ + { + "actor": "Don Cheadle", + "character": "Maurice Miller" + }, + { + "actor": "Samuel L. Jackson", + "character": "Hejira Henry (uncredited)" + } + ] + }, + { + "title": "Iron Man", + "overview": "After being held captive in an Afghan cave, billionaire engineer Tony Stark creates a unique weaponized suit of armor to fight evil.", + "release_date": "2008-04-30", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury (uncredited)" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + } + ] + }, + { + "title": "Captain America: The First Avenger", + "overview": "During World War II, Steve Rogers is a sickly man from Brooklyn who's transformed into super-soldier Captain America to aid in the war effort. Rogers must stop the Red Skull – Adolf Hitler's ruthless head of weaponry, and the leader of an organization that intends to use a mysterious device of untold powers for world domination.", + "release_date": "2011-07-22", + "characters": [ + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + } + ] + }, + { + "title": "In Good Company", + "overview": "Dan Foreman is a seasoned advertisement sales executive at a high-ranking publication when a corporate takeover results in him being placed under naive supervisor Carter Duryea, who is half his age. Matters are made worse when Dan's new supervisor becomes romantically involved with his daughter an 18 year-old college student Alex.", + "release_date": "2004-12-29", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Alex Foreman" + }, + { + "actor": "Clark Gregg", + "character": "Mark Steckle" + } + ] + }, + { + "title": "Zodiac", + "overview": "The true story of the investigation of the \"Zodiac Killer\", a serial killer who terrified the San Francisco Bay Area, taunting police with his ciphers and letters. The case becomes an obsession for three men as their lives and careers are built and destroyed by the endless trail of clues.", + "release_date": "2007-03-02", + "characters": [ + { + "actor": "Mark Ruffalo", + "character": "Dave Toschi" + }, + { + "actor": "Robert Downey Jr.", + "character": "Paul Avery" + } + ] + }, + { + "title": "Hard Eight", + "overview": "A stranger mentors a young Reno gambler who weds a hooker and befriends a vulgar casino regular.", + "release_date": "1996-02-28", + "characters": [ + { + "actor": "Gwyneth Paltrow", + "character": "Clementine" + }, + { + "actor": "Samuel L. Jackson", + "character": "Jimmy" + } + ] + }, + { + "title": "The Spirit", + "overview": "Down these mean streets a man must come. A hero born, murdered, and born again. A Rookie cop named Denny Colt returns from the beyond as The Spirit, a hero whose mission is to fight against the bad forces from the shadows of Central City. The Octopus, who kills anyone unfortunate enough to see his face, has other plans; he is going to wipe out the entire city.", + "release_date": "2008-12-25", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Silken Floss" + }, + { + "actor": "Samuel L. Jackson", + "character": "Octopuss" + } + ] + }, + { + "title": "S.W.A.T.", + "overview": "Hondo Harrelson recruits Jim Street to join an elite unit of the Los Angeles Police Department. Together they seek out more members, including tough Deke Kay and single mom Chris Sanchez. The team's first big assignment is to escort crime boss Alex Montel to prison. It seems routine, but when Montel offers a huge reward to anyone who can break him free, criminals of various stripes step up for the prize.", + "release_date": "2003-08-08", + "characters": [ + { + "actor": "Samuel L. Jackson", + "character": "Sgt. Dan 'Hondo' Harrelson" + }, + { + "actor": "Jeremy Renner", + "character": "Brian Gamble" + } + ] + }, + { + "title": "Iron Man 2", + "overview": "With the world now aware of his dual life as the armored superhero Iron Man, billionaire inventor Tony Stark faces pressure from the government, the press and the public to share his technology with the military. Unwilling to let go of his invention, Stark, with Pepper Potts and James 'Rhodey' Rhodes at his side, must forge new alliances – and confront powerful enemies.", + "release_date": "2010-04-28", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + }, + { + "actor": "Scarlett Johansson", + "character": "Natalie Rushman / Natasha Romanoff / Black Widow" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + } + ] + }, + { + "title": "Thor", + "overview": "Against his father Odin's will, The Mighty Thor - a powerful but arrogant warrior god - recklessly reignites an ancient war. Thor is cast down to Earth and forced to live among humans as punishment. Once here, Thor learns what it takes to be a true hero when the most dangerous villain of his world sends the darkest forces of Asgard to invade Earth.", + "release_date": "2011-04-21", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye (uncredited)" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury (uncredited)" + } + ] + }, + { + "title": "View from the Top", + "overview": "A small-town woman tries to achieve her goal of becoming a flight attendant.", + "release_date": "2003-03-21", + "characters": [ + { + "actor": "Gwyneth Paltrow", + "character": "Donna" + }, + { + "actor": "Mark Ruffalo", + "character": "Ted Stewart" + } + ] + }, + { + "title": "The Nanny Diaries", + "overview": "A college graduate goes to work as a nanny for a rich New York family. Ensconced in their home, she has to juggle their dysfunction, a new romance, and the spoiled brat in her charge.", + "release_date": "2007-08-24", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Annie Braddock" + }, + { + "actor": "Chris Evans", + "character": "Hayden \"Harvard Hottie\"" + } + ] + }, + { + "title": "The Perfect Score", + "overview": "Six high school seniors decide to break into the Princeton Testing Center so they can steal the answers to their upcoming SAT tests and all get perfect scores.", + "release_date": "2004-01-30", + "characters": [ + { + "actor": "Chris Evans", + "character": "Kyle" + }, + { + "actor": "Scarlett Johansson", + "character": "Francesca Curtis" + } + ] + }, + { + "title": "The Avengers", + "overview": "When an unexpected enemy emerges and threatens global safety and security, Nick Fury, director of the international peacekeeping agency known as S.H.I.E.L.D., finds himself in need of a team to pull the world back from the brink of disaster. Spanning the globe, a daring recruitment effort begins!", + "release_date": "2012-04-25", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + } + ] + }, + { + "title": "Iron Man 3", + "overview": "When Tony Stark's world is torn apart by a formidable terrorist called the Mandarin, he starts an odyssey of rebuilding and retribution.", + "release_date": "2013-04-18", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / Iron Patriot" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner (uncredited)" + } + ] + }, + { + "title": "Marvel One-Shot: The Consultant", + "overview": "Agent Coulson informs Agent Sitwell that the World Security Council wishes Emil Blonsky to be released from prison to join the Avengers Initiative. As Nick Fury doesn't want to release Blonsky, the two agents decide to send a patsy to sabotage the meeting...", + "release_date": "2011-09-12", + "characters": [ + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark (archive footage)" + } + ] + }, + { + "title": "Thor: The Dark World", + "overview": "Thor fights to restore order across the cosmos… but an ancient race led by the vengeful Malekith returns to plunge the universe back into darkness. Faced with an enemy that even Odin and Asgard cannot withstand, Thor must embark on his most perilous and personal journey yet, one that will reunite him with Jane Foster and force him to sacrifice everything to save us all.", + "release_date": "2013-10-29", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Chris Evans", + "character": "Loki as Captain America (uncredited)" + } + ] + }, + { + "title": "Avengers: Age of Ultron", + "overview": "When Tony Stark tries to jumpstart a dormant peacekeeping program, things go awry and Earth’s Mightiest Heroes are put to the ultimate test as the fate of the planet hangs in the balance. As the villainous Ultron emerges, it is up to The Avengers to stop him from enacting his terrible plans, and soon uneasy alliances and unexpected action pave the way for an epic and unique global adventure.", + "release_date": "2015-04-22", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + } + ] + }, + { + "title": "Captain America: The Winter Soldier", + "overview": "After the cataclysmic events in New York with The Avengers, Steve Rogers, aka Captain America is living quietly in Washington, D.C. and trying to adjust to the modern world. But when a S.H.I.E.L.D. colleague comes under attack, Steve becomes embroiled in a web of intrigue that threatens to put the world at risk. Joining forces with the Black Widow, Captain America struggles to expose the ever-widening conspiracy while fighting off professional assassins sent to silence him at every turn. When the full scope of the villainous plot is revealed, Captain America and the Black Widow enlist the help of a new ally, the Falcon. However, they soon find themselves up against an unexpected and formidable enemy—the Winter Soldier.", + "release_date": "2014-03-20", + "characters": [ + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + } + ] + }, + { + "title": "Thanks for Sharing", + "overview": "A romantic comedy that brings together three disparate characters who are learning to face a challenging and often confusing world as they struggle together against a common demon—sex addiction.", + "release_date": "2013-09-19", + "characters": [ + { + "actor": "Mark Ruffalo", + "character": "Adam" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Phoebe" + } + ] + }, + { + "title": "Chef", + "overview": "When Chef Carl Casper suddenly quits his job at a prominent Los Angeles restaurant after refusing to compromise his creative integrity for its controlling owner, he is left to figure out what's next. Finding himself in Miami, he teams up with his ex-wife, his friend and his son to launch a food truck. Taking to the road, Chef Carl goes back to his roots to reignite his passion for the kitchen -- and zest for life and love.", + "release_date": "2014-05-08", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Molly" + }, + { + "actor": "Robert Downey Jr.", + "character": "Marvin" + } + ] + }, + { + "title": "Marvel Studios: Assembling a Universe", + "overview": "A look at the story behind Marvel Studios and the Marvel Cinematic Universe, featuring interviews and behind-the-scenes footage from all of the Marvel films, the Marvel One-Shots and \"Marvel's Agents of S.H.I.E.L.D.\"", + "release_date": "2014-03-18", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Himself / Tony Stark / Iron Man" + }, + { + "actor": "Chris Hemsworth", + "character": "Himself / Thor" + }, + { + "actor": "Chris Evans", + "character": "Himself / Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Himself / Bruce Banner / Hulk" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Herself" + }, + { + "actor": "Clark Gregg", + "character": "Himself" + }, + { + "actor": "Samuel L. Jackson", + "character": "Himself" + }, + { + "actor": "Scarlett Johansson", + "character": "Herself" + }, + { + "actor": "Jeremy Renner", + "character": "Himself" + } + ] + }, + { + "title": "Captain America: Civil War", + "overview": "Following the events of Age of Ultron, the collective governments of the world pass an act designed to regulate all superhuman activity. This polarizes opinion amongst the Avengers, causing two factions to side with Iron Man or Captain America, which causes an epic battle between former allies.", + "release_date": "2016-04-27", + "characters": [ + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + } + ] + }, + { + "title": "Thor: Ragnarok", + "overview": "Thor is imprisoned on the other side of the universe and finds himself in a race against time to get back to Asgard to stop Ragnarok, the destruction of his home-world and the end of Asgardian civilization, at the hands of an all-powerful new threat, the ruthless Hela.", + "release_date": "2017-10-25", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / Hulk" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow (archive footage / uncredited)" + } + ] + }, + { + "title": "Avengers: Endgame", + "overview": "After the devastating events of Avengers: Infinity War, the universe is in ruins due to the efforts of the Mad Titan, Thanos. With the help of remaining allies, the Avengers must assemble once more in order to undo Thanos' actions and restore order to the universe once and for all, no matter what consequences may be in store.", + "release_date": "2019-04-24", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / Hulk" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + }, + { + "actor": "Don Cheadle", + "character": "James Rhodes / War Machine" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Pepper Potts" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + } + ] + }, + { + "title": "Avengers: Infinity War", + "overview": "As the Avengers and their allies have continued to protect the world from threats too large for any one hero to handle, a new danger has emerged from the cosmic shadows: Thanos. A despot of intergalactic infamy, his goal is to collect all six Infinity Stones, artifacts of unimaginable power, and use them to inflict his twisted will on all of reality. Everything the Avengers have fought for has led up to this moment - the fate of Earth and existence itself has never been more uncertain.", + "release_date": "2018-04-25", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury (uncredited)" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + } + ] + }, + { + "title": "Captain Marvel", + "overview": "The story follows Carol Danvers as she becomes one of the universe’s most powerful heroes when Earth is caught in the middle of a galactic war between two alien races. Set in the 1990s, Captain Marvel is an all-new adventure from a previously unseen period in the history of the Marvel Cinematic Universe.", + "release_date": "2019-03-06", + "characters": [ + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Clark Gregg", + "character": "Agent Phil Coulson" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America (uncredited)" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow (uncredited)" + }, + { + "actor": "Don Cheadle", + "character": "James 'Rhodey' Rhodes / War Machine (uncredited)" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk (uncredited)" + } + ] + }, + { + "title": "Spider-Man: Homecoming", + "overview": "Following the events of Captain America: Civil War, Peter Parker, with the help of his mentor Tony Stark, tries to balance his life as an ordinary high school student in Queens, New York City, with fighting crime as his superhero alter ego Spider-Man as a new threat, the Vulture, emerges.", + "release_date": "2017-07-05", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + } + ] + }, + { + "title": "Team Thor", + "overview": "Discover what Thor was up to during the events of Captain America: Civil War.", + "release_date": "2016-08-28", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner" + } + ] + }, + { + "title": "Black Widow", + "overview": "Natasha Romanoff, also known as Black Widow, confronts the darker parts of her ledger when a dangerous conspiracy with ties to her past arises. Pursued by a force that will stop at nothing to bring her down, Natasha must deal with her history as a spy and the broken relationships left in her wake long before she became an Avenger.", + "release_date": "2020-10-28", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + } + ] + } ] ``` diff --git a/site/versioned_docs/version-4.4/developers/operations-api/bulk-operations.md b/site/versioned_docs/version-4.4/developers/operations-api/bulk-operations.md index 133bf9e8..372e5bb3 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/bulk-operations.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/bulk-operations.md @@ -5,132 +5,144 @@ title: Bulk Operations # Bulk Operations ## CSV Data Load + Ingests CSV data, provided directly in the operation as an `insert`, `update` or `upsert` into the specified database table. -* operation _(required)_ - must always be `csv_data_load` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* data _(required)_ - csv data to import into Harper +- operation _(required)_ - must always be `csv_data_load` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- data _(required)_ - csv data to import into Harper ### Body + ```json { - "operation": "csv_data_load", - "database": "dev", - "action": "insert", - "table": "breed", - "data": "id,name,section,country,image\n1,ENGLISH POINTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/001g07.jpg\n2,ENGLISH SETTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/002g07.jpg\n3,KERRY BLUE TERRIER,Large and medium sized Terriers,IRELAND,\n" + "operation": "csv_data_load", + "database": "dev", + "action": "insert", + "table": "breed", + "data": "id,name,section,country,image\n1,ENGLISH POINTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/001g07.jpg\n2,ENGLISH SETTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/002g07.jpg\n3,KERRY BLUE TERRIER,Large and medium sized Terriers,IRELAND,\n" } ``` ### Response: 200 + ```json - { - "message": "Starting job with id 2fe25039-566e-4670-8bb3-2db3d4e07e69", - "job_id": "2fe25039-566e-4670-8bb3-2db3d4e07e69" - } +{ + "message": "Starting job with id 2fe25039-566e-4670-8bb3-2db3d4e07e69", + "job_id": "2fe25039-566e-4670-8bb3-2db3d4e07e69" +} ``` --- ## CSV File Load -Ingests CSV data, provided via a path on the local filesystem, as an `insert`, `update` or `upsert` into the specified database table. + +Ingests CSV data, provided via a path on the local filesystem, as an `insert`, `update` or `upsert` into the specified database table. _Note: The CSV file must reside on the same machine on which Harper is running. For example, the path to a CSV on your computer will produce an error if your Harper instance is a cloud instance._ -* operation _(required)_ - must always be `csv_file_load` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* file_path _(required)_ - path to the csv file on the host running Harper +- operation _(required)_ - must always be `csv_file_load` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- file*path *(required)\_ - path to the csv file on the host running Harper ### Body + ```json { - "operation": "csv_file_load", - "action": "insert", - "database": "dev", - "table": "breed", - "file_path": "/home/user/imports/breeds.csv" + "operation": "csv_file_load", + "action": "insert", + "database": "dev", + "table": "breed", + "file_path": "/home/user/imports/breeds.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 3994d8e2-ec6a-43c4-8563-11c1df81870e", - "job_id": "3994d8e2-ec6a-43c4-8563-11c1df81870e" + "message": "Starting job with id 3994d8e2-ec6a-43c4-8563-11c1df81870e", + "job_id": "3994d8e2-ec6a-43c4-8563-11c1df81870e" } ``` --- ## CSV URL Load + Ingests CSV data, provided via URL, as an `insert`, `update` or `upsert` into the specified database table. -* operation _(required)_ - must always be `csv_url_load` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* csv_url _(required)_ - URL to the csv +- operation _(required)_ - must always be `csv_url_load` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- csv*url *(required)\_ - URL to the csv ### Body + ```json { - "operation": "csv_url_load", - "action": "insert", - "database": "dev", - "table": "breed", - "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" + "operation": "csv_url_load", + "action": "insert", + "database": "dev", + "table": "breed", + "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 332aa0a2-6833-46cd-88a6-ae375920436a", - "job_id": "332aa0a2-6833-46cd-88a6-ae375920436a" + "message": "Starting job with id 332aa0a2-6833-46cd-88a6-ae375920436a", + "job_id": "332aa0a2-6833-46cd-88a6-ae375920436a" } ``` --- ## Import from S3 + This operation allows users to import CSV or JSON files from an AWS S3 bucket as an `insert`, `update` or `upsert`. -* operation _(required)_ - must always be `import_from_s3` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* s3 _(required)_ - object containing required AWS S3 bucket info for operation: - * aws_access_key_id - AWS access key for authenticating into your S3 bucket - * aws_secret_access_key - AWS secret for authenticating into your S3 bucket - * bucket - AWS S3 bucket to import from - * key - the name of the file to import - _the file must include a valid file extension ('.csv' or '.json')_ - * region - the region of the bucket +- operation _(required)_ - must always be `import_from_s3` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- s3 _(required)_ - object containing required AWS S3 bucket info for operation: + - aws_access_key_id - AWS access key for authenticating into your S3 bucket + - aws_secret_access_key - AWS secret for authenticating into your S3 bucket + - bucket - AWS S3 bucket to import from + - key - the name of the file to import - _the file must include a valid file extension ('.csv' or '.json')_ + - region - the region of the bucket ### Body + ```json { - "operation": "import_from_s3", - "action": "insert", - "database": "dev", - "table": "dog", - "s3": { - "aws_access_key_id": "YOUR_KEY", - "aws_secret_access_key": "YOUR_SECRET_KEY", - "bucket": "BUCKET_NAME", - "key": "OBJECT_NAME", - "region": "BUCKET_REGION" - } + "operation": "import_from_s3", + "action": "insert", + "database": "dev", + "table": "dog", + "s3": { + "aws_access_key_id": "YOUR_KEY", + "aws_secret_access_key": "YOUR_SECRET_KEY", + "bucket": "BUCKET_NAME", + "key": "OBJECT_NAME", + "region": "BUCKET_REGION" + } } ``` ### Response: 200 + ```json { - "message": "Starting job with id 062a1892-6a0a-4282-9791-0f4c93b12e16", - "job_id": "062a1892-6a0a-4282-9791-0f4c93b12e16" + "message": "Starting job with id 062a1892-6a0a-4282-9791-0f4c93b12e16", + "job_id": "062a1892-6a0a-4282-9791-0f4c93b12e16" } -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.4/developers/operations-api/clustering-nats.md b/site/versioned_docs/version-4.4/developers/operations-api/clustering-nats.md index a1157bea..a45c593e 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/clustering-nats.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/clustering-nats.md @@ -5,425 +5,453 @@ title: Clustering using NATS # Clustering using NATS ## Cluster Set Routes + Adds a route/routes to either the hub or leaf server cluster configuration. This operation behaves as a PATCH/upsert, meaning it will add new routes to the configuration while leaving existing routes untouched. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_set_routes` -* server _(required)_ - must always be `hub` or `leaf`, in most cases you should use `hub` here -* routes _(required)_ - must always be an objects array with a host and port: - * host - the host of the remote instance you are clustering to - * port - the clustering port of the remote instance you are clustering to, in most cases this is the value in `clustering.hubServer.cluster.network.port` on the remote instance `harperdb-config.yaml` +- operation _(required)_ - must always be `cluster_set_routes` +- server _(required)_ - must always be `hub` or `leaf`, in most cases you should use `hub` here +- routes _(required)_ - must always be an objects array with a host and port: + - host - the host of the remote instance you are clustering to + - port - the clustering port of the remote instance you are clustering to, in most cases this is the value in `clustering.hubServer.cluster.network.port` on the remote instance `harperdb-config.yaml` ### Body + ```json { - "operation": "cluster_set_routes", - "server": "hub", - "routes": [ - { - "host": "3.22.181.22", - "port": 12345 - }, - { - "host": "3.137.184.8", - "port": 12345 - }, - { - "host": "18.223.239.195", - "port": 12345 - }, - { - "host": "18.116.24.71", - "port": 12345 - } - ] + "operation": "cluster_set_routes", + "server": "hub", + "routes": [ + { + "host": "3.22.181.22", + "port": 12345 + }, + { + "host": "3.137.184.8", + "port": 12345 + }, + { + "host": "18.223.239.195", + "port": 12345 + }, + { + "host": "18.116.24.71", + "port": 12345 + } + ] } ``` ### Response: 200 + ```json { - "message": "cluster routes successfully set", - "set": [ - { - "host": "3.22.181.22", - "port": 12345 - }, - { - "host": "3.137.184.8", - "port": 12345 - }, - { - "host": "18.223.239.195", - "port": 12345 - }, - { - "host": "18.116.24.71", - "port": 12345 - } - ], - "skipped": [] + "message": "cluster routes successfully set", + "set": [ + { + "host": "3.22.181.22", + "port": 12345 + }, + { + "host": "3.137.184.8", + "port": 12345 + }, + { + "host": "18.223.239.195", + "port": 12345 + }, + { + "host": "18.116.24.71", + "port": 12345 + } + ], + "skipped": [] } ``` --- ## Cluster Get Routes + Gets all the hub and leaf server routes from the config file. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_get_routes` +- operation _(required)_ - must always be `cluster_get_routes` ### Body + ```json { - "operation": "cluster_get_routes" + "operation": "cluster_get_routes" } ``` ### Response: 200 + ```json { - "hub": [ - { - "host": "3.22.181.22", - "port": 12345 - }, - { - "host": "3.137.184.8", - "port": 12345 - }, - { - "host": "18.223.239.195", - "port": 12345 - }, - { - "host": "18.116.24.71", - "port": 12345 - } - ], - "leaf": [] + "hub": [ + { + "host": "3.22.181.22", + "port": 12345 + }, + { + "host": "3.137.184.8", + "port": 12345 + }, + { + "host": "18.223.239.195", + "port": 12345 + }, + { + "host": "18.116.24.71", + "port": 12345 + } + ], + "leaf": [] } ``` --- ## Cluster Delete Routes + Removes route(s) from hub and/or leaf server routes array in config file. Returns a deletion success message and arrays of deleted and skipped records. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_delete_routes` -* routes _required_ - Must be an array of route object(s) +- operation _(required)_ - must always be `cluster_delete_routes` +- routes _required_ - Must be an array of route object(s) ### Body ```json { - "operation": "cluster_delete_routes", - "routes": [ - { - "host": "18.116.24.71", - "port": 12345 - } - ] + "operation": "cluster_delete_routes", + "routes": [ + { + "host": "18.116.24.71", + "port": 12345 + } + ] } ``` ### Response: 200 + ```json { - "message": "cluster routes successfully deleted", - "deleted": [ - { - "host": "18.116.24.71", - "port": 12345 - } - ], - "skipped": [] + "message": "cluster routes successfully deleted", + "deleted": [ + { + "host": "18.116.24.71", + "port": 12345 + } + ], + "skipped": [] } ``` - --- ## Add Node + Registers an additional Harper instance with associated subscriptions. Learn more about [Harper clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_node` -* node_name _(required)_ - the node name of the remote node -* subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: - * schema - the schema to replicate from - * table - the table to replicate from - * subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish - a boolean which determines if transactions on the local table should be replicated on the remote table - * start_time _(optional)_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format - +- operation _(required)_ - must always be `add_node` +- node*name *(required)\_ - the node name of the remote node +- subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: + - schema - the schema to replicate from + - table - the table to replicate from + - subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish - a boolean which determines if transactions on the local table should be replicated on the remote table + - start*time *(optional)\_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format + ### Body + ```json { - "operation": "add_node", - "node_name": "ec2-3-22-181-22", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": false, - "publish": true, - "start_time": "2022-09-02T20:06:35.993Z" - } - ] + "operation": "add_node", + "node_name": "ec2-3-22-181-22", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": false, + "publish": true, + "start_time": "2022-09-02T20:06:35.993Z" + } + ] } ``` ### Response: 200 + ```json { - "message": "Successfully added 'ec2-3-22-181-22' to manifest" + "message": "Successfully added 'ec2-3-22-181-22' to manifest" } ``` --- ## Update Node -Modifies an existing Harper instance registration and associated subscriptions. This operation behaves as a PATCH/upsert, meaning it will insert or update the specified replication configurations while leaving other table replication configuration untouched. Learn more about [Harper clustering here](../clustering/). + +Modifies an existing Harper instance registration and associated subscriptions. This operation behaves as a PATCH/upsert, meaning it will insert or update the specified replication configurations while leaving other table replication configuration untouched. Learn more about [Harper clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `update_node` -* node_name _(required)_ - the node name of the remote node you are updating -* subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: - * schema - the schema to replicate from - * table - the table to replicate from - * subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish - a boolean which determines if transactions on the local table should be replicated on the remote table - * start_time _(optional)_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format +- operation _(required)_ - must always be `update_node` +- node*name *(required)\_ - the node name of the remote node you are updating +- subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: + - schema - the schema to replicate from + - table - the table to replicate from + - subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish - a boolean which determines if transactions on the local table should be replicated on the remote table + - start*time *(optional)\_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format ### Body + ```json { - "operation": "update_node", - "node_name": "ec2-18-223-239-195", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": false, - "start_time": "2022-09-02T20:06:35.993Z" - } - ] + "operation": "update_node", + "node_name": "ec2-18-223-239-195", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": false, + "start_time": "2022-09-02T20:06:35.993Z" + } + ] } ``` ### Response: 200 + ```json { - "message": "Successfully updated 'ec2-3-22-181-22'" + "message": "Successfully updated 'ec2-3-22-181-22'" } ``` --- ## Set Node Replication + A more adeptly named alias for add and update node. This operation behaves as a PATCH/upsert, meaning it will insert or update the specified replication configurations while leaving other table replication configuration untouched. The `database` (aka `schema`) parameter is optional, it will default to `data`. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_node_replication` -* node_name _(required)_ - the node name of the remote node you are updating -* subscriptions _(required)_ - The relationship created between nodes. Must be an object array and `table`, `subscribe` and `publish`: - * database *(optional)* - the database to replicate from - * table *(required)* - the table to replicate from - * subscribe *(required)* - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish *(required)* - a boolean which determines if transactions on the local table should be replicated on the remote table -* +- operation _(required)_ - must always be `set_node_replication` +- node*name *(required)\_ - the node name of the remote node you are updating +- subscriptions _(required)_ - The relationship created between nodes. Must be an object array and `table`, `subscribe` and `publish`: + - database _(optional)_ - the database to replicate from + - table _(required)_ - the table to replicate from + - subscribe _(required)_ - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish _(required)_ - a boolean which determines if transactions on the local table should be replicated on the remote table +- + ### Body + ```json { - "operation": "set_node_replication", - "node_name": "node1", - "subscriptions": [ - { - "table": "dog", - "subscribe": true, - "publish": true - } - ] + "operation": "set_node_replication", + "node_name": "node1", + "subscriptions": [ + { + "table": "dog", + "subscribe": true, + "publish": true + } + ] } ``` + ### Response: 200 + ```json { - "message": "Successfully updated 'ec2-3-22-181-22'" + "message": "Successfully updated 'ec2-3-22-181-22'" } ``` --- ## Cluster Status + Returns an array of status objects from a cluster. A status object will contain the clustering node name, whether or not clustering is enabled, and a list of possible connections. Learn more about [Harper clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_status` +- operation _(required)_ - must always be `cluster_status` ### Body + ```json { - "operation": "cluster_status" + "operation": "cluster_status" } ``` ### Response: 200 + ```json { - "node_name": "ec2-18-221-143-69", - "is_enabled": true, - "connections": [ - { - "node_name": "ec2-3-22-181-22", - "status": "open", - "ports": { - "clustering": 12345, - "operations_api": 9925 - }, - "latency_ms": 13, - "uptime": "30d 1h 18m 8s", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ] - } - ] + "node_name": "ec2-18-221-143-69", + "is_enabled": true, + "connections": [ + { + "node_name": "ec2-3-22-181-22", + "status": "open", + "ports": { + "clustering": 12345, + "operations_api": 9925 + }, + "latency_ms": 13, + "uptime": "30d 1h 18m 8s", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ] + } + ] } ``` - --- ## Cluster Network + Returns an object array of enmeshed nodes. Each node object will contain the name of the node, the amount of time (in milliseconds) it took for it to respond, the names of the nodes it is enmeshed with and the routes set in its config file. Learn more about [Harper clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_- must always be `cluster_network` -* timeout (_optional_) - the amount of time in milliseconds to wait for a response from the network. Must be a number -* connected_nodes (_optional_) - omit `connected_nodes` from the response. Must be a boolean. Defaults to `false` -* routes (_optional_) - omit `routes` from the response. Must be a boolean. Defaults to `false` +- operation _(required)_- must always be `cluster_network` +- timeout (_optional_) - the amount of time in milliseconds to wait for a response from the network. Must be a number +- connected*nodes (\_optional*) - omit `connected_nodes` from the response. Must be a boolean. Defaults to `false` +- routes (_optional_) - omit `routes` from the response. Must be a boolean. Defaults to `false` ### Body ```json { - "operation": "cluster_network" + "operation": "cluster_network" } ``` ### Response: 200 + ```json { - "nodes": [ - { - "name": "local_node", - "response_time": 4, - "connected_nodes": ["ec2-3-142-255-78"], - "routes": [ - { - "host": "3.142.255.78", - "port": 9932 - } - ] - }, - { - "name": "ec2-3-142-255-78", - "response_time": 57, - "connected_nodes": ["ec2-3-12-153-124", "ec2-3-139-236-138", "local_node"], - "routes": [] - } - ] + "nodes": [ + { + "name": "local_node", + "response_time": 4, + "connected_nodes": ["ec2-3-142-255-78"], + "routes": [ + { + "host": "3.142.255.78", + "port": 9932 + } + ] + }, + { + "name": "ec2-3-142-255-78", + "response_time": 57, + "connected_nodes": ["ec2-3-12-153-124", "ec2-3-139-236-138", "local_node"], + "routes": [] + } + ] } ``` --- ## Remove Node + Removes a Harper instance and associated subscriptions from the cluster. Learn more about [Harper clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `remove_node` -* name _(required)_ - The name of the node you are de-registering +- operation _(required)_ - must always be `remove_node` +- name _(required)_ - The name of the node you are de-registering ### Body + ```json { - "operation": "remove_node", - "node_name": "ec2-3-22-181-22" + "operation": "remove_node", + "node_name": "ec2-3-22-181-22" } ``` ### Response: 200 + ```json { - "message": "Successfully removed 'ec2-3-22-181-22' from manifest" + "message": "Successfully removed 'ec2-3-22-181-22' from manifest" } ``` --- ## Configure Cluster + Bulk create/remove subscriptions for any number of remote nodes. Resets and replaces any existing clustering setup. Learn more about [Harper clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `configure_cluster` -* connections _(required)_ - must be an object array with each object containing `node_name` and `subscriptions` for that node +- operation _(required)_ - must always be `configure_cluster` +- connections _(required)_ - must be an object array with each object containing `node_name` and `subscriptions` for that node ### Body + ```json { - "operation": "configure_cluster", - "connections": [ - { - "node_name": "ec2-3-137-184-8", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": false - } - ] - }, - { - "node_name": "ec2-18-223-239-195", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": true - } - ] - } - ] + "operation": "configure_cluster", + "connections": [ + { + "node_name": "ec2-3-137-184-8", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": false + } + ] + }, + { + "node_name": "ec2-18-223-239-195", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": true + } + ] + } + ] } ``` ### Response: 200 + ```json { - "message": "Cluster successfully configured." + "message": "Cluster successfully configured." } ``` @@ -435,23 +463,24 @@ Will purge messages from a stream _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `purge_stream` -* database _(required)_ - the name of the database where the streams table resides -* table _(required)_ - the name of the table that belongs to the stream -* options _(optional)_ - control how many messages get purged. Options are: - * `keep` - purge will keep this many most recent messages - * `seq` - purge all messages up to, but not including, this sequence +- operation _(required)_ - must always be `purge_stream` +- database _(required)_ - the name of the database where the streams table resides +- table _(required)_ - the name of the table that belongs to the stream +- options _(optional)_ - control how many messages get purged. Options are: + - `keep` - purge will keep this many most recent messages + - `seq` - purge all messages up to, but not including, this sequence ### Body + ```json { - "operation": "purge_stream", - "database": "dev", - "table": "dog", - "options": { - "keep": 100 - } + "operation": "purge_stream", + "database": "dev", + "table": "dog", + "options": { + "keep": 100 + } } ``` ---- \ No newline at end of file +--- diff --git a/site/versioned_docs/version-4.4/developers/operations-api/clustering.md b/site/versioned_docs/version-4.4/developers/operations-api/clustering.md index 17679214..8e49285e 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/clustering.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/clustering.md @@ -6,37 +6,36 @@ title: Clustering The following operations are available for configuring and managing [Harper replication](../replication/).\ - _**If you are using NATS for clustering, please see the**_ [_**NATS Clustering Operations**_](./clustering-nats) _**documentation.**_ ## Add Node Adds a new Harper instance to the cluster. If `subscriptions` are provided, it will also create the replication relationships between the nodes. If they are not provided a fully replicating system will be created. [Learn more about adding nodes here](../replication/). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_node` -* hostname or url _(required)_ - one of these fields is required. You must provide either the `hostname` or the `url` of the node you want to add -* verify\_tls _(optional)_ - a boolean which determines if the TLS certificate should be verified. This will allow the Harper default self-signed certificates to be accepted. Defaults to `true` -* authorization _(optional)_ - an object or a string which contains the authorization information for the node being added. If it is an object, it should contain `username` and `password` fields. If it is a string, it should use HTTP `Authorization` style credentials -* retain\_authorization _(optional)_ - a boolean which determines if the authorization credentials should be retained/stored and used everytime a connection is made to this node. If `true`, the authorization will be stored on the node record. Generally this should not be used, as mTLS/certificate based authorization is much more secure and safe, and avoids the need for storing credentials. Defaults to `false`. -* subscriptions _(optional)_ - The relationship created between nodes. If not provided a fully replicated cluster will be setup. Must be an object array and include `database`, `table`, `subscribe` and `publish`: - * database - the database to replicate - * table - the table to replicate - * subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish - a boolean which determines if transactions on the local table should be replicated on the remote table +- operation _(required)_ - must always be `add_node` +- hostname or url _(required)_ - one of these fields is required. You must provide either the `hostname` or the `url` of the node you want to add +- verify_tls _(optional)_ - a boolean which determines if the TLS certificate should be verified. This will allow the Harper default self-signed certificates to be accepted. Defaults to `true` +- authorization _(optional)_ - an object or a string which contains the authorization information for the node being added. If it is an object, it should contain `username` and `password` fields. If it is a string, it should use HTTP `Authorization` style credentials +- retain_authorization _(optional)_ - a boolean which determines if the authorization credentials should be retained/stored and used everytime a connection is made to this node. If `true`, the authorization will be stored on the node record. Generally this should not be used, as mTLS/certificate based authorization is much more secure and safe, and avoids the need for storing credentials. Defaults to `false`. +- subscriptions _(optional)_ - The relationship created between nodes. If not provided a fully replicated cluster will be setup. Must be an object array and include `database`, `table`, `subscribe` and `publish`: + - database - the database to replicate + - table - the table to replicate + - subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish - a boolean which determines if transactions on the local table should be replicated on the remote table ### Body ```json { - "operation": "add_node", - "hostname": "server-two", - "verify_tls": false, - "authorization": { - "username": "admin", - "password": "password" - } + "operation": "add_node", + "hostname": "server-two", + "verify_tls": false, + "authorization": { + "username": "admin", + "password": "password" + } } ``` @@ -44,42 +43,42 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Successfully added 'server-two' to cluster" + "message": "Successfully added 'server-two' to cluster" } ``` -*** +--- ## Update Node Modifies an existing Harper instance in the cluster. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ _Note: will attempt to add the node if it does not exist_ -* operation _(required)_ - must always be `update_node` -* hostname _(required)_ - the `hostname` of the remote node you are updating -* subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `database`, `table`, `subscribe` and `publish`: - * database - the database to replicate from - * table - the table to replicate from - * subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish - a boolean which determines if transactions on the local table should be replicated on the remote table +- operation _(required)_ - must always be `update_node` +- hostname _(required)_ - the `hostname` of the remote node you are updating +- subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `database`, `table`, `subscribe` and `publish`: + - database - the database to replicate from + - table - the table to replicate from + - subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish - a boolean which determines if transactions on the local table should be replicated on the remote table ### Body ```json { - "operation": "update_node", - "hostname": "server-two", - "subscriptions": [ - { - "database": "dev", - "table": "my-table", - "subscribe": true, - "publish": true - } - ] + "operation": "update_node", + "hostname": "server-two", + "subscriptions": [ + { + "database": "dev", + "table": "my-table", + "subscribe": true, + "publish": true + } + ] } ``` @@ -87,27 +86,27 @@ _Note: will attempt to add the node if it does not exist_ ```json { - "message": "Successfully updated 'server-two'" + "message": "Successfully updated 'server-two'" } ``` -*** +--- ## Remove Node Removes a Harper node from the cluster and stops replication, [Learn more about remove node here](../replication/). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `remove_node` -* name _(required)_ - The name of the node you are removing +- operation _(required)_ - must always be `remove_node` +- name _(required)_ - The name of the node you are removing ### Body ```json { - "operation": "remove_node", - "hostname": "server-two" + "operation": "remove_node", + "hostname": "server-two" } ``` @@ -115,11 +114,11 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Successfully removed 'server-two' from cluster" + "message": "Successfully removed 'server-two' from cluster" } ``` -*** +--- ## Cluster Status @@ -127,15 +126,15 @@ Returns an array of status objects from a cluster. `database_sockets` shows the actual websocket connections that exist between nodes. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_status` +- operation _(required)_ - must always be `cluster_status` ### Body ```json { - "operation": "cluster_status" + "operation": "cluster_status" } ``` @@ -143,87 +142,85 @@ _Operation is restricted to super\_user roles only_ ```json { - "type": "cluster-status", - "connections": [ - { - "url": "wss://server-two:9925", - "subscriptions": [ - { - "schema": "dev", - "table": "my-table", - "publish": true, - "subscribe": true - } - ], - "name": "server-two", - "database_sockets": [ - { - "database": "dev", - "connected": true, - "latency": 0.84197798371315, - "threadId": 1, - "nodes": [ - "server-two" - ] - } - ] - } - ], - "node_name": "server-one", - "is_enabled": true + "type": "cluster-status", + "connections": [ + { + "url": "wss://server-two:9925", + "subscriptions": [ + { + "schema": "dev", + "table": "my-table", + "publish": true, + "subscribe": true + } + ], + "name": "server-two", + "database_sockets": [ + { + "database": "dev", + "connected": true, + "latency": 0.84197798371315, + "threadId": 1, + "nodes": ["server-two"] + } + ] + } + ], + "node_name": "server-one", + "is_enabled": true } ``` -*** +--- ## Configure Cluster Bulk create/remove subscriptions for any number of remote nodes. Resets and replaces any existing clustering setup. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `configure_cluster` -* connections _(required)_ - must be an object array with each object following the `add_node` schema. +- operation _(required)_ - must always be `configure_cluster` +- connections _(required)_ - must be an object array with each object following the `add_node` schema. ### Body ```json { - "operation": "configure_cluster", - "connections": [ - { - "hostname": "server-two", - "verify_tls": false, - "authorization": { - "username": "admin", - "password": "password2" - }, - "subscriptions": [ - { - "schema": "dev", - "table": "my-table", - "subscribe": true, - "publish": false - } - ] - }, - { - "hostname": "server-three", - "verify_tls": false, - "authorization": { - "username": "admin", - "password": "password3" - }, - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": true - } - ] - } - ] + "operation": "configure_cluster", + "connections": [ + { + "hostname": "server-two", + "verify_tls": false, + "authorization": { + "username": "admin", + "password": "password2" + }, + "subscriptions": [ + { + "schema": "dev", + "table": "my-table", + "subscribe": true, + "publish": false + } + ] + }, + { + "hostname": "server-three", + "verify_tls": false, + "authorization": { + "username": "admin", + "password": "password3" + }, + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": true + } + ] + } + ] } ``` @@ -231,33 +228,33 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Cluster successfully configured." + "message": "Cluster successfully configured." } ``` -*** +--- ## Cluster Set Routes Adds a route/routes to the `replication.routes` configuration. This operation behaves as a PATCH/upsert, meaning it will add new routes to the configuration while leaving existing routes untouched. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_set_routes` -* routes _(required)_ - the routes field is an array that specifies the routes for clustering. Each element in the array can be either a string or an object with `hostname` and `port` properties. +- operation _(required)_ - must always be `cluster_set_routes` +- routes _(required)_ - the routes field is an array that specifies the routes for clustering. Each element in the array can be either a string or an object with `hostname` and `port` properties. ### Body ```json { - "operation": "cluster_set_routes", - "routes": [ - "wss://server-two:9925", - { - "hostname": "server-three", - "port": 9930 - } - ] + "operation": "cluster_set_routes", + "routes": [ + "wss://server-two:9925", + { + "hostname": "server-three", + "port": 9930 + } + ] } ``` @@ -265,33 +262,33 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "cluster routes successfully set", - "set": [ - "wss://server-two:9925", - { - "hostname": "server-three", - "port": 9930 - } - ], - "skipped": [] + "message": "cluster routes successfully set", + "set": [ + "wss://server-two:9925", + { + "hostname": "server-three", + "port": 9930 + } + ], + "skipped": [] } ``` -*** +--- ## Cluster Get Routes Gets the replication routes from the Harper config file. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_get_routes` +- operation _(required)_ - must always be `cluster_get_routes` ### Body ```json { - "operation": "cluster_get_routes" + "operation": "cluster_get_routes" } ``` @@ -299,36 +296,36 @@ _Operation is restricted to super\_user roles only_ ```json [ - "wss://server-two:9925", - { - "hostname": "server-three", - "port": 9930 - } + "wss://server-two:9925", + { + "hostname": "server-three", + "port": 9930 + } ] ``` -*** +--- ## Cluster Delete Routes Removes route(s) from the Harper config file. Returns a deletion success message and arrays of deleted and skipped records. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_delete_routes` -* routes _required_ - Must be an array of route object(s) +- operation _(required)_ - must always be `cluster_delete_routes` +- routes _required_ - Must be an array of route object(s) ### Body ```json { - "operation": "cluster_delete_routes", - "routes": [ - { - "hostname": "server-three", - "port": 9930 - } - ] + "operation": "cluster_delete_routes", + "routes": [ + { + "hostname": "server-three", + "port": 9930 + } + ] } ``` @@ -336,13 +333,13 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "cluster routes successfully deleted", - "deleted": [ - { - "hostname": "server-three", - "port": 9930 - } - ], - "skipped": [] + "message": "cluster routes successfully deleted", + "deleted": [ + { + "hostname": "server-three", + "port": 9930 + } + ], + "skipped": [] } ``` diff --git a/site/versioned_docs/version-4.4/developers/operations-api/components.md b/site/versioned_docs/version-4.4/developers/operations-api/components.md index 927761bb..1ca4f42d 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/components.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/components.md @@ -8,18 +8,18 @@ title: Components Creates a new component project in the component root directory using a predefined template. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_component` -* project _(required)_ - the name of the project you wish to create -* replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - must always be `add_component` +- project _(required)_ - the name of the project you wish to create +- replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. ### Body ```json { - "operation": "add_component", - "project": "my-component" + "operation": "add_component", + "project": "my-component" } ``` @@ -27,11 +27,11 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Successfully added project: my-component" + "message": "Successfully added project: my-component" } ``` -*** +--- ## Deploy Component @@ -69,36 +69,36 @@ Or you can use a GitLab Project Access Token: https://my-project:@gitlab.com/my-group/my-project#semver:v1.0.0 ``` -Note that your component will be installed by NPM. If your component has dependencies, NPM will attempt to download and install these as well. NPM normally uses the public registry.npmjs.org registry. If you are installing without network access to this, you may wish to define [custom registry locations](https://docs.npmjs.com/cli/v8/configuring-npm/npmrc) if you have any dependencies that need to be installed. NPM will install the deployed component and any dependencies in node\_modules in the hdb root directory (typically `~/hdb/node_modules`). +Note that your component will be installed by NPM. If your component has dependencies, NPM will attempt to download and install these as well. NPM normally uses the public registry.npmjs.org registry. If you are installing without network access to this, you may wish to define [custom registry locations](https://docs.npmjs.com/cli/v8/configuring-npm/npmrc) if you have any dependencies that need to be installed. NPM will install the deployed component and any dependencies in node_modules in the hdb root directory (typically `~/hdb/node_modules`). _Note: After deploying a component a restart may be required_ -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `deploy_component` -* project _(required)_ - the name of the project you wish to deploy -* package _(optional)_ - this can be any valid GitHub or NPM reference -* payload _(optional)_ - a base64-encoded string representation of the .tar file. Must be a string -* restart _(optional)_ - must be either a boolean or the string `rolling`. If set to `rolling`, a rolling restart will be triggered after the component is deployed, meaning that each node in the cluster will be sequentially restarted (waiting for the last restart to start the next). If set to `true`, the restart will not be rolling, all nodes will be restarted in parallel. If `replicated` is `true`, the restart operations will be replicated across the cluster. -* replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. -* install\_command _(optional)_ - A command to use when installing the component. Must be a string. This can be used to install dependencies with pnpm or yarn, for example, like: `"install_command": "npm install -g pnpm && pnpm install"` +- operation _(required)_ - must always be `deploy_component` +- project _(required)_ - the name of the project you wish to deploy +- package _(optional)_ - this can be any valid GitHub or NPM reference +- payload _(optional)_ - a base64-encoded string representation of the .tar file. Must be a string +- restart _(optional)_ - must be either a boolean or the string `rolling`. If set to `rolling`, a rolling restart will be triggered after the component is deployed, meaning that each node in the cluster will be sequentially restarted (waiting for the last restart to start the next). If set to `true`, the restart will not be rolling, all nodes will be restarted in parallel. If `replicated` is `true`, the restart operations will be replicated across the cluster. +- replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. +- install_command _(optional)_ - A command to use when installing the component. Must be a string. This can be used to install dependencies with pnpm or yarn, for example, like: `"install_command": "npm install -g pnpm && pnpm install"` ### Body ```json { - "operation": "deploy_component", - "project": "my-component", - "payload": "A very large base64-encoded string representation of the .tar file" + "operation": "deploy_component", + "project": "my-component", + "payload": "A very large base64-encoded string representation of the .tar file" } ``` ```json { - "operation": "deploy_component", - "project": "my-component", - "package": "HarperDB/application-template", - "replicated": true + "operation": "deploy_component", + "project": "my-component", + "package": "HarperDB/application-template", + "replicated": true } ``` @@ -106,29 +106,29 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Successfully deployed: my-component" + "message": "Successfully deployed: my-component" } ``` -*** +--- ## Package Component Creates a temporary `.tar` file of the specified project folder, then reads it into a base64-encoded string and returns an object with the string and the payload. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `package_component` -* project _(required)_ - the name of the project you wish to package -* skip\_node\_modules _(optional)_ - if true, creates option for tar module that will exclude the project's node\_modules directory. Must be a boolean +- operation _(required)_ - must always be `package_component` +- project _(required)_ - the name of the project you wish to package +- skip_node_modules _(optional)_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean ### Body ```json { - "operation": "package_component", - "project": "my-component", - "skip_node_modules": true + "operation": "package_component", + "project": "my-component", + "skip_node_modules": true } ``` @@ -136,12 +136,12 @@ _Operation is restricted to super\_user roles only_ ```json { - "project": "my-component", - "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + "project": "my-component", + "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" } ``` -*** +--- ## Drop Component @@ -149,21 +149,21 @@ Deletes a file from inside the component project or deletes the complete project **If just `project` is provided it will delete all that projects local files and folders** -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_component` -* project _(required)_ - the name of the project you wish to delete or to delete from if using the `file` parameter -* file _(optional)_ - the path relative to your project folder of the file you wish to delete -* replicated _(optional)_ - if true, Harper will replicate the component deletion to all nodes in the cluster. Must be a boolean. -* restart _(optional)_ - if true, Harper will restart after dropping the component. Must be a boolean. +- operation _(required)_ - must always be `drop_component` +- project _(required)_ - the name of the project you wish to delete or to delete from if using the `file` parameter +- file _(optional)_ - the path relative to your project folder of the file you wish to delete +- replicated _(optional)_ - if true, Harper will replicate the component deletion to all nodes in the cluster. Must be a boolean. +- restart _(optional)_ - if true, Harper will restart after dropping the component. Must be a boolean. ### Body ```json { - "operation": "drop_component", - "project": "my-component", - "file": "utils/myUtils.js" + "operation": "drop_component", + "project": "my-component", + "file": "utils/myUtils.js" } ``` @@ -171,25 +171,25 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Successfully dropped: my-component/utils/myUtils.js" + "message": "Successfully dropped: my-component/utils/myUtils.js" } ``` -*** +--- ## Get Components Gets all local component files and folders and any component config from `harperdb-config.yaml` -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_components` +- operation _(required)_ - must always be `get_components` ### Body ```json { - "operation": "get_components" + "operation": "get_components" } ``` @@ -197,85 +197,85 @@ _Operation is restricted to super\_user roles only_ ```json { - "name": "components", - "entries": [ - { - "package": "HarperDB/application-template", - "name": "deploy-test-gh" - }, - { - "package": "@fastify/compress", - "name": "fast-compress" - }, - { - "name": "my-component", - "entries": [ - { - "name": "LICENSE", - "mtime": "2023-08-22T16:00:40.286Z", - "size": 1070 - }, - { - "name": "index.md", - "mtime": "2023-08-22T16:00:40.287Z", - "size": 1207 - }, - { - "name": "config.yaml", - "mtime": "2023-08-22T16:00:40.287Z", - "size": 1069 - }, - { - "name": "package.json", - "mtime": "2023-08-22T16:00:40.288Z", - "size": 145 - }, - { - "name": "resources.js", - "mtime": "2023-08-22T16:00:40.289Z", - "size": 583 - }, - { - "name": "schema.graphql", - "mtime": "2023-08-22T16:00:40.289Z", - "size": 466 - }, - { - "name": "utils", - "entries": [ - { - "name": "commonUtils.js", - "mtime": "2023-08-22T16:00:40.289Z", - "size": 583 - } - ] - } - ] - } - ] + "name": "components", + "entries": [ + { + "package": "HarperDB/application-template", + "name": "deploy-test-gh" + }, + { + "package": "@fastify/compress", + "name": "fast-compress" + }, + { + "name": "my-component", + "entries": [ + { + "name": "LICENSE", + "mtime": "2023-08-22T16:00:40.286Z", + "size": 1070 + }, + { + "name": "index.md", + "mtime": "2023-08-22T16:00:40.287Z", + "size": 1207 + }, + { + "name": "config.yaml", + "mtime": "2023-08-22T16:00:40.287Z", + "size": 1069 + }, + { + "name": "package.json", + "mtime": "2023-08-22T16:00:40.288Z", + "size": 145 + }, + { + "name": "resources.js", + "mtime": "2023-08-22T16:00:40.289Z", + "size": 583 + }, + { + "name": "schema.graphql", + "mtime": "2023-08-22T16:00:40.289Z", + "size": 466 + }, + { + "name": "utils", + "entries": [ + { + "name": "commonUtils.js", + "mtime": "2023-08-22T16:00:40.289Z", + "size": 583 + } + ] + } + ] + } + ] } ``` -*** +--- ## Get Component File Gets the contents of a file inside a component project. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_component_file` -* project _(required)_ - the name of the project where the file is located -* file _(required)_ - the path relative to your project folder of the file you wish to view -* encoding _(optional)_ - the encoding that will be passed to the read file call. Defaults to `utf8` +- operation _(required)_ - must always be `get_component_file` +- project _(required)_ - the name of the project where the file is located +- file _(required)_ - the path relative to your project folder of the file you wish to view +- encoding _(optional)_ - the encoding that will be passed to the read file call. Defaults to `utf8` ### Body ```json { - "operation": "get_component_file", - "project": "my-component", - "file": "resources.js" + "operation": "get_component_file", + "project": "my-component", + "file": "resources.js" } ``` @@ -283,33 +283,33 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "/**export class MyCustomResource extends tables.TableName {\n\t/ we can define our own custom POST handler\n\tpost(content) {\n\t\t/ do something with the incoming content;\n\t\treturn super.post(content);\n\t}\n\t/ or custom GET handler\n\tget() {\n\t\t/ we can modify this resource before returning\n\t\treturn super.get();\n\t}\n}\n */\n/ we can also define a custom resource without a specific table\nexport class Greeting extends Resource {\n\t/ a \"Hello, world!\" handler\n\tget() {\n\t\treturn { greeting: 'Hello, world!' };\n\t}\n}" + "message": "/**export class MyCustomResource extends tables.TableName {\n\t/ we can define our own custom POST handler\n\tpost(content) {\n\t\t/ do something with the incoming content;\n\t\treturn super.post(content);\n\t}\n\t/ or custom GET handler\n\tget() {\n\t\t/ we can modify this resource before returning\n\t\treturn super.get();\n\t}\n}\n */\n/ we can also define a custom resource without a specific table\nexport class Greeting extends Resource {\n\t/ a \"Hello, world!\" handler\n\tget() {\n\t\treturn { greeting: 'Hello, world!' };\n\t}\n}" } ``` -*** +--- ## Set Component File Creates or updates a file inside a component project. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_component_file` -* project _(required)_ - the name of the project the file is located in -* file _(required)_ - the path relative to your project folder of the file you wish to set -* payload _(required)_ - what will be written to the file -* encoding _(optional)_ - the encoding that will be passed to the write file call. Defaults to `utf8` -* replicated _(optional)_ - if true, Harper will replicate the component update to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - must always be `set_component_file` +- project _(required)_ - the name of the project the file is located in +- file _(required)_ - the path relative to your project folder of the file you wish to set +- payload _(required)_ - what will be written to the file +- encoding _(optional)_ - the encoding that will be passed to the write file call. Defaults to `utf8` +- replicated _(optional)_ - if true, Harper will replicate the component update to all nodes in the cluster. Must be a boolean. ### Body ```json { - "operation": "set_component_file", - "project": "my-component", - "file": "test.js", - "payload": "console.log('hello world')" + "operation": "set_component_file", + "project": "my-component", + "file": "test.js", + "payload": "console.log('hello world')" } ``` @@ -317,7 +317,7 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Successfully set component: test.js" + "message": "Successfully set component: test.js" } ``` @@ -325,25 +325,25 @@ _Operation is restricted to super\_user roles only_ Adds an SSH key for deploying components from private repositories. This will also create an ssh config file that will be used when deploying the components. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_ssh_key` -* name _(required)_ - the name of the key -* key _(required)_ - the private key contents. Line breaks must be delimited with -* host _(required)_ - the host for the ssh config (see below). Used as part of the `package` url when deploying a component using this key -* hostname _(required)_ - the hostname for the ssh config (see below). Used to map `host` to an actual domain (e.g. `github.com`) -* known\_hosts _(optional)_ - the public SSH keys of the host your component will be retrieved from. If `hostname` is `github.com` this will be retrieved automatically. Line breaks must be delimited with -* replicated _(optional)_ - if true, Harper will replicate the key to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - must always be `add_ssh_key` +- name _(required)_ - the name of the key +- key _(required)_ - the private key contents. Line breaks must be delimited with +- host _(required)_ - the host for the ssh config (see below). Used as part of the `package` url when deploying a component using this key +- hostname _(required)_ - the hostname for the ssh config (see below). Used to map `host` to an actual domain (e.g. `github.com`) +- known_hosts _(optional)_ - the public SSH keys of the host your component will be retrieved from. If `hostname` is `github.com` this will be retrieved automatically. Line breaks must be delimited with +- replicated _(optional)_ - if true, Harper will replicate the key to all nodes in the cluster. Must be a boolean. ### Body ```json { - "operation": "add_ssh_key", - "name": "harperdb-private-component", - "key": "-----BEGIN OPENSSH PRIVATE KEY-----\nthis\nis\na\nfake\nkey\n-----END OPENSSH PRIVATE KEY-----", - "host": "harperdb-private-component.github.com", - "hostname": "github.com" + "operation": "add_ssh_key", + "name": "harperdb-private-component", + "key": "-----BEGIN OPENSSH PRIVATE KEY-----\nthis\nis\na\nfake\nkey\n-----END OPENSSH PRIVATE KEY-----", + "host": "harperdb-private-component.github.com", + "hostname": "github.com" } ``` @@ -351,7 +351,7 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Added ssh key: harperdb-private-component" + "message": "Added ssh key: harperdb-private-component" } ``` @@ -378,22 +378,22 @@ Note that `deploy_component` with a package uses `npm install` so the url must b Updates the private key contents of an existing SSH key. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `update_ssh_key` -* name _(required)_ - the name of the key to be updated -* key _(required)_ - the private key contents. Line breaks must be delimited with -* replicated _(optional)_ - if true, Harper will replicate the key update to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - must always be `update_ssh_key` +- name _(required)_ - the name of the key to be updated +- key _(required)_ - the private key contents. Line breaks must be delimited with +- replicated _(optional)_ - if true, Harper will replicate the key update to all nodes in the cluster. Must be a boolean. ### Body ```json { - "operation": "update_ssh_key", - "name": "harperdb-private-component", - "key": "-----BEGIN OPENSSH PRIVATE KEY-----\nthis\nis\na\nNEWFAKE\nkey\n-----END OPENSSH PRIVATE KEY-----", - "host": "harperdb-private-component.github.com", - "hostname": "github.com" + "operation": "update_ssh_key", + "name": "harperdb-private-component", + "key": "-----BEGIN OPENSSH PRIVATE KEY-----\nthis\nis\na\nNEWFAKE\nkey\n-----END OPENSSH PRIVATE KEY-----", + "host": "harperdb-private-component.github.com", + "hostname": "github.com" } ``` @@ -401,7 +401,7 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Updated ssh key: harperdb-private-component" + "message": "Updated ssh key: harperdb-private-component" } ``` @@ -409,17 +409,17 @@ _Operation is restricted to super\_user roles only_ Deletes a SSH key. This will also remove it from the generated SSH config. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_ssh_key` -* name _(required)_ - the name of the key to be deleted -* replicated _(optional)_ - if true, Harper will replicate the key deletion to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - must always be `delete_ssh_key` +- name _(required)_ - the name of the key to be deleted +- replicated _(optional)_ - if true, Harper will replicate the key deletion to all nodes in the cluster. Must be a boolean. ### Body ```json { - "name": "harperdb-private-component" + "name": "harperdb-private-component" } ``` @@ -427,7 +427,7 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Deleted ssh key: harperdb-private-component" + "message": "Deleted ssh key: harperdb-private-component" } ``` @@ -435,15 +435,15 @@ _Operation is restricted to super\_user roles only_ List off the names of added SSH keys -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `list_ssh_keys` +- operation _(required)_ - must always be `list_ssh_keys` ### Body ```json { - "operation": "list_ssh_keys" + "operation": "list_ssh_keys" } ``` @@ -460,20 +460,20 @@ _Operation is restricted to super\_user roles only_ ## Set SSH Known Hosts -Sets the SSH known\_hosts file. This will overwrite the file. +Sets the SSH known_hosts file. This will overwrite the file. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_ssh_known_hosts` -* known\_hosts _(required)_ - The contents to set the known\_hosts to. Line breaks must be delimite d with -* replicated _(optional)_ - if true, Harper will replicate the known hosts to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - must always be `set_ssh_known_hosts` +- known_hosts _(required)_ - The contents to set the known_hosts to. Line breaks must be delimite d with +- replicated _(optional)_ - if true, Harper will replicate the known hosts to all nodes in the cluster. Must be a boolean. ### Body ```json { - "operation": "set_ssh_known_hosts", - "known_hosts": "github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=\ngithub.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl\ngithub.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=\n" + "operation": "set_ssh_known_hosts", + "known_hosts": "github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=\ngithub.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl\ngithub.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=\n" } ``` @@ -481,23 +481,23 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Known hosts successfully set" + "message": "Known hosts successfully set" } ``` ## Get SSH Known Hosts -Gets the contents of the known\_hosts file +Gets the contents of the known_hosts file -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_ssh_known_hosts` +- operation _(required)_ - must always be `get_ssh_known_hosts` ### Body ```json { - "operation": "get_ssh_known_hosts" + "operation": "get_ssh_known_hosts" } ``` @@ -505,6 +505,6 @@ _Operation is restricted to super\_user roles only_ ```json { - "known_hosts": "github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=\ngithub.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl\ngithub.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=\n" + "known_hosts": "github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=\ngithub.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl\ngithub.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=\n" } ``` diff --git a/site/versioned_docs/version-4.4/developers/operations-api/custom-functions.md b/site/versioned_docs/version-4.4/developers/operations-api/custom-functions.md index 042ff263..43effd1b 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/custom-functions.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/custom-functions.md @@ -10,21 +10,23 @@ Returns the state of the Custom functions server. This includes whether it is en _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `custom_function_status` +- operation _(required)_ - must always be `custom_function_status` ### Body + ```json { - "operation": "custom_functions_status" + "operation": "custom_functions_status" } ``` ### Response: 200 + ```json { - "is_enabled": true, - "port": 9926, - "directory": "/Users/myuser/hdb/custom_functions" + "is_enabled": true, + "port": 9926, + "directory": "/Users/myuser/hdb/custom_functions" } ``` @@ -36,13 +38,13 @@ Returns an array of projects within the Custom Functions root project directory. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_custom_functions` +- operation _(required)_ - must always be `get_custom_functions` ### Body ```json { - "operation": "get_custom_functions" + "operation": "get_custom_functions" } ``` @@ -50,11 +52,11 @@ _Operation is restricted to super_user roles only_ ```json { - "dogs": { - "routes": ["examples"], - "helpers":["example"], - "static":3 - } + "dogs": { + "routes": ["examples"], + "helpers": ["example"], + "static": 3 + } } ``` @@ -66,19 +68,19 @@ Returns the content of the specified file as text. HarperDStudio uses this call _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_custom_function` -* project _(required)_ - the name of the project containing the file for which you wish to get content -* type _(required)_ - the name of the sub-folder containing the file for which you wish to get content - must be either routes or helpers -* file _(required)_ - The name of the file for which you wish to get content - should not include the file extension (which is always .js) +- operation _(required)_ - must always be `get_custom_function` +- project _(required)_ - the name of the project containing the file for which you wish to get content +- type _(required)_ - the name of the sub-folder containing the file for which you wish to get content - must be either routes or helpers +- file _(required)_ - The name of the file for which you wish to get content - should not include the file extension (which is always .js) ### Body ```json { - "operation": "get_custom_function", - "project": "dogs", - "type": "helpers", - "file": "example" + "operation": "get_custom_function", + "project": "dogs", + "type": "helpers", + "file": "example" } ``` @@ -86,7 +88,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" + "message": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" } ``` @@ -98,21 +100,21 @@ Updates the content of the specified file. Harper Studio uses this call to save _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_custom_function` -* project _(required)_ - the name of the project containing the file for which you wish to set content -* type _(required)_ - the name of the sub-folder containing the file for which you wish to set content - must be either routes or helpers -* file _(required)_ - the name of the file for which you wish to set content - should not include the file extension (which is always .js) -* function_content _(required)_ - the content you wish to save into the specified file +- operation _(required)_ - must always be `set_custom_function` +- project _(required)_ - the name of the project containing the file for which you wish to set content +- type _(required)_ - the name of the sub-folder containing the file for which you wish to set content - must be either routes or helpers +- file _(required)_ - the name of the file for which you wish to set content - should not include the file extension (which is always .js) +- function*content *(required)\_ - the content you wish to save into the specified file ### Body ```json { - "operation": "set_custom_function", - "project": "dogs", - "type": "helpers", - "file": "example", - "function_content": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" + "operation": "set_custom_function", + "project": "dogs", + "type": "helpers", + "file": "example", + "function_content": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" } ``` @@ -120,7 +122,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully updated custom function: example.js" + "message": "Successfully updated custom function: example.js" } ``` @@ -132,19 +134,19 @@ Deletes the specified file. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_custom_function` -* project _(required)_ - the name of the project containing the file you wish to delete -* type _(required)_ - the name of the sub-folder containing the file you wish to delete. Must be either routes or helpers -* file _(required)_ - the name of the file you wish to delete. Should not include the file extension (which is always .js) +- operation _(required)_ - must always be `drop_custom_function` +- project _(required)_ - the name of the project containing the file you wish to delete +- type _(required)_ - the name of the sub-folder containing the file you wish to delete. Must be either routes or helpers +- file _(required)_ - the name of the file you wish to delete. Should not include the file extension (which is always .js) ### Body ```json { - "operation": "drop_custom_function", - "project": "dogs", - "type": "helpers", - "file": "example" + "operation": "drop_custom_function", + "project": "dogs", + "type": "helpers", + "file": "example" } ``` @@ -152,7 +154,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message":"Successfully deleted custom function: example.js" + "message": "Successfully deleted custom function: example.js" } ``` @@ -164,15 +166,15 @@ Creates a new project folder in the Custom Functions root project directory. It _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_custom_function_project` -* project _(required)_ - the name of the project you wish to create +- operation _(required)_ - must always be `add_custom_function_project` +- project _(required)_ - the name of the project you wish to create ### Body ```json { - "operation": "add_custom_function_project", - "project": "dogs" + "operation": "add_custom_function_project", + "project": "dogs" } ``` @@ -180,7 +182,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message":"Successfully created custom function project: dogs" + "message": "Successfully created custom function project: dogs" } ``` @@ -192,15 +194,15 @@ Deletes the specified project folder and all of its contents. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_custom_function_project` -* project _(required)_ - the name of the project you wish to delete +- operation _(required)_ - must always be `drop_custom_function_project` +- project _(required)_ - the name of the project you wish to delete ### Body ```json { - "operation": "drop_custom_function_project", - "project": "dogs" + "operation": "drop_custom_function_project", + "project": "dogs" } ``` @@ -208,7 +210,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully deleted project: dogs" + "message": "Successfully deleted project: dogs" } ``` @@ -220,17 +222,17 @@ Creates a .tar file of the specified project folder, then reads it into a base64 _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `package_custom_function_project` -* project _(required)_ - the name of the project you wish to package up for deployment -* skip_node_modules _(optional)_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean. +- operation _(required)_ - must always be `package_custom_function_project` +- project _(required)_ - the name of the project you wish to package up for deployment +- skip*node_modules *(optional)\_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean. ### Body ```json { - "operation": "package_custom_function_project", - "project": "dogs", - "skip_node_modules": true + "operation": "package_custom_function_project", + "project": "dogs", + "skip_node_modules": true } ``` @@ -238,9 +240,9 @@ _Operation is restricted to super_user roles only_ ```json { - "project": "dogs", - "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", - "file": "/tmp/d27f1154-5d82-43f0-a5fb-a3018f366081.tar" + "project": "dogs", + "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "file": "/tmp/d27f1154-5d82-43f0-a5fb-a3018f366081.tar" } ``` @@ -252,18 +254,17 @@ Takes the output of package_custom_function_project, decrypts the base64-encoded _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `deploy_custom_function_project` -* project _(required)_ - the name of the project you wish to deploy. Must be a string -* payload _(required)_ - a base64-encoded string representation of the .tar file. Must be a string - +- operation _(required)_ - must always be `deploy_custom_function_project` +- project _(required)_ - the name of the project you wish to deploy. Must be a string +- payload _(required)_ - a base64-encoded string representation of the .tar file. Must be a string ### Body ```json { - "operation": "deploy_custom_function_project", - "project": "dogs", - "payload": "A very large base64-encoded string represenation of the .tar file" + "operation": "deploy_custom_function_project", + "project": "dogs", + "payload": "A very large base64-encoded string represenation of the .tar file" } ``` @@ -271,6 +272,6 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully deployed project: dogs" + "message": "Successfully deployed project: dogs" } ``` diff --git a/site/versioned_docs/version-4.4/developers/operations-api/databases-and-tables.md b/site/versioned_docs/version-4.4/developers/operations-api/databases-and-tables.md index 27ec954e..eea77222 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/databases-and-tables.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/databases-and-tables.md @@ -1,364 +1,388 @@ --- -title: Databases and Tables +title: Databases and Tables --- -# Databases and Tables +# Databases and Tables ## Describe All + Returns the definitions of all databases and tables within the database. Record counts about 5000 records are estimated, as determining the exact count can be expensive. When the record count is estimated, this is indicated by the inclusion of a confidence interval of `estimated_record_range`. If you need the exact count, you can include an `"exact_count": true` in the operation, but be aware that this requires a full table scan (may be expensive). -* operation _(required)_ - must always be `describe_all` +- operation _(required)_ - must always be `describe_all` ### Body + ```json { - "operation": "describe_all" + "operation": "describe_all" } ``` ### Response: 200 + ```json { - "dev": { - "dog": { - "schema": "dev", - "name": "dog", - "hash_attribute": "id", - "audit": true, - "schema_defined": false, - "attributes": [ - { - "attribute": "id", - "indexed": true, - "is_primary_key": true - }, - { - "attribute": "__createdtime__", - "indexed": true - }, - { - "attribute": "__updatedtime__", - "indexed": true - }, - { - "attribute": "type", - "indexed": true - } - ], - "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", - "record_count": 4000, - "estimated_record_range": [3976, 4033], - "last_updated_record": 1697658683698.4504 - } - } + "dev": { + "dog": { + "schema": "dev", + "name": "dog", + "hash_attribute": "id", + "audit": true, + "schema_defined": false, + "attributes": [ + { + "attribute": "id", + "indexed": true, + "is_primary_key": true + }, + { + "attribute": "__createdtime__", + "indexed": true + }, + { + "attribute": "__updatedtime__", + "indexed": true + }, + { + "attribute": "type", + "indexed": true + } + ], + "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", + "record_count": 4000, + "estimated_record_range": [3976, 4033], + "last_updated_record": 1697658683698.4504 + } + } } ``` --- ## Describe database + Returns the definitions of all tables within the specified database. -* operation _(required)_ - must always be `describe_database` -* database _(optional)_ - database where the table you wish to describe lives. The default is `data` +- operation _(required)_ - must always be `describe_database` +- database _(optional)_ - database where the table you wish to describe lives. The default is `data` ### Body + ```json { - "operation": "describe_database", - "database": "dev" + "operation": "describe_database", + "database": "dev" } ``` ### Response: 200 + ```json { - "dog": { - "schema": "dev", - "name": "dog", - "hash_attribute": "id", - "audit": true, - "schema_defined": false, - "attributes": [ - { - "attribute": "id", - "indexed": true, - "is_primary_key": true - }, - { - "attribute": "__createdtime__", - "indexed": true - }, - { - "attribute": "__updatedtime__", - "indexed": true - }, - { - "attribute": "type", - "indexed": true - } - ], - "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", - "record_count": 4000, - "estimated_record_range": [3976, 4033], - "last_updated_record": 1697658683698.4504 - } + "dog": { + "schema": "dev", + "name": "dog", + "hash_attribute": "id", + "audit": true, + "schema_defined": false, + "attributes": [ + { + "attribute": "id", + "indexed": true, + "is_primary_key": true + }, + { + "attribute": "__createdtime__", + "indexed": true + }, + { + "attribute": "__updatedtime__", + "indexed": true + }, + { + "attribute": "type", + "indexed": true + } + ], + "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", + "record_count": 4000, + "estimated_record_range": [3976, 4033], + "last_updated_record": 1697658683698.4504 + } } ``` --- ## Describe Table + Returns the definition of the specified table. -* operation _(required)_ - must always be `describe_table` -* table _(required)_ - table you wish to describe -* database _(optional)_ - database where the table you wish to describe lives. The default is `data` +- operation _(required)_ - must always be `describe_table` +- table _(required)_ - table you wish to describe +- database _(optional)_ - database where the table you wish to describe lives. The default is `data` ### Body + ```json { - "operation": "describe_table", - "table": "dog" + "operation": "describe_table", + "table": "dog" } ``` ### Response: 200 + ```json { - "schema": "dev", - "name": "dog", - "hash_attribute": "id", - "audit": true, - "schema_defined": false, - "attributes": [ - { - "attribute": "id", - "indexed": true, - "is_primary_key": true - }, - { - "attribute": "__createdtime__", - "indexed": true - }, - { - "attribute": "__updatedtime__", - "indexed": true - }, - { - "attribute": "type", - "indexed": true - } - ], - "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", - "record_count": 4000, - "estimated_record_range": [3976, 4033], - "last_updated_record": 1697658683698.4504 + "schema": "dev", + "name": "dog", + "hash_attribute": "id", + "audit": true, + "schema_defined": false, + "attributes": [ + { + "attribute": "id", + "indexed": true, + "is_primary_key": true + }, + { + "attribute": "__createdtime__", + "indexed": true + }, + { + "attribute": "__updatedtime__", + "indexed": true + }, + { + "attribute": "type", + "indexed": true + } + ], + "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", + "record_count": 4000, + "estimated_record_range": [3976, 4033], + "last_updated_record": 1697658683698.4504 } ``` --- ## Create database + Create a new database. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `create_database` -* database _(optional)_ - name of the database you are creating. The default is `data` +- operation _(required)_ - must always be `create_database` +- database _(optional)_ - name of the database you are creating. The default is `data` ### Body + ```json { - "operation": "create_database", - "database": "dev" + "operation": "create_database", + "database": "dev" } ``` ### Response: 200 + ```json { - "message": "database 'dev' successfully created" + "message": "database 'dev' successfully created" } ``` --- ## Drop database + Drop an existing database. NOTE: Dropping a database will delete all tables and all of their records in that database. _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `drop_database` -* database _(required)_ - name of the database you are dropping -* replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - this should always be `drop_database` +- database _(required)_ - name of the database you are dropping +- replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. ### Body + ```json { - "operation": "drop_database", - "database": "dev" + "operation": "drop_database", + "database": "dev" } ``` ### Response: 200 + ```json { - "message": "successfully deleted 'dev'" + "message": "successfully deleted 'dev'" } ``` --- ## Create Table + Create a new table within a database. _Operation is restricted to super_user roles only_ - -* operation _(required)_ - must always be `create_table` -* database _(optional)_ - name of the database where you want your table to live. If the database does not exist, it will be created. If the `database` property is not provided it will default to `data`. -* table _(required)_ - name of the table you are creating -* primary_key _(required)_ - primary key for the table -* attributes _(optional)_ - an array of attributes that specifies the schema for the table, that is the set of attributes for the table. When attributes are supplied the table will not be considered a "dynamic schema" table, and attributes will not be auto-added when records with new properties are inserted. Each attribute is specified as: - * name _(required)_ - the name of the attribute - * indexed _(optional)_ - indicates if the attribute should be indexed - * type _(optional)_ - specifies the data type of the attribute (can be String, Int, Float, Date, ID, Any) -* expiration _(optional)_ - specifies the time-to-live or expiration of records in the table before they are evicted (records are not evicted on any timer if not specified). This is specified in seconds. +- operation _(required)_ - must always be `create_table` +- database _(optional)_ - name of the database where you want your table to live. If the database does not exist, it will be created. If the `database` property is not provided it will default to `data`. +- table _(required)_ - name of the table you are creating +- primary*key *(required)\_ - primary key for the table +- attributes _(optional)_ - an array of attributes that specifies the schema for the table, that is the set of attributes for the table. When attributes are supplied the table will not be considered a "dynamic schema" table, and attributes will not be auto-added when records with new properties are inserted. Each attribute is specified as: + - name _(required)_ - the name of the attribute + - indexed _(optional)_ - indicates if the attribute should be indexed + - type _(optional)_ - specifies the data type of the attribute (can be String, Int, Float, Date, ID, Any) +- expiration _(optional)_ - specifies the time-to-live or expiration of records in the table before they are evicted (records are not evicted on any timer if not specified). This is specified in seconds. ### Body + ```json { - "operation": "create_table", - "database": "dev", - "table": "dog", - "primary_key": "id" + "operation": "create_table", + "database": "dev", + "table": "dog", + "primary_key": "id" } ``` ### Response: 200 + ```json { - "message": "table 'dev.dog' successfully created." + "message": "table 'dev.dog' successfully created." } ``` --- ## Drop Table + Drop an existing database table. NOTE: Dropping a table will delete all associated records in that table. _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `drop_table` -* database _(optional)_ - database where the table you are dropping lives. The default is `data` -* table _(required)_ - name of the table you are dropping -* replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - this should always be `drop_table` +- database _(optional)_ - database where the table you are dropping lives. The default is `data` +- table _(required)_ - name of the table you are dropping +- replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. ### Body ```json { - "operation": "drop_table", - "database": "dev", - "table": "dog" + "operation": "drop_table", + "database": "dev", + "table": "dog" } ``` ### Response: 200 + ```json { - "message": "successfully deleted table 'dev.dog'" + "message": "successfully deleted table 'dev.dog'" } ``` --- -## Create Attribute +## Create Attribute + Create a new attribute within the specified table. **The create_attribute operation can be used for admins wishing to pre-define database values for setting role-based permissions or for any other reason.** _Note: Harper will automatically create new attributes on insert and update if they do not already exist within the database._ -* operation _(required)_ - must always be `create_attribute` -* database _(optional)_ - name of the database of the table you want to add your attribute. The default is `data` -* table _(required)_ - name of the table where you want to add your attribute to live -* attribute _(required)_ - name for the attribute +- operation _(required)_ - must always be `create_attribute` +- database _(optional)_ - name of the database of the table you want to add your attribute. The default is `data` +- table _(required)_ - name of the table where you want to add your attribute to live +- attribute _(required)_ - name for the attribute ### Body + ```json { - "operation": "create_attribute", - "database": "dev", - "table": "dog", - "attribute": "is_adorable" + "operation": "create_attribute", + "database": "dev", + "table": "dog", + "attribute": "is_adorable" } ``` ### Response: 200 + ```json { - "message": "inserted 1 of 1 records", - "skipped_hashes": [], - "inserted_hashes": [ - "383c0bef-5781-4e1c-b5c8-987459ad0831" - ] + "message": "inserted 1 of 1 records", + "skipped_hashes": [], + "inserted_hashes": ["383c0bef-5781-4e1c-b5c8-987459ad0831"] } ``` --- ## Drop Attribute + Drop an existing attribute from the specified table. NOTE: Dropping an attribute will delete all associated attribute values in that table. _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `drop_attribute` -* database _(optional)_ - database where the table you are dropping lives. The default is `data` -* table _(required)_ - table where the attribute you are dropping lives -* attribute _(required)_ - attribute that you intend to drop +- operation _(required)_ - this should always be `drop_attribute` +- database _(optional)_ - database where the table you are dropping lives. The default is `data` +- table _(required)_ - table where the attribute you are dropping lives +- attribute _(required)_ - attribute that you intend to drop ### Body ```json { - "operation": "drop_attribute", - "database": "dev", - "table": "dog", - "attribute": "is_adorable" + "operation": "drop_attribute", + "database": "dev", + "table": "dog", + "attribute": "is_adorable" } ``` ### Response: 200 + ```json { - "message": "successfully deleted attribute 'is_adorable'" + "message": "successfully deleted attribute 'is_adorable'" } ``` --- ## Get Backup + This will return a snapshot of the requested database. This provides a means for backing up the database through the operations API. The response will be the raw database file (in binary format), which can later be restored as a database file by copying into the appropriate hdb/databases directory (with Harper not running). The returned file is a snapshot of the database at the moment in time that the get_backup operation begins. This also supports backing up individual tables in a database. However, this is a more expensive operation than backing up a database in whole, and will lose any transactional atomicity between writes across tables, so generally it is recommended that you backup the entire database. It is important to note that trying to copy a database file that is in use (Harper actively running and writing to the file) using standard file copying tools is not safe (the copied file will likely be corrupt), which is why using this snapshot operation is recommended for backups (volume snapshots are also a good way to backup Harper databases). _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `get_backup` -* database _(required)_ - this is the database that will be snapshotted and returned -* table _(optional)_ - this will specify a specific table to backup -* tables _(optional)_ - this will specify a specific set of tables to backup +- operation _(required)_ - this should always be `get_backup` +- database _(required)_ - this is the database that will be snapshotted and returned +- table _(optional)_ - this will specify a specific table to backup +- tables _(optional)_ - this will specify a specific set of tables to backup ### Body ```json { - "operation": "get_backup", - "database": "dev" + "operation": "get_backup", + "database": "dev" } ``` ### Response: 200 + ``` The database in raw binary data format ``` diff --git a/site/versioned_docs/version-4.4/developers/operations-api/index.md b/site/versioned_docs/version-4.4/developers/operations-api/index.md index 5d63fb68..a032f81a 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/index.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/index.md @@ -19,21 +19,21 @@ Content-Type: application/json The operations API reference is available below and categorized by topic: -* [Quick Start Examples](./quickstart-examples) -* [Databases and Tables](./databases-and-tables) -* [NoSQL Operations](./nosql-operations) -* [Bulk Operations](./bulk-operations) -* [Users and Roles](./users-and-roles) -* [Clustering](./clustering) -* [Clustering with NATS](./clustering-nats) -* [Components](./components) -* [Registration](./registration) -* [Jobs](./jobs) -* [Logs](./logs) -* [Utilities](./utilities) -* [Token Authentication](./token-authentication) -* [SQL Operations](./sql-operations) -* [Advanced JSON SQL Examples](./advanced-json-sql-examples) +- [Quick Start Examples](./quickstart-examples) +- [Databases and Tables](./databases-and-tables) +- [NoSQL Operations](./nosql-operations) +- [Bulk Operations](./bulk-operations) +- [Users and Roles](./users-and-roles) +- [Clustering](./clustering) +- [Clustering with NATS](./clustering-nats) +- [Components](./components) +- [Registration](./registration) +- [Jobs](./jobs) +- [Logs](./logs) +- [Utilities](./utilities) +- [Token Authentication](./token-authentication) +- [SQL Operations](./sql-operations) +- [Advanced JSON SQL Examples](./advanced-json-sql-examples) • [Past Release API Documentation](https://olddocs.harperdb.io) diff --git a/site/versioned_docs/version-4.4/developers/operations-api/jobs.md b/site/versioned_docs/version-4.4/developers/operations-api/jobs.md index 8b05357f..173125a1 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/jobs.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/jobs.md @@ -1,82 +1,87 @@ --- -title: Jobs +title: Jobs --- -# Jobs +# Jobs ## Get Job + Returns job status, metrics, and messages for the specified job ID. -* operation _(required)_ - must always be `get_job` -* id _(required)_ - the id of the job you wish to view +- operation _(required)_ - must always be `get_job` +- id _(required)_ - the id of the job you wish to view ### Body ```json { - "operation": "get_job", - "id": "4a982782-929a-4507-8794-26dae1132def" + "operation": "get_job", + "id": "4a982782-929a-4507-8794-26dae1132def" } ``` ### Response: 200 + ```json [ - { - "__createdtime__": 1611615798782, - "__updatedtime__": 1611615801207, - "created_datetime": 1611615798774, - "end_datetime": 1611615801206, - "id": "4a982782-929a-4507-8794-26dae1132def", - "job_body": null, - "message": "successfully loaded 350 of 350 records", - "start_datetime": 1611615798805, - "status": "COMPLETE", - "type": "csv_url_load", - "user": "HDB_ADMIN", - "start_datetime_converted": "2021-01-25T23:03:18.805Z", - "end_datetime_converted": "2021-01-25T23:03:21.206Z" - } + { + "__createdtime__": 1611615798782, + "__updatedtime__": 1611615801207, + "created_datetime": 1611615798774, + "end_datetime": 1611615801206, + "id": "4a982782-929a-4507-8794-26dae1132def", + "job_body": null, + "message": "successfully loaded 350 of 350 records", + "start_datetime": 1611615798805, + "status": "COMPLETE", + "type": "csv_url_load", + "user": "HDB_ADMIN", + "start_datetime_converted": "2021-01-25T23:03:18.805Z", + "end_datetime_converted": "2021-01-25T23:03:21.206Z" + } ] ``` --- ## Search Jobs By Start Date + Returns a list of job statuses, metrics, and messages for all jobs executed within the specified time window. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `search_jobs_by_start_date` -* from_date _(required)_ - the date you wish to start the search -* to_date _(required)_ - the date you wish to end the search +- operation _(required)_ - must always be `search_jobs_by_start_date` +- from*date *(required)\_ - the date you wish to start the search +- to*date *(required)\_ - the date you wish to end the search ### Body + ```json { - "operation": "search_jobs_by_start_date", - "from_date": "2021-01-25T22:05:27.464+0000", - "to_date": "2021-01-25T23:05:27.464+0000" + "operation": "search_jobs_by_start_date", + "from_date": "2021-01-25T22:05:27.464+0000", + "to_date": "2021-01-25T23:05:27.464+0000" } ``` ### Response: 200 + ```json [ - { - "id": "942dd5cb-2368-48a5-8a10-8770ff7eb1f1", - "user": "HDB_ADMIN", - "type": "csv_url_load", - "status": "COMPLETE", - "start_datetime": 1611613284781, - "end_datetime": 1611613287204, - "job_body": null, - "message": "successfully loaded 350 of 350 records", - "created_datetime": 1611613284764, - "__createdtime__": 1611613284767, - "__updatedtime__": 1611613287207, - "start_datetime_converted": "2021-01-25T22:21:24.781Z", - "end_datetime_converted": "2021-01-25T22:21:27.204Z" - } + { + "id": "942dd5cb-2368-48a5-8a10-8770ff7eb1f1", + "user": "HDB_ADMIN", + "type": "csv_url_load", + "status": "COMPLETE", + "start_datetime": 1611613284781, + "end_datetime": 1611613287204, + "job_body": null, + "message": "successfully loaded 350 of 350 records", + "created_datetime": 1611613284764, + "__createdtime__": 1611613284767, + "__updatedtime__": 1611613287207, + "start_datetime_converted": "2021-01-25T22:21:24.781Z", + "end_datetime_converted": "2021-01-25T22:21:27.204Z" + } ] -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.4/developers/operations-api/logs.md b/site/versioned_docs/version-4.4/developers/operations-api/logs.md index b2b0e2b6..17eba72f 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/logs.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/logs.md @@ -8,27 +8,27 @@ title: Logs Returns log outputs from the primary Harper log based on the provided search criteria. [Read more about Harper logging here](../../administration/logging/standard-logging#read-logs-via-the-api). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_Log` -* start _(optional)_ - result to start with. Default is 0, the first log in `hdb.log`. Must be a number -* limit _(optional)_ - number of results returned. Default behavior is 1000. Must be a number -* level _(optional)_ - error level to filter on. Default behavior is all levels. Must be `notify`, `error`, `warn`, `info`, `debug` or `trace` -* from _(optional)_ - date to begin showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss`. Default is first log in `hdb.log` -* until _(optional)_ - date to end showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss`. Default is last log in `hdb.log` -* order _(optional)_ - order to display logs desc or asc by timestamp. By default, will maintain `hdb.log` order +- operation _(required)_ - must always be `read_Log` +- start _(optional)_ - result to start with. Default is 0, the first log in `hdb.log`. Must be a number +- limit _(optional)_ - number of results returned. Default behavior is 1000. Must be a number +- level _(optional)_ - error level to filter on. Default behavior is all levels. Must be `notify`, `error`, `warn`, `info`, `debug` or `trace` +- from _(optional)_ - date to begin showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss`. Default is first log in `hdb.log` +- until _(optional)_ - date to end showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss`. Default is last log in `hdb.log` +- order _(optional)_ - order to display logs desc or asc by timestamp. By default, will maintain `hdb.log` order ### Body ```json { - "operation": "read_log", - "start": 0, - "limit": 1000, - "level": "error", - "from": "2021-01-25T22:05:27.464+0000", - "until": "2021-01-25T23:05:27.464+0000", - "order": "desc" + "operation": "read_log", + "start": 0, + "limit": 1000, + "level": "error", + "from": "2021-01-25T22:05:27.464+0000", + "until": "2021-01-25T23:05:27.464+0000", + "order": "desc" } ``` @@ -36,56 +36,55 @@ _Operation is restricted to super\_user roles only_ ```json [ - { - "level": "notify", - "message": "Connected to cluster server.", - "timestamp": "2021-01-25T23:03:20.710Z", - "thread": "main/0", - "tags": [] - }, - { - "level": "warn", - "message": "Login failed", - "timestamp": "2021-01-25T22:24:45.113Z", - "thread": "http/9", - "tags": [] - }, - { - "level": "error", - "message": "unknown attribute 'name and breed'", - "timestamp": "2021-01-25T22:23:24.167Z", - "thread": "http/9", - "tags": [] - } + { + "level": "notify", + "message": "Connected to cluster server.", + "timestamp": "2021-01-25T23:03:20.710Z", + "thread": "main/0", + "tags": [] + }, + { + "level": "warn", + "message": "Login failed", + "timestamp": "2021-01-25T22:24:45.113Z", + "thread": "http/9", + "tags": [] + }, + { + "level": "error", + "message": "unknown attribute 'name and breed'", + "timestamp": "2021-01-25T22:23:24.167Z", + "thread": "http/9", + "tags": [] + } ] - ``` -*** +--- ## Read Transaction Log Returns all transactions logged for the specified database table. You may filter your results with the optional from, to, and limit fields. [Read more about Harper transaction logs here](./logs#read-transaction-log). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_transaction_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* from _(optional)_ - time format must be millisecond-based epoch in UTC -* to _(optional)_ - time format must be millisecond-based epoch in UTC -* limit _(optional)_ - max number of logs you want to receive. Must be a number +- operation _(required)_ - must always be `read_transaction_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- from _(optional)_ - time format must be millisecond-based epoch in UTC +- to _(optional)_ - time format must be millisecond-based epoch in UTC +- limit _(optional)_ - max number of logs you want to receive. Must be a number ### Body ```json { - "operation": "read_transaction_log", - "schema": "dev", - "table": "dog", - "from": 1560249020865, - "to": 1660585656639, - "limit": 10 + "operation": "read_transaction_log", + "schema": "dev", + "table": "dog", + "from": 1560249020865, + "to": 1660585656639, + "limit": 10 } ``` @@ -93,198 +92,198 @@ _Operation is restricted to super\_user roles only_ ```json [ - { - "operation": "insert", - "user": "admin", - "timestamp": 1660165619736, - "records": [ - { - "id": 1, - "dog_name": "Penny", - "owner_name": "Kyle", - "breed_id": 154, - "age": 7, - "weight_lbs": 38, - "__updatedtime__": 1660165619688, - "__createdtime__": 1660165619688 - } - ] - }, - { - "operation": "insert", - "user": "admin", - "timestamp": 1660165619813, - "records": [ - { - "id": 2, - "dog_name": "Harper", - "owner_name": "Stephen", - "breed_id": 346, - "age": 7, - "weight_lbs": 55, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 3, - "dog_name": "Alby", - "owner_name": "Kaylan", - "breed_id": 348, - "age": 7, - "weight_lbs": 84, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 4, - "dog_name": "Billy", - "owner_name": "Zach", - "breed_id": 347, - "age": 6, - "weight_lbs": 60, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 5, - "dog_name": "Rose Merry", - "owner_name": "Zach", - "breed_id": 348, - "age": 8, - "weight_lbs": 15, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 6, - "dog_name": "Kato", - "owner_name": "Kyle", - "breed_id": 351, - "age": 6, - "weight_lbs": 32, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 7, - "dog_name": "Simon", - "owner_name": "Fred", - "breed_id": 349, - "age": 3, - "weight_lbs": 35, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 8, - "dog_name": "Gemma", - "owner_name": "Stephen", - "breed_id": 350, - "age": 5, - "weight_lbs": 55, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 9, - "dog_name": "Yeti", - "owner_name": "Jaxon", - "breed_id": 200, - "age": 5, - "weight_lbs": 55, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 10, - "dog_name": "Monkey", - "owner_name": "Aron", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 11, - "dog_name": "Bode", - "owner_name": "Margo", - "breed_id": 104, - "age": 8, - "weight_lbs": 75, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 12, - "dog_name": "Tucker", - "owner_name": "David", - "breed_id": 346, - "age": 2, - "weight_lbs": 60, - "adorable": true, - "__updatedtime__": 1660165619798, - "__createdtime__": 1660165619798 - }, - { - "id": 13, - "dog_name": "Jagger", - "owner_name": "Margo", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true, - "__updatedtime__": 1660165619798, - "__createdtime__": 1660165619798 - } - ] - }, - { - "operation": "update", - "user": "admin", - "timestamp": 1660165620040, - "records": [ - { - "id": 1, - "dog_name": "Penny B", - "__updatedtime__": 1660165620036 - } - ] - } + { + "operation": "insert", + "user": "admin", + "timestamp": 1660165619736, + "records": [ + { + "id": 1, + "dog_name": "Penny", + "owner_name": "Kyle", + "breed_id": 154, + "age": 7, + "weight_lbs": 38, + "__updatedtime__": 1660165619688, + "__createdtime__": 1660165619688 + } + ] + }, + { + "operation": "insert", + "user": "admin", + "timestamp": 1660165619813, + "records": [ + { + "id": 2, + "dog_name": "Harper", + "owner_name": "Stephen", + "breed_id": 346, + "age": 7, + "weight_lbs": 55, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 3, + "dog_name": "Alby", + "owner_name": "Kaylan", + "breed_id": 348, + "age": 7, + "weight_lbs": 84, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 4, + "dog_name": "Billy", + "owner_name": "Zach", + "breed_id": 347, + "age": 6, + "weight_lbs": 60, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 5, + "dog_name": "Rose Merry", + "owner_name": "Zach", + "breed_id": 348, + "age": 8, + "weight_lbs": 15, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 6, + "dog_name": "Kato", + "owner_name": "Kyle", + "breed_id": 351, + "age": 6, + "weight_lbs": 32, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 7, + "dog_name": "Simon", + "owner_name": "Fred", + "breed_id": 349, + "age": 3, + "weight_lbs": 35, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 8, + "dog_name": "Gemma", + "owner_name": "Stephen", + "breed_id": 350, + "age": 5, + "weight_lbs": 55, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 9, + "dog_name": "Yeti", + "owner_name": "Jaxon", + "breed_id": 200, + "age": 5, + "weight_lbs": 55, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 10, + "dog_name": "Monkey", + "owner_name": "Aron", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 11, + "dog_name": "Bode", + "owner_name": "Margo", + "breed_id": 104, + "age": 8, + "weight_lbs": 75, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 12, + "dog_name": "Tucker", + "owner_name": "David", + "breed_id": 346, + "age": 2, + "weight_lbs": 60, + "adorable": true, + "__updatedtime__": 1660165619798, + "__createdtime__": 1660165619798 + }, + { + "id": 13, + "dog_name": "Jagger", + "owner_name": "Margo", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true, + "__updatedtime__": 1660165619798, + "__createdtime__": 1660165619798 + } + ] + }, + { + "operation": "update", + "user": "admin", + "timestamp": 1660165620040, + "records": [ + { + "id": 1, + "dog_name": "Penny B", + "__updatedtime__": 1660165620036 + } + ] + } ] ``` -*** +--- ## Delete Transaction Logs Before Deletes transaction log data for the specified database table that is older than the specified timestamp. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_transaction_log_before` -* schema _(required)_ - schema under which the transaction log resides. Must be a string -* table _(required)_ - table under which the transaction log resides. Must be a string -* timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC +- operation _(required)_ - must always be `delete_transaction_log_before` +- schema _(required)_ - schema under which the transaction log resides. Must be a string +- table _(required)_ - table under which the transaction log resides. Must be a string +- timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC ### Body ```json { - "operation": "delete_transaction_logs_before", - "schema": "dev", - "table": "dog", - "timestamp": 1598290282817 + "operation": "delete_transaction_logs_before", + "schema": "dev", + "table": "dog", + "timestamp": 1598290282817 } ``` @@ -292,31 +291,31 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Starting job with id 26a6d3a6-6d77-40f9-bee7-8d6ef479a126" + "message": "Starting job with id 26a6d3a6-6d77-40f9-bee7-8d6ef479a126" } ``` -*** +--- ## Read Audit Log -AuditLog must be enabled in the Harper configuration file to make this request. Returns a verbose history of all transactions logged for the specified database table, including original data records. You may filter your results with the optional search\_type and search\_values fields. [Read more about Harper transaction logs here.](../../administration/logging/transaction-logging#read_transaction_log) +AuditLog must be enabled in the Harper configuration file to make this request. Returns a verbose history of all transactions logged for the specified database table, including original data records. You may filter your results with the optional search_type and search_values fields. [Read more about Harper transaction logs here.](../../administration/logging/transaction-logging#read_transaction_log) -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search\_type _(optional)_ - possibilities are `hash_value`, `timestamp` and `username` -* search\_values _(optional)_ - an array of string or numbers relating to search\_type +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search_type _(optional)_ - possibilities are `hash_value`, `timestamp` and `username` +- search_values _(optional)_ - an array of string or numbers relating to search_type ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog" + "operation": "read_audit_log", + "schema": "dev", + "table": "dog" } ``` @@ -324,110 +323,99 @@ _Operation is restricted to super\_user roles only_ ```json [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585716133.01, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660585740558.415, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "fur_type": "coarse", - "__updatedtime__": 1660585740556 - } - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "delete", - "user_name": "admin", - "timestamp": 1660585759710.56, - "hash_values": [ - 444 - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585740556, - "__createdtime__": 1660585716128, - "fur_type": "coarse" - } - ] - } + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "hash_values": [318], + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585716133.01, + "hash_values": [444], + "records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660585740558.415, + "hash_values": [444], + "records": [ + { + "id": 444, + "fur_type": "coarse", + "__updatedtime__": 1660585740556 + } + ], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "delete", + "user_name": "admin", + "timestamp": 1660585759710.56, + "hash_values": [444], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585740556, + "__createdtime__": 1660585716128, + "fur_type": "coarse" + } + ] + } ] ``` -*** +--- ## Read Audit Log by timestamp AuditLog must be enabled in the Harper configuration file to make this request. Returns the transactions logged for the specified database table between the specified time window. [Read more about Harper transaction logs here](./logs#read-transaction-log). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search\_type _(optional)_ - timestamp -* search\_values _(optional)_ - an array containing a maximum of two values \[`from_timestamp`, `to_timestamp`] defining the range of transactions you would like to view. - * Timestamp format is millisecond-based epoch in UTC - * If no items are supplied then all transactions are returned - * If only one entry is supplied then all transactions after the supplied timestamp will be returned +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search_type _(optional)_ - timestamp +- search_values _(optional)_ - an array containing a maximum of two values \[`from_timestamp`, `to_timestamp`] defining the range of transactions you would like to view. + - Timestamp format is millisecond-based epoch in UTC + - If no items are supplied then all transactions are returned + - If only one entry is supplied then all transactions after the supplied timestamp will be returned ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "timestamp", - "search_values": [ - 1660585740558, - 1660585759710.56 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "timestamp", + "search_values": [1660585740558, 1660585759710.56] } ``` @@ -435,129 +423,117 @@ _Operation is restricted to super\_user roles only_ ```json [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585716133.01, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660585740558.415, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "fur_type": "coarse", - "__updatedtime__": 1660585740556 - } - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "delete", - "user_name": "admin", - "timestamp": 1660585759710.56, - "hash_values": [ - 444 - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585740556, - "__createdtime__": 1660585716128, - "fur_type": "coarse" - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660586298457.224, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "fur_type": "super fluffy", - "__updatedtime__": 1660586298455 - } - ], - "original_records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - } + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "hash_values": [318], + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585716133.01, + "hash_values": [444], + "records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660585740558.415, + "hash_values": [444], + "records": [ + { + "id": 444, + "fur_type": "coarse", + "__updatedtime__": 1660585740556 + } + ], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "delete", + "user_name": "admin", + "timestamp": 1660585759710.56, + "hash_values": [444], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585740556, + "__createdtime__": 1660585716128, + "fur_type": "coarse" + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660586298457.224, + "hash_values": [318], + "records": [ + { + "id": 318, + "fur_type": "super fluffy", + "__updatedtime__": 1660586298455 + } + ], + "original_records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + } ] ``` -*** +--- ## Read Audit Log by username AuditLog must be enabled in the Harper configuration file to make this request. Returns the transactions logged for the specified database table which were committed by the specified user. [Read more about Harper transaction logs here](../../administration/logging/transaction-logging#read_transaction_log). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search\_type _(optional)_ - username -* search\_values _(optional)_ - the Harper user for whom you would like to view transactions +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search_type _(optional)_ - username +- search_values _(optional)_ - the Harper user for whom you would like to view transactions ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "username", - "search_values": [ - "admin" - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "username", + "search_values": ["admin"] } ``` @@ -565,131 +541,119 @@ _Operation is restricted to super\_user roles only_ ```json { - "admin": [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585716133.01, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660585740558.415, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "fur_type": "coarse", - "__updatedtime__": 1660585740556 - } - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "delete", - "user_name": "admin", - "timestamp": 1660585759710.56, - "hash_values": [ - 444 - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585740556, - "__createdtime__": 1660585716128, - "fur_type": "coarse" - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660586298457.224, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "fur_type": "super fluffy", - "__updatedtime__": 1660586298455 - } - ], - "original_records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - } - ] + "admin": [ + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "hash_values": [318], + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585716133.01, + "hash_values": [444], + "records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660585740558.415, + "hash_values": [444], + "records": [ + { + "id": 444, + "fur_type": "coarse", + "__updatedtime__": 1660585740556 + } + ], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "delete", + "user_name": "admin", + "timestamp": 1660585759710.56, + "hash_values": [444], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585740556, + "__createdtime__": 1660585716128, + "fur_type": "coarse" + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660586298457.224, + "hash_values": [318], + "records": [ + { + "id": 318, + "fur_type": "super fluffy", + "__updatedtime__": 1660586298455 + } + ], + "original_records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + } + ] } ``` -*** +--- -## Read Audit Log by hash\_value +## Read Audit Log by hash_value AuditLog must be enabled in the Harper configuration file to make this request. Returns the transactions logged for the specified database table which were committed to the specified hash value(s). [Read more about Harper transaction logs here](../../administration/logging/transaction-logging#read_transaction_log). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search\_type _(optional)_ - hash\_value -* search\_values _(optional)_ - an array of hash\_attributes for which you wish to see transaction logs +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search_type _(optional)_ - hash_value +- search_values _(optional)_ - an array of hash_attributes for which you wish to see transaction logs ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "hash_value", - "search_values": [ - 318 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "hash_value", + "search_values": [318] } ``` @@ -697,65 +661,65 @@ _Operation is restricted to super\_user roles only_ ```json { - "318": [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660586298457.224, - "records": [ - { - "id": 318, - "fur_type": "super fluffy", - "__updatedtime__": 1660586298455 - } - ], - "original_records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - } - ] + "318": [ + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660586298457.224, + "records": [ + { + "id": 318, + "fur_type": "super fluffy", + "__updatedtime__": 1660586298455 + } + ], + "original_records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + } + ] } ``` -*** +--- ## Delete Audit Logs Before AuditLog must be enabled in the Harper configuration file to make this request. Deletes audit log data for the specified database table that is older than the specified timestamp. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_audit_logs_before` -* schema _(required)_ - schema under which the transaction log resides. Must be a string -* table _(required)_ - table under which the transaction log resides. Must be a string -* timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC +- operation _(required)_ - must always be `delete_audit_logs_before` +- schema _(required)_ - schema under which the transaction log resides. Must be a string +- table _(required)_ - table under which the transaction log resides. Must be a string +- timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC ### Body ```json { - "operation": "delete_audit_logs_before", - "schema": "dev", - "table": "dog", - "timestamp": 1660585759710.56 + "operation": "delete_audit_logs_before", + "schema": "dev", + "table": "dog", + "timestamp": 1660585759710.56 } ``` @@ -763,6 +727,6 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Starting job with id 7479e5f8-a86e-4fc9-add7-749493bc100f" + "message": "Starting job with id 7479e5f8-a86e-4fc9-add7-749493bc100f" } ``` diff --git a/site/versioned_docs/version-4.4/developers/operations-api/nosql-operations.md b/site/versioned_docs/version-4.4/developers/operations-api/nosql-operations.md index f52468ec..e8b9c7e2 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/nosql-operations.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/nosql-operations.md @@ -8,32 +8,32 @@ title: NoSQL Operations Adds one or more rows of data to a database table. Primary keys of the inserted JSON record may be supplied on insert. If a primary key is not provided, then a GUID or incremented number (depending on type) will be generated for each record. -* operation _(required)_ - must always be `insert` -* database _(optional)_ - database where the table you are inserting records into lives. The default is `data` -* table _(required)_ - table where you want to insert records -* records _(required)_ - array of one or more records for insert +- operation _(required)_ - must always be `insert` +- database _(optional)_ - database where the table you are inserting records into lives. The default is `data` +- table _(required)_ - table where you want to insert records +- records _(required)_ - array of one or more records for insert ### Body ```json { - "operation": "insert", - "database": "dev", - "table": "dog", - "records": [ - { - "id": 8, - "dog_name": "Harper", - "breed_id": 346, - "age": 7 - }, - { - "id": 9, - "dog_name": "Penny", - "breed_id": 154, - "age": 7 - } - ] + "operation": "insert", + "database": "dev", + "table": "dog", + "records": [ + { + "id": 8, + "dog_name": "Harper", + "breed_id": 346, + "age": 7 + }, + { + "id": 9, + "dog_name": "Penny", + "breed_id": 154, + "age": 7 + } + ] } ``` @@ -41,12 +41,9 @@ Adds one or more rows of data to a database table. Primary keys of the inserted ```json { - "message": "inserted 2 of 2 records", - "inserted_hashes": [ - 8, - 9 - ], - "skipped_hashes": [] + "message": "inserted 2 of 2 records", + "inserted_hashes": [8, 9], + "skipped_hashes": [] } ``` @@ -56,29 +53,29 @@ Adds one or more rows of data to a database table. Primary keys of the inserted Changes the values of specified attributes in one or more rows in a database table as identified by the primary key. NOTE: Primary key of the updated JSON record(s) MUST be supplied on update. -* operation _(required)_ - must always be `update` -* database _(optional)_ - database of the table you are updating records in. The default is `data` -* table _(required)_ - table where you want to update records -* records _(required)_ - array of one or more records for update +- operation _(required)_ - must always be `update` +- database _(optional)_ - database of the table you are updating records in. The default is `data` +- table _(required)_ - table where you want to update records +- records _(required)_ - array of one or more records for update ### Body ```json { - "operation": "update", - "database": "dev", - "table": "dog", - "records": [ - { - "id": 1, - "weight_lbs": 55 - }, - { - "id": 2, - "owner": "Kyle B", - "weight_lbs": 35 - } - ] + "operation": "update", + "database": "dev", + "table": "dog", + "records": [ + { + "id": 1, + "weight_lbs": 55 + }, + { + "id": 2, + "owner": "Kyle B", + "weight_lbs": 35 + } + ] } ``` @@ -86,12 +83,9 @@ Changes the values of specified attributes in one or more rows in a database tab ```json { - "message": "updated 2 of 2 records", - "update_hashes": [ - 1, - 3 - ], - "skipped_hashes": [] + "message": "updated 2 of 2 records", + "update_hashes": [1, 3], + "skipped_hashes": [] } ``` @@ -101,37 +95,37 @@ Changes the values of specified attributes in one or more rows in a database tab Changes the values of specified attributes for rows with matching primary keys that exist in the table. Adds rows to the database table for primary keys that do not exist or are not provided. -* operation _(required)_ - must always be `upsert` -* database _(optional)_ - database of the table you are updating records in. The default is `data` -* table _(required)_ - table where you want to update records -* records _(required)_ - array of one or more records for update +- operation _(required)_ - must always be `upsert` +- database _(optional)_ - database of the table you are updating records in. The default is `data` +- table _(required)_ - table where you want to update records +- records _(required)_ - array of one or more records for update ### Body ```json { - "operation": "upsert", - "database": "dev", - "table": "dog", - "records": [ - { - "id": 8, - "weight_lbs": 155 - }, - { - "name": "Bill", - "breed": "Pit Bull", - "id": 10, - "Age": 11, - "weight_lbs": 155 - }, - { - "name": "Harper", - "breed": "Mutt", - "age": 5, - "weight_lbs": 155 - } - ] + "operation": "upsert", + "database": "dev", + "table": "dog", + "records": [ + { + "id": 8, + "weight_lbs": 155 + }, + { + "name": "Bill", + "breed": "Pit Bull", + "id": 10, + "Age": 11, + "weight_lbs": 155 + }, + { + "name": "Harper", + "breed": "Mutt", + "age": 5, + "weight_lbs": 155 + } + ] } ``` @@ -139,12 +133,8 @@ Changes the values of specified attributes for rows with matching primary keys t ```json { - "message": "upserted 3 of 3 records", - "upserted_hashes": [ - 8, - 10, - "ea06fc8e-717b-4c6c-b69d-b29014054ab7" - ] + "message": "upserted 3 of 3 records", + "upserted_hashes": [8, 10, "ea06fc8e-717b-4c6c-b69d-b29014054ab7"] } ``` @@ -154,22 +144,19 @@ Changes the values of specified attributes for rows with matching primary keys t Removes one or more rows of data from a specified table. -* operation _(required)_ - must always be `delete` -* database _(optional)_ - database where the table you are deleting records lives. The default is `data` -* table _(required)_ - table where you want to deleting records -* ids _(required)_ - array of one or more primary key values, which identifies records to delete +- operation _(required)_ - must always be `delete` +- database _(optional)_ - database where the table you are deleting records lives. The default is `data` +- table _(required)_ - table where you want to deleting records +- ids _(required)_ - array of one or more primary key values, which identifies records to delete ### Body ```json { - "operation": "delete", - "database": "dev", - "table": "dog", - "ids": [ - 1, - 2 - ] + "operation": "delete", + "database": "dev", + "table": "dog", + "ids": [1, 2] } ``` @@ -177,12 +164,9 @@ Removes one or more rows of data from a specified table. ```json { - "message": "2 of 2 records successfully deleted", - "deleted_hashes": [ - 1, - 2 - ], - "skipped_hashes": [] + "message": "2 of 2 records successfully deleted", + "deleted_hashes": [1, 2], + "skipped_hashes": [] } ``` @@ -192,27 +176,21 @@ Removes one or more rows of data from a specified table. Returns data from a table for one or more primary keys. -* operation _(required)_ - must always be `search_by_id` -* database _(optional)_ - database where the table you are searching lives. The default is `data` -* table _(required)_ - table you wish to search -* ids _(required)_ - array of primary keys to retrieve -* get_attributes _(required)_ - define which attributes you want returned. _Use `['*']` to return all attributes_ +- operation _(required)_ - must always be `search_by_id` +- database _(optional)_ - database where the table you are searching lives. The default is `data` +- table _(required)_ - table you wish to search +- ids _(required)_ - array of primary keys to retrieve +- get*attributes *(required)_ - define which attributes you want returned. \_Use `['*']` to return all attributes_ ### Body ```json { - "operation": "search_by_id", - "database": "dev", - "table": "dog", - "ids": [ - 1, - 2 - ], - "get_attributes": [ - "dog_name", - "breed_id" - ] + "operation": "search_by_id", + "database": "dev", + "table": "dog", + "ids": [1, 2], + "get_attributes": ["dog_name", "breed_id"] } ``` @@ -220,14 +198,14 @@ Returns data from a table for one or more primary keys. ```json [ - { - "dog_name": "Penny", - "breed_id": 154 - }, - { - "dog_name": "Harper", - "breed_id": 346 - } + { + "dog_name": "Penny", + "breed_id": 154 + }, + { + "dog_name": "Harper", + "breed_id": 346 + } ] ``` @@ -237,26 +215,23 @@ Returns data from a table for one or more primary keys. Returns data from a table for a matching value. -* operation _(required)_ - must always be `search_by_value` -* database _(optional)_ - database where the table you are searching lives. The default is `data` -* table _(required)_ - table you wish to search -* search_attribute _(required)_ - attribute you wish to search can be any attribute -* search_value _(required)_ - value you wish to search - wild cards are allowed -* get_attributes _(required)_ - define which attributes you want returned. Use `['*']` to return all attributes +- operation _(required)_ - must always be `search_by_value` +- database _(optional)_ - database where the table you are searching lives. The default is `data` +- table _(required)_ - table you wish to search +- search*attribute *(required)\_ - attribute you wish to search can be any attribute +- search*value *(required)\_ - value you wish to search - wild cards are allowed +- get*attributes *(required)\_ - define which attributes you want returned. Use `['*']` to return all attributes ### Body ```json { - "operation": "search_by_value", - "database": "dev", - "table": "dog", - "search_attribute": "owner_name", - "search_value": "Ky*", - "get_attributes": [ - "id", - "dog_name" - ] + "operation": "search_by_value", + "database": "dev", + "table": "dog", + "search_attribute": "owner_name", + "search_value": "Ky*", + "get_attributes": ["id", "dog_name"] } ``` @@ -264,12 +239,12 @@ Returns data from a table for a matching value. ```json [ - { - "dog_name": "Penny" - }, - { - "dog_name": "Kato" - } + { + "dog_name": "Penny" + }, + { + "dog_name": "Kato" + } ] ``` @@ -279,74 +254,70 @@ Returns data from a table for a matching value. Returns data from a table for one or more matching conditions. This supports grouping of conditions to indicate order of operations as well. -* operation _(required)_ - must always be `search_by_conditions` -* database _(optional)_ - database where the table you are searching lives. The default is `data` -* table _(required)_ - table you wish to search -* operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` -* offset _(optional)_ - the number of records that the query results will skip. The default is `0` -* limit _(optional)_ - the number of records that the query results will include. The default is `null`, resulting in no limit -* sort _optional_ - This is an object that indicates the sort order. It has the following properties: - * attribute _(required)_ - The attribute to sort by - * descending _(optional)_ - If true, will sort in descending order (defaults to ascending order) - * next _(optional)_ - This can define the next sort object that will be used to break ties for sorting when there are multiple records with the same value for the first attribute (follows the same structure as `sort`, and can recursive additional attributes). -* get_attributes _(required)_ - define which attributes you want returned. Use `['*']` to return all attributes -* conditions _(required)_ - the array of conditions objects, specified below, to filter by. Must include one or more object in the array that are a condition or a grouped set of conditions. A condition has the following properties: - * search_attribute _(required)_ - the attribute you wish to search, can be any attribute - * search_type _(required)_ - the type of search to perform - `equals`, `not_equal`, `contains`, `starts_with`, `ends_with`, `greater_than`, `greater_than_equal`, `less_than`, `less_than_equal`, `between` - * search_value _(required)_ - case-sensitive value you wish to search. If the `search_type` is `between` then use an array of two values to search between - Or a set of grouped conditions has the following properties: - * operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` - * conditions _(required)_ - the array of conditions objects as described above. +- operation _(required)_ - must always be `search_by_conditions` +- database _(optional)_ - database where the table you are searching lives. The default is `data` +- table _(required)_ - table you wish to search +- operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` +- offset _(optional)_ - the number of records that the query results will skip. The default is `0` +- limit _(optional)_ - the number of records that the query results will include. The default is `null`, resulting in no limit +- sort _optional_ - This is an object that indicates the sort order. It has the following properties: + - attribute _(required)_ - The attribute to sort by + - descending _(optional)_ - If true, will sort in descending order (defaults to ascending order) + - next _(optional)_ - This can define the next sort object that will be used to break ties for sorting when there are multiple records with the same value for the first attribute (follows the same structure as `sort`, and can recursive additional attributes). +- get*attributes *(required)\_ - define which attributes you want returned. Use `['*']` to return all attributes +- conditions _(required)_ - the array of conditions objects, specified below, to filter by. Must include one or more object in the array that are a condition or a grouped set of conditions. A condition has the following properties: + - search*attribute *(required)\_ - the attribute you wish to search, can be any attribute + - search*type *(required)\_ - the type of search to perform - `equals`, `not_equal`, `contains`, `starts_with`, `ends_with`, `greater_than`, `greater_than_equal`, `less_than`, `less_than_equal`, `between` + - search*value *(required)\_ - case-sensitive value you wish to search. If the `search_type` is `between` then use an array of two values to search between + Or a set of grouped conditions has the following properties: + - operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` + - conditions _(required)_ - the array of conditions objects as described above. + ### Body ```json { - "operation": "search_by_conditions", - "database": "dev", - "table": "dog", - "operator": "and", - "offset": 0, - "limit": 10, - "sort": { - "attribute": "id", - "next": { - "dog_name": "age", - "descending": true - } - }, - "get_attributes": [ - "*" - ], - "conditions": [ - { - "search_attribute": "age", - "search_type": "between", - "search_value": [ - 5, - 8 - ] - }, - { - "search_attribute": "weight_lbs", - "search_type": "greater_than", - "search_value": 40 - }, - { - "operator": "or", - "conditions": [ - { - "search_attribute": "adorable", - "search_type": "equals", - "search_value": true - }, - { - "search_attribute": "lovable", - "search_type": "equals", - "search_value": true - } - ] - } - ] + "operation": "search_by_conditions", + "database": "dev", + "table": "dog", + "operator": "and", + "offset": 0, + "limit": 10, + "sort": { + "attribute": "id", + "next": { + "dog_name": "age", + "descending": true + } + }, + "get_attributes": ["*"], + "conditions": [ + { + "search_attribute": "age", + "search_type": "between", + "search_value": [5, 8] + }, + { + "search_attribute": "weight_lbs", + "search_type": "greater_than", + "search_value": 40 + }, + { + "operator": "or", + "conditions": [ + { + "search_attribute": "adorable", + "search_type": "equals", + "search_value": true + }, + { + "search_attribute": "lovable", + "search_type": "equals", + "search_value": true + } + ] + } + ] } ``` @@ -354,60 +325,60 @@ Returns data from a table for one or more matching conditions. This supports gro ```json [ - { - "__createdtime__": 1620227719791, - "__updatedtime__": 1620227719791, - "adorable": true, - "age": 7, - "breed_id": 346, - "dog_name": "Harper", - "id": 2, - "owner_name": "Stephen", - "weight_lbs": 55 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 7, - "breed_id": 348, - "dog_name": "Alby", - "id": 3, - "owner_name": "Kaylan", - "weight_lbs": 84 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 6, - "breed_id": 347, - "dog_name": "Billy", - "id": 4, - "owner_name": "Zach", - "weight_lbs": 60 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 5, - "breed_id": 250, - "dog_name": "Gemma", - "id": 8, - "owner_name": "Stephen", - "weight_lbs": 55 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 8, - "breed_id": 104, - "dog_name": "Bode", - "id": 11, - "owner_name": "Margo", - "weight_lbs": 75 - } + { + "__createdtime__": 1620227719791, + "__updatedtime__": 1620227719791, + "adorable": true, + "age": 7, + "breed_id": 346, + "dog_name": "Harper", + "id": 2, + "owner_name": "Stephen", + "weight_lbs": 55 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 7, + "breed_id": 348, + "dog_name": "Alby", + "id": 3, + "owner_name": "Kaylan", + "weight_lbs": 84 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 6, + "breed_id": 347, + "dog_name": "Billy", + "id": 4, + "owner_name": "Zach", + "weight_lbs": 60 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 5, + "breed_id": 250, + "dog_name": "Gemma", + "id": 8, + "owner_name": "Stephen", + "weight_lbs": 55 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 8, + "breed_id": 104, + "dog_name": "Bode", + "id": 11, + "owner_name": "Margo", + "weight_lbs": 75 + } ] ``` diff --git a/site/versioned_docs/version-4.4/developers/operations-api/quickstart-examples.md b/site/versioned_docs/version-4.4/developers/operations-api/quickstart-examples.md index 109d9cc8..a6c8f637 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/quickstart-examples.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/quickstart-examples.md @@ -4,13 +4,13 @@ title: Quick Start Examples # Quick Start Examples -Harper recommends utilizing [Harper Applications](../../developers/applications/) for defining databases, tables, and other functionality. However, this guide is a great way to get started using on the Harper Operations API. +Harper recommends utilizing [Harper Applications](../../developers/applications/) for defining databases, tables, and other functionality. However, this guide is a great way to get started using on the Harper Operations API. ## Create dog Table We first need to create a table. Since our company is named after our CEO's dog, lets create a table to store all our employees' dogs. We'll call this table, `dogs`. -Tables in Harper are schema-less, so we don't need to add any attributes other than a primary_key (in pre 4.2 versions this was referred to as the hash_attribute) to create this table. +Tables in Harper are schema-less, so we don't need to add any attributes other than a primary_key (in pre 4.2 versions this was referred to as the hash_attribute) to create this table. Harper does offer a `database` parameter that can be used to hold logical groupings of tables. The parameter is optional and if not provided the operation will default to using a database named `data`. @@ -20,9 +20,9 @@ If you receive an error response, make sure your Basic Authentication user and p ```json { - "operation": "create_table", - "table": "dog", - "primary_key": "id" + "operation": "create_table", + "table": "dog", + "primary_key": "id" } ``` @@ -30,22 +30,23 @@ If you receive an error response, make sure your Basic Authentication user and p ```json { - "message": "table 'data.dog' successfully created." + "message": "table 'data.dog' successfully created." } ``` --- ## Create breed Table + Now that we have a table to store our dog data, we also want to create a table to track known breeds. Just as with the dog table, the only attribute we need to specify is the `primary_key`. ### Body ```json { - "operation": "create_table", - "table": "breed", - "primary_key": "id" + "operation": "create_table", + "table": "breed", + "primary_key": "id" } ``` @@ -53,7 +54,7 @@ Now that we have a table to store our dog data, we also want to create a table t ```json { - "message": "table 'data.breed' successfully created." + "message": "table 'data.breed' successfully created." } ``` @@ -67,18 +68,18 @@ We're ready to add some dog data. Penny is our CTO's pup, so she gets ID 1 or we ```json { - "operation": "insert", - "table": "dog", - "records": [ - { - "id": 1, - "dog_name": "Penny", - "owner_name": "Kyle", - "breed_id": 154, - "age": 7, - "weight_lbs": 38 - } - ] + "operation": "insert", + "table": "dog", + "records": [ + { + "id": 1, + "dog_name": "Penny", + "owner_name": "Kyle", + "breed_id": 154, + "age": 7, + "weight_lbs": 38 + } + ] } ``` @@ -86,11 +87,9 @@ We're ready to add some dog data. Penny is our CTO's pup, so she gets ID 1 or we ```json { - "message": "inserted 1 of 1 records", - "inserted_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "inserted 1 of 1 records", + "inserted_hashes": [1], + "skipped_hashes": [] } ``` @@ -104,118 +103,118 @@ Let's add some more Harper doggies! We can add as many dog objects as we want in ```json { - "operation": "insert", - "table": "dog", - "records": [ - { - "id": 2, - "dog_name": "Harper", - "owner_name": "Stephen", - "breed_id": 346, - "age": 7, - "weight_lbs": 55, - "adorable": true - }, - { - "id": 3, - "dog_name": "Alby", - "owner_name": "Kaylan", - "breed_id": 348, - "age": 7, - "weight_lbs": 84, - "adorable": true - }, - { - "id": 4, - "dog_name": "Billy", - "owner_name": "Zach", - "breed_id": 347, - "age": 6, - "weight_lbs": 60, - "adorable": true - }, - { - "id": 5, - "dog_name": "Rose Merry", - "owner_name": "Zach", - "breed_id": 348, - "age": 8, - "weight_lbs": 15, - "adorable": true - }, - { - "id": 6, - "dog_name": "Kato", - "owner_name": "Kyle", - "breed_id": 351, - "age": 6, - "weight_lbs": 32, - "adorable": true - }, - { - "id": 7, - "dog_name": "Simon", - "owner_name": "Fred", - "breed_id": 349, - "age": 3, - "weight_lbs": 35, - "adorable": true - }, - { - "id": 8, - "dog_name": "Gemma", - "owner_name": "Stephen", - "breed_id": 350, - "age": 5, - "weight_lbs": 55, - "adorable": true - }, - { - "id": 9, - "dog_name": "Yeti", - "owner_name": "Jaxon", - "breed_id": 200, - "age": 5, - "weight_lbs": 55, - "adorable": true - }, - { - "id": 10, - "dog_name": "Monkey", - "owner_name": "Aron", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true - }, - { - "id": 11, - "dog_name": "Bode", - "owner_name": "Margo", - "breed_id": 104, - "age": 8, - "weight_lbs": 75, - "adorable": true - }, - { - "id": 12, - "dog_name": "Tucker", - "owner_name": "David", - "breed_id": 346, - "age": 2, - "weight_lbs": 60, - "adorable": true - }, - { - "id": 13, - "dog_name": "Jagger", - "owner_name": "Margo", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true - } - ] + "operation": "insert", + "table": "dog", + "records": [ + { + "id": 2, + "dog_name": "Harper", + "owner_name": "Stephen", + "breed_id": 346, + "age": 7, + "weight_lbs": 55, + "adorable": true + }, + { + "id": 3, + "dog_name": "Alby", + "owner_name": "Kaylan", + "breed_id": 348, + "age": 7, + "weight_lbs": 84, + "adorable": true + }, + { + "id": 4, + "dog_name": "Billy", + "owner_name": "Zach", + "breed_id": 347, + "age": 6, + "weight_lbs": 60, + "adorable": true + }, + { + "id": 5, + "dog_name": "Rose Merry", + "owner_name": "Zach", + "breed_id": 348, + "age": 8, + "weight_lbs": 15, + "adorable": true + }, + { + "id": 6, + "dog_name": "Kato", + "owner_name": "Kyle", + "breed_id": 351, + "age": 6, + "weight_lbs": 32, + "adorable": true + }, + { + "id": 7, + "dog_name": "Simon", + "owner_name": "Fred", + "breed_id": 349, + "age": 3, + "weight_lbs": 35, + "adorable": true + }, + { + "id": 8, + "dog_name": "Gemma", + "owner_name": "Stephen", + "breed_id": 350, + "age": 5, + "weight_lbs": 55, + "adorable": true + }, + { + "id": 9, + "dog_name": "Yeti", + "owner_name": "Jaxon", + "breed_id": 200, + "age": 5, + "weight_lbs": 55, + "adorable": true + }, + { + "id": 10, + "dog_name": "Monkey", + "owner_name": "Aron", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true + }, + { + "id": 11, + "dog_name": "Bode", + "owner_name": "Margo", + "breed_id": 104, + "age": 8, + "weight_lbs": 75, + "adorable": true + }, + { + "id": 12, + "dog_name": "Tucker", + "owner_name": "David", + "breed_id": 346, + "age": 2, + "weight_lbs": 60, + "adorable": true + }, + { + "id": 13, + "dog_name": "Jagger", + "owner_name": "Margo", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true + } + ] } ``` @@ -223,22 +222,9 @@ Let's add some more Harper doggies! We can add as many dog objects as we want in ```json { - "message": "inserted 12 of 12 records", - "inserted_hashes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13 - ], - "skipped_hashes": [] + "message": "inserted 12 of 12 records", + "inserted_hashes": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], + "skipped_hashes": [] } ``` @@ -254,9 +240,9 @@ Each header in a column will be considered as an attribute, and each row in the ```json { - "operation": "csv_url_load", - "table": "breed", - "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" + "operation": "csv_url_load", + "table": "breed", + "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" } ``` @@ -264,8 +250,8 @@ Each header in a column will be considered as an attribute, and each row in the ```json { - "message": "Starting job with id e77d63b9-70d5-499c-960f-6736718a4369", - "job_id": "e77d63b9-70d5-499c-960f-6736718a4369" + "message": "Starting job with id e77d63b9-70d5-499c-960f-6736718a4369", + "job_id": "e77d63b9-70d5-499c-960f-6736718a4369" } ``` @@ -279,14 +265,14 @@ Harper supports NoSQL and SQL commands. We're going to update the dog table to s ```json { - "operation": "update", - "table": "dog", - "records": [ - { - "id": 1, - "dog_name": "Penny B" - } - ] + "operation": "update", + "table": "dog", + "records": [ + { + "id": 1, + "dog_name": "Penny B" + } + ] } ``` @@ -294,11 +280,9 @@ Harper supports NoSQL and SQL commands. We're going to update the dog table to s ```json { - "message": "updated 1 of 1 records", - "update_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "updated 1 of 1 records", + "update_hashes": [1], + "skipped_hashes": [] } ``` @@ -312,8 +296,8 @@ Now we're going to use a simple SQL SELECT call to pull Penny's updated data. No ```json { - "operation": "sql", - "sql": "SELECT * FROM data.dog where id = 1" + "operation": "sql", + "sql": "SELECT * FROM data.dog where id = 1" } ``` @@ -321,17 +305,17 @@ Now we're going to use a simple SQL SELECT call to pull Penny's updated data. No ```json [ - { - "owner_name": "Kyle", - "adorable": null, - "breed_id": 154, - "__updatedtime__": 1610749428575, - "dog_name": "Penny B", - "weight_lbs": 38, - "id": 1, - "age": 7, - "__createdtime__": 1610749386566 - } + { + "owner_name": "Kyle", + "adorable": null, + "breed_id": 154, + "__updatedtime__": 1610749428575, + "dog_name": "Penny B", + "weight_lbs": 38, + "id": 1, + "age": 7, + "__createdtime__": 1610749386566 + } ] ``` @@ -345,8 +329,8 @@ Here's a more complex SQL command joining the breed table with the dog table. We ```json { - "operation": "sql", - "sql": "SELECT d.id, d.dog_name, d.owner_name, b.name, b.section FROM data.dog AS d INNER JOIN data.breed AS b ON d.breed_id = b.id WHERE d.owner_name IN ('Kyle', 'Zach', 'Stephen') AND b.section = 'Mutt' ORDER BY d.dog_name" + "operation": "sql", + "sql": "SELECT d.id, d.dog_name, d.owner_name, b.name, b.section FROM data.dog AS d INNER JOIN data.breed AS b ON d.breed_id = b.id WHERE d.owner_name IN ('Kyle', 'Zach', 'Stephen') AND b.section = 'Mutt' ORDER BY d.dog_name" } ``` @@ -354,34 +338,33 @@ Here's a more complex SQL command joining the breed table with the dog table. We ```json [ - { - "id": 4, - "dog_name": "Billy", - "owner_name": "Zach", - "name": "LABRADOR / GREAT DANE MIX", - "section": "Mutt" - }, - { - "id": 8, - "dog_name": "Gemma", - "owner_name": "Stephen", - "name": "SHORT HAIRED SETTER MIX", - "section": "Mutt" - }, - { - "id": 2, - "dog_name": "Harper", - "owner_name": "Stephen", - "name": "HUSKY MIX", - "section": "Mutt" - }, - { - "id": 5, - "dog_name": "Rose Merry", - "owner_name": "Zach", - "name": "TERRIER MIX", - "section": "Mutt" - } + { + "id": 4, + "dog_name": "Billy", + "owner_name": "Zach", + "name": "LABRADOR / GREAT DANE MIX", + "section": "Mutt" + }, + { + "id": 8, + "dog_name": "Gemma", + "owner_name": "Stephen", + "name": "SHORT HAIRED SETTER MIX", + "section": "Mutt" + }, + { + "id": 2, + "dog_name": "Harper", + "owner_name": "Stephen", + "name": "HUSKY MIX", + "section": "Mutt" + }, + { + "id": 5, + "dog_name": "Rose Merry", + "owner_name": "Zach", + "name": "TERRIER MIX", + "section": "Mutt" + } ] - ``` diff --git a/site/versioned_docs/version-4.4/developers/operations-api/registration.md b/site/versioned_docs/version-4.4/developers/operations-api/registration.md index 366b0189..56775c5d 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/registration.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/registration.md @@ -1,16 +1,17 @@ --- -title: Registration +title: Registration --- -# Registration - +# Registration ## Registration Info + Returns the registration data of the Harper instance. -* operation _(required)_ - must always be `registration_info` +- operation _(required)_ - must always be `registration_info` ### Body + ```json { "operation": "registration_info" @@ -18,50 +19,52 @@ Returns the registration data of the Harper instance. ``` ### Response: 200 + ```json { - "registered": true, - "version": "4.2.0", - "ram_allocation": 2048, - "license_expiration_date": "2022-01-15" + "registered": true, + "version": "4.2.0", + "ram_allocation": 2048, + "license_expiration_date": "2022-01-15" } ``` --- ## Get Fingerprint + Returns the Harper fingerprint, uniquely generated based on the machine, for licensing purposes. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_fingerprint` +- operation _(required)_ - must always be `get_fingerprint` ### Body ```json { - "operation": "get_fingerprint" + "operation": "get_fingerprint" } ``` --- ## Set License + Sets the Harper license as generated by Harper License Management software. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_license` -* key _(required)_ - your license key -* company _(required)_ - the company that was used in the license +- operation _(required)_ - must always be `set_license` +- key _(required)_ - your license key +- company _(required)_ - the company that was used in the license ### Body ```json { - "operation": "set_license", - "key": "", - "company": "" + "operation": "set_license", + "key": "", + "company": "" } ``` - diff --git a/site/versioned_docs/version-4.4/developers/operations-api/sql-operations.md b/site/versioned_docs/version-4.4/developers/operations-api/sql-operations.md index 9fcc6fb4..71dfa436 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/sql-operations.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/sql-operations.md @@ -1,122 +1,127 @@ --- -title: SQL Operations +title: SQL Operations --- :::warning Harper encourages developers to utilize other querying tools over SQL for performance purposes. Harper SQL is intended for data investigation purposes and uses cases where performance is not a priority. SQL optimizations are on our roadmap for the future. ::: -# SQL Operations +# SQL Operations ## Select + Executes the provided SQL statement. The SELECT statement is used to query data from the database. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body ```json { - "operation": "sql", - "sql": "SELECT * FROM dev.dog WHERE id = 1" + "operation": "sql", + "sql": "SELECT * FROM dev.dog WHERE id = 1" } ``` ### Response: 200 + ```json [ - { - "id": 1, - "age": 7, - "dog_name": "Penny", - "weight_lbs": 38, - "breed_id": 154, - "owner_name": "Kyle", - "adorable": true, - "__createdtime__": 1611614106043, - "__updatedtime__": 1611614119507 - } + { + "id": 1, + "age": 7, + "dog_name": "Penny", + "weight_lbs": 38, + "breed_id": 154, + "owner_name": "Kyle", + "adorable": true, + "__createdtime__": 1611614106043, + "__updatedtime__": 1611614119507 + } ] ``` --- ## Insert + Executes the provided SQL statement. The INSERT statement is used to add one or more rows to a database table. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body ```json { - "operation": "sql", - "sql": "INSERT INTO dev.dog (id, dog_name) VALUE (22, 'Simon')" + "operation": "sql", + "sql": "INSERT INTO dev.dog (id, dog_name) VALUE (22, 'Simon')" } ``` ### Response: 200 + ```json { - "message": "inserted 1 of 1 records", - "inserted_hashes": [ - 22 - ], - "skipped_hashes": [] + "message": "inserted 1 of 1 records", + "inserted_hashes": [22], + "skipped_hashes": [] } ``` + --- ## Update + Executes the provided SQL statement. The UPDATE statement is used to change the values of specified attributes in one or more rows in a database table. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body + ```json { - "operation": "sql", - "sql": "UPDATE dev.dog SET dog_name = 'penelope' WHERE id = 1" + "operation": "sql", + "sql": "UPDATE dev.dog SET dog_name = 'penelope' WHERE id = 1" } ``` ### Response: 200 + ```json { - "message": "updated 1 of 1 records", - "update_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "updated 1 of 1 records", + "update_hashes": [1], + "skipped_hashes": [] } ``` --- ## Delete + Executes the provided SQL statement. The DELETE statement is used to remove one or more rows of data from a database table. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body + ```json { - "operation": "sql", - "sql": "DELETE FROM dev.dog WHERE id = 1" + "operation": "sql", + "sql": "DELETE FROM dev.dog WHERE id = 1" } ``` ### Response: 200 + ```json { - "message": "1 of 1 record successfully deleted", - "deleted_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "1 of 1 record successfully deleted", + "deleted_hashes": [1], + "skipped_hashes": [] } ``` diff --git a/site/versioned_docs/version-4.4/developers/operations-api/token-authentication.md b/site/versioned_docs/version-4.4/developers/operations-api/token-authentication.md index 161c69b5..b9ff5b31 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/token-authentication.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/token-authentication.md @@ -1,54 +1,60 @@ --- -title: Token Authentication +title: Token Authentication --- -# Token Authentication +# Token Authentication ## Create Authentication Tokens + Creates the tokens needed for authentication: operation & refresh token. _Note - this operation does not require authorization to be set_ -* operation _(required)_ - must always be `create_authentication_tokens` -* username _(required)_ - username of user to generate tokens for -* password _(required)_ - password of user to generate tokens for +- operation _(required)_ - must always be `create_authentication_tokens` +- username _(required)_ - username of user to generate tokens for +- password _(required)_ - password of user to generate tokens for ### Body + ```json { - "operation": "create_authentication_tokens", - "username": "", - "password": "" + "operation": "create_authentication_tokens", + "username": "", + "password": "" } ``` ### Response: 200 + ```json { - "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA1MTUwMzQ5LCJzdWIiOiJvcGVyYXRpb24ifQ.TlV93BqavQVQntXTt_WeY5IjAuCshfd6RzhihLWFWhu1qEKLHdwg9o5Z4ASaNmfuyKBqbFw65IbOYKd348EXeC_T6d0GO3yUhICYWXkqhQnxVW_T-ECKc7m5Bty9HTgfeaJ2e2yW55nbZYWG_gLtNgObUjCziX20-gGGR25sNTRm78mLQPYQkBJph6WXwAuyQrX704h0NfvNqyAZSwjxgtjuuEftTJ7FutLrQSLGIBIYq9nsHrFkheiDSn-C8_WKJ_zATa4YIofjqn9g5wA6o_7kSNaU2-gWnCm_jbcAcfvOmXh6rd89z8pwPqnC0f131qHIBps9UHaC1oozzmu_C6bsg7905OoAdFFY42Vojs98SMbfRApRvwaS4SprBsam3izODNI64ZUBREu3l4SZDalUf2kN8XPVWkI1LKq_mZsdtqr1r11Z9xslI1wVdxjunYeanjBhs7_j2HTX7ieVGn1a23cWceUk8F1HDGe_KEuPQs03R73V8acq_freh-kPhIa4eLqmcHeBw3WcyNGW8GuP8kyQRkGuO5sQSzZqbr_YSbZdSShZWTWDE6RYYC9ZV9KJtHVxhs0hexUpcoqO8OtJocyltRjtDjhSm9oUxszYRaALu-h8YadZT9dEKzsyQIt30d7LS9ETmmGWx4nKSTME2bV21PnDv_rEc5R6gnE", - "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA3NjU1OTQ5LCJzdWIiOiJyZWZyZXNoIn0.znhJhkdSROBPP_GLRzAxYdjgQ3BuqpAbQB7zMSSOQJ3s83HnmZ10Bnpw_3L2aF-tOFgz_t6HUAvn26fNOLsspJD2aOvHPcVS4yLKS5nagpA6ar_pqng9f6Ebfs8ohguLCfHnHRJ8poLxuWRvWW9_9pIlDiwsj4yo3Mbxi3mW8Bbtnk2MwiNHFxTksD12Ne8EWz8q2jic5MjArqBBgR373oYoWU1oxpTM6gIsZCBRowXcc9XFy2vyRoggEUU4ISRFQ4ZY9ayJ-_jleSDCUamJSNQsdb1OUTvc6CxeYlLjCoV0ijRUB6p2XWNVezFhDu8yGqOeyGFJzArhxbVc_pl4UYd5aUVxhrO9DdhG29cY_mHV0FqfXphR9QllK--LJFTP4aFqkCxnVr7HSa17hL0ZVK1HaKrx21PAdCkVNZpD6J3RtRbTkfnIB_C3Be9jhOV3vpTf7ZGn_Bs3CPJi_sL313Z1yKSDAS5rXTPceEOcTPHjzkMP9Wz19KfFq_0kuiZdDmeYNqJeFPAgGJ-S0tO51krzyGqLyCCA32_W104GR8OoQi2gEED6HIx2G0-1rnLnefN6eHQiY5r-Q3Oj9e2y3EvqqgWOmEDw88-SjPTwQVnMbBHYN2RfluU7EmvDh6Saoe79Lhlu8ZeSJ1x6ZgA8-Cirraz1_526Tn8v5FGDfrc" + "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA1MTUwMzQ5LCJzdWIiOiJvcGVyYXRpb24ifQ.TlV93BqavQVQntXTt_WeY5IjAuCshfd6RzhihLWFWhu1qEKLHdwg9o5Z4ASaNmfuyKBqbFw65IbOYKd348EXeC_T6d0GO3yUhICYWXkqhQnxVW_T-ECKc7m5Bty9HTgfeaJ2e2yW55nbZYWG_gLtNgObUjCziX20-gGGR25sNTRm78mLQPYQkBJph6WXwAuyQrX704h0NfvNqyAZSwjxgtjuuEftTJ7FutLrQSLGIBIYq9nsHrFkheiDSn-C8_WKJ_zATa4YIofjqn9g5wA6o_7kSNaU2-gWnCm_jbcAcfvOmXh6rd89z8pwPqnC0f131qHIBps9UHaC1oozzmu_C6bsg7905OoAdFFY42Vojs98SMbfRApRvwaS4SprBsam3izODNI64ZUBREu3l4SZDalUf2kN8XPVWkI1LKq_mZsdtqr1r11Z9xslI1wVdxjunYeanjBhs7_j2HTX7ieVGn1a23cWceUk8F1HDGe_KEuPQs03R73V8acq_freh-kPhIa4eLqmcHeBw3WcyNGW8GuP8kyQRkGuO5sQSzZqbr_YSbZdSShZWTWDE6RYYC9ZV9KJtHVxhs0hexUpcoqO8OtJocyltRjtDjhSm9oUxszYRaALu-h8YadZT9dEKzsyQIt30d7LS9ETmmGWx4nKSTME2bV21PnDv_rEc5R6gnE", + "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA3NjU1OTQ5LCJzdWIiOiJyZWZyZXNoIn0.znhJhkdSROBPP_GLRzAxYdjgQ3BuqpAbQB7zMSSOQJ3s83HnmZ10Bnpw_3L2aF-tOFgz_t6HUAvn26fNOLsspJD2aOvHPcVS4yLKS5nagpA6ar_pqng9f6Ebfs8ohguLCfHnHRJ8poLxuWRvWW9_9pIlDiwsj4yo3Mbxi3mW8Bbtnk2MwiNHFxTksD12Ne8EWz8q2jic5MjArqBBgR373oYoWU1oxpTM6gIsZCBRowXcc9XFy2vyRoggEUU4ISRFQ4ZY9ayJ-_jleSDCUamJSNQsdb1OUTvc6CxeYlLjCoV0ijRUB6p2XWNVezFhDu8yGqOeyGFJzArhxbVc_pl4UYd5aUVxhrO9DdhG29cY_mHV0FqfXphR9QllK--LJFTP4aFqkCxnVr7HSa17hL0ZVK1HaKrx21PAdCkVNZpD6J3RtRbTkfnIB_C3Be9jhOV3vpTf7ZGn_Bs3CPJi_sL313Z1yKSDAS5rXTPceEOcTPHjzkMP9Wz19KfFq_0kuiZdDmeYNqJeFPAgGJ-S0tO51krzyGqLyCCA32_W104GR8OoQi2gEED6HIx2G0-1rnLnefN6eHQiY5r-Q3Oj9e2y3EvqqgWOmEDw88-SjPTwQVnMbBHYN2RfluU7EmvDh6Saoe79Lhlu8ZeSJ1x6ZgA8-Cirraz1_526Tn8v5FGDfrc" } ``` --- ## Refresh Operation Token + This operation creates a new operation token. -* operation _(required)_ - must always be `refresh_operation_token` -* refresh_token _(required)_ - the refresh token that was provided when tokens were created +- operation _(required)_ - must always be `refresh_operation_token` +- refresh*token *(required)\_ - the refresh token that was provided when tokens were created ### Body + ```json { - "operation": "refresh_operation_token", - "refresh_token": "EXISTING_REFRESH_TOKEN" + "operation": "refresh_operation_token", + "refresh_token": "EXISTING_REFRESH_TOKEN" } ``` ### Response: 200 + ```json { - "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6eyJfX2NyZWF0ZWR0aW1lX18iOjE2MDQ1MTc4Nzk1MjMsIl9fdXBkYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMywiYWN0aXZlIjp0cnVlLCJhdXRoX3Rva2VuIjpudWxsLCJyb2xlIjp7Il9fY3JlYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMSwiX191cGRhdGVkdGltZV9fIjoxNjA0NTE3ODc5NTIxLCJpZCI6IjZhYmRjNGJhLWU5MjQtNDlhNi1iOGY0LWM1NWUxYmQ0OTYzZCIsInBlcm1pc3Npb24iOnsic3VwZXJfdXNlciI6dHJ1ZSwic3lzdGVtIjp7InRhYmxlcyI6eyJoZGJfdGFibGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9hdHRyaWJ1dGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9zY2hlbWEiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl91c2VyIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfcm9sZSI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2pvYiI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2xpY2Vuc2UiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9pbmZvIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfbm9kZXMiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl90ZW1wIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119fX19LCJyb2xlIjoic3VwZXJfdXNlciJ9LCJ1c2VybmFtZSI6IkhEQl9BRE1JTiJ9LCJpYXQiOjE2MDUwNjQ0MjMsImV4cCI6MTYwNTE1MDgyMywic3ViIjoib3BlcmF0aW9uIn0.VVZdhlh7_xFEaGPwhAh6VJ1d7eisiF3ok3ZwLTQAMWZB6umb2S7pPSTbXAmqAGHRlFAK3BYfnwT3YWt0gZbHvk24_0x3s_dej3PYJ8khIxzMjqpkR6qSjQIC2dhKqpwRPNtoqW_xnep9L-qf5iPtqkwsqWhF1c5VSN8nFouLWMZSuJ6Mag04soNhFvY0AF6QiTyzajMTb6uurRMWOnxk8hwMrY_5xtupabqtZheXP_0DV8l10B7GFi_oWf_lDLmwRmNbeUfW8ZyCIJMj36bjN3PsfVIxog87SWKKCwbWZWfJWw0KEph-HvU0ay35deyGWPIaDQmujuh2vtz-B0GoIAC58PJdXNyQRzES_nSb6Oqc_wGZsLM6EsNn_lrIp3mK_3a5jirZ8s6Z2SfcYKaLF2hCevdm05gRjFJ6ijxZrUSOR2S415wLxmqCCWCp_-sEUz8erUrf07_aj-Bv99GUub4b_znOsQF3uABKd4KKff2cNSMhAa-6sro5GDRRJg376dcLi2_9HOZbnSo90zrpVq8RNV900aydyzDdlXkZja8jdHBk4mxSSewYBvM7up6I0G4X-ZlzFOp30T7kjdLa6480Qp34iYRMMtq0Htpb5k2jPt8dNFnzW-Q2eRy1wNBbH3cCH0rd7_BIGuTCrl4hGU8QjlBiF7Gj0_-uJYhKnhg" + "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6eyJfX2NyZWF0ZWR0aW1lX18iOjE2MDQ1MTc4Nzk1MjMsIl9fdXBkYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMywiYWN0aXZlIjp0cnVlLCJhdXRoX3Rva2VuIjpudWxsLCJyb2xlIjp7Il9fY3JlYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMSwiX191cGRhdGVkdGltZV9fIjoxNjA0NTE3ODc5NTIxLCJpZCI6IjZhYmRjNGJhLWU5MjQtNDlhNi1iOGY0LWM1NWUxYmQ0OTYzZCIsInBlcm1pc3Npb24iOnsic3VwZXJfdXNlciI6dHJ1ZSwic3lzdGVtIjp7InRhYmxlcyI6eyJoZGJfdGFibGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9hdHRyaWJ1dGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9zY2hlbWEiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl91c2VyIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfcm9sZSI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2pvYiI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2xpY2Vuc2UiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9pbmZvIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfbm9kZXMiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl90ZW1wIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119fX19LCJyb2xlIjoic3VwZXJfdXNlciJ9LCJ1c2VybmFtZSI6IkhEQl9BRE1JTiJ9LCJpYXQiOjE2MDUwNjQ0MjMsImV4cCI6MTYwNTE1MDgyMywic3ViIjoib3BlcmF0aW9uIn0.VVZdhlh7_xFEaGPwhAh6VJ1d7eisiF3ok3ZwLTQAMWZB6umb2S7pPSTbXAmqAGHRlFAK3BYfnwT3YWt0gZbHvk24_0x3s_dej3PYJ8khIxzMjqpkR6qSjQIC2dhKqpwRPNtoqW_xnep9L-qf5iPtqkwsqWhF1c5VSN8nFouLWMZSuJ6Mag04soNhFvY0AF6QiTyzajMTb6uurRMWOnxk8hwMrY_5xtupabqtZheXP_0DV8l10B7GFi_oWf_lDLmwRmNbeUfW8ZyCIJMj36bjN3PsfVIxog87SWKKCwbWZWfJWw0KEph-HvU0ay35deyGWPIaDQmujuh2vtz-B0GoIAC58PJdXNyQRzES_nSb6Oqc_wGZsLM6EsNn_lrIp3mK_3a5jirZ8s6Z2SfcYKaLF2hCevdm05gRjFJ6ijxZrUSOR2S415wLxmqCCWCp_-sEUz8erUrf07_aj-Bv99GUub4b_znOsQF3uABKd4KKff2cNSMhAa-6sro5GDRRJg376dcLi2_9HOZbnSo90zrpVq8RNV900aydyzDdlXkZja8jdHBk4mxSSewYBvM7up6I0G4X-ZlzFOp30T7kjdLa6480Qp34iYRMMtq0Htpb5k2jPt8dNFnzW-Q2eRy1wNBbH3cCH0rd7_BIGuTCrl4hGU8QjlBiF7Gj0_-uJYhKnhg" } ``` diff --git a/site/versioned_docs/version-4.4/developers/operations-api/users-and-roles.md b/site/versioned_docs/version-4.4/developers/operations-api/users-and-roles.md index d95f3ad9..ecaa1117 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/users-and-roles.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/users-and-roles.md @@ -5,480 +5,504 @@ title: Users and Roles # Users and Roles ## List Roles + Returns a list of all roles. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `list_roles` +- operation _(required)_ - must always be `list_roles` ### Body + ```json { - "operation": "list_roles" + "operation": "list_roles" } ``` ### Response: 200 + ```json [ - { - "__createdtime__": 1611615061106, - "__updatedtime__": 1611615061106, - "id": "05c2ffcd-f780-40b1-9432-cfe8ba5ad890", - "permission": { - "super_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": true, - "insert": true, - "update": true - } - ] - } - } - } - }, - "role": "developer" - }, - { - "__createdtime__": 1610749235614, - "__updatedtime__": 1610749235614, - "id": "136f03fa-a0e9-46c3-bd5d-7f3e7dd5b564", - "permission": { - "cluster_user": true - }, - "role": "cluster_user" - }, - { - "__createdtime__": 1610749235609, - "__updatedtime__": 1610749235609, - "id": "745b3138-a7cf-455a-8256-ac03722eef12", - "permission": { - "super_user": true - }, - "role": "super_user" - } + { + "__createdtime__": 1611615061106, + "__updatedtime__": 1611615061106, + "id": "05c2ffcd-f780-40b1-9432-cfe8ba5ad890", + "permission": { + "super_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": true, + "insert": true, + "update": true + } + ] + } + } + } + }, + "role": "developer" + }, + { + "__createdtime__": 1610749235614, + "__updatedtime__": 1610749235614, + "id": "136f03fa-a0e9-46c3-bd5d-7f3e7dd5b564", + "permission": { + "cluster_user": true + }, + "role": "cluster_user" + }, + { + "__createdtime__": 1610749235609, + "__updatedtime__": 1610749235609, + "id": "745b3138-a7cf-455a-8256-ac03722eef12", + "permission": { + "super_user": true + }, + "role": "super_user" + } ] ``` --- ## Add Role + Creates a new role with the specified permissions. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_role` -* role _(required)_ - name of role you are defining -* permission _(required)_ - object defining permissions for users associated with this role: - * super_user _(optional)_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. - * structure_user (optional) - boolean OR array of database names (as strings). If boolean, user can create new databases and tables. If array of strings, users can only manage tables within the specified databases. This overrides any individual table permissions for specified databases, or for all databases if the value is true. +- operation _(required)_ - must always be `add_role` +- role _(required)_ - name of role you are defining +- permission _(required)_ - object defining permissions for users associated with this role: + - super*user *(optional)\_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. + - structure_user (optional) - boolean OR array of database names (as strings). If boolean, user can create new databases and tables. If array of strings, users can only manage tables within the specified databases. This overrides any individual table permissions for specified databases, or for all databases if the value is true. ### Body + ```json { - "operation": "add_role", - "role": "developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": true, - "insert": true, - "update": true - } - ] - } - } - } - } + "operation": "add_role", + "role": "developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": true, + "insert": true, + "update": true + } + ] + } + } + } + } } ``` ### Response: 200 + ```json { - "role": "developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": true, - "insert": true, - "update": true - } - ] - } - } - } - }, - "id": "0a9368b0-bd81-482f-9f5a-8722e3582f96", - "__updatedtime__": 1598549532897, - "__createdtime__": 1598549532897 + "role": "developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": true, + "insert": true, + "update": true + } + ] + } + } + } + }, + "id": "0a9368b0-bd81-482f-9f5a-8722e3582f96", + "__updatedtime__": 1598549532897, + "__createdtime__": 1598549532897 } ``` --- ## Alter Role + Modifies an existing role with the specified permissions. updates permissions from an existing role. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `alter_role` -* id _(required)_ - the id value for the role you are altering -* role _(optional)_ - name value to update on the role you are altering -* permission _(required)_ - object defining permissions for users associated with this role: - * super_user _(optional)_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. - * structure_user (optional) - boolean OR array of database names (as strings). If boolean, user can create new databases and tables. If array of strings, users can only manage tables within the specified databases. This overrides any individual table permissions for specified databases, or for all databases if the value is true. +- operation _(required)_ - must always be `alter_role` +- id _(required)_ - the id value for the role you are altering +- role _(optional)_ - name value to update on the role you are altering +- permission _(required)_ - object defining permissions for users associated with this role: + - super*user *(optional)\_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. + - structure_user (optional) - boolean OR array of database names (as strings). If boolean, user can create new databases and tables. If array of strings, users can only manage tables within the specified databases. This overrides any individual table permissions for specified databases, or for all databases if the value is true. ### Body ```json { - "operation": "alter_role", - "id": "f92162e2-cd17-450c-aae0-372a76859038", - "role": "another_developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": false, - "insert": true, - "update": true - } - ] - } - } - } - } + "operation": "alter_role", + "id": "f92162e2-cd17-450c-aae0-372a76859038", + "role": "another_developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": false, + "insert": true, + "update": true + } + ] + } + } + } + } } ``` ### Response: 200 + ```json { - "id": "a7cb91e9-32e4-4dbf-a327-fab4fa9191ea", - "role": "developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": false, - "insert": true, - "update": true - } - ] - } - } - } - }, - "__updatedtime__": 1598549996106 + "id": "a7cb91e9-32e4-4dbf-a327-fab4fa9191ea", + "role": "developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": false, + "insert": true, + "update": true + } + ] + } + } + } + }, + "__updatedtime__": 1598549996106 } ``` --- ## Drop Role + Deletes an existing role from the database. NOTE: Role with associated users cannot be dropped. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - this must always be `drop_role` -* id _(required)_ - this is the id of the role you are dropping +- operation _(required)_ - this must always be `drop_role` +- id _(required)_ - this is the id of the role you are dropping ### Body + ```json { - "operation": "drop_role", - "id": "developer" + "operation": "drop_role", + "id": "developer" } ``` ### Response: 200 + ```json { - "message": "developer successfully deleted" + "message": "developer successfully deleted" } ``` --- ## List Users + Returns a list of all users. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `list_users` +- operation _(required)_ - must always be `list_users` ### Body + ```json { - "operation": "list_users" + "operation": "list_users" } ``` ### Response: 200 + ```json [ - { - "__createdtime__": 1635520961165, - "__updatedtime__": 1635520961165, - "active": true, - "role": { - "__createdtime__": 1635520961161, - "__updatedtime__": 1635520961161, - "id": "7c78ef13-c1f3-4063-8ea3-725127a78279", - "permission": { - "super_user": true, - "system": { - "tables": { - "hdb_table": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_attribute": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_schema": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_user": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_role": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_job": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_license": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_info": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_nodes": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_temp": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - } - } - } - }, - "role": "super_user" - }, - "username": "HDB_ADMIN" - } + { + "__createdtime__": 1635520961165, + "__updatedtime__": 1635520961165, + "active": true, + "role": { + "__createdtime__": 1635520961161, + "__updatedtime__": 1635520961161, + "id": "7c78ef13-c1f3-4063-8ea3-725127a78279", + "permission": { + "super_user": true, + "system": { + "tables": { + "hdb_table": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_attribute": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_schema": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_user": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_role": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_job": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_license": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_info": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_nodes": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_temp": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + } + } + } + }, + "role": "super_user" + }, + "username": "HDB_ADMIN" + } ] ``` --- ## User Info + Returns user data for the associated user credentials. -* operation _(required)_ - must always be `user_info` +- operation _(required)_ - must always be `user_info` ### Body + ```json { - "operation": "user_info" + "operation": "user_info" } ``` ### Response: 200 + ```json { - "__createdtime__": 1610749235611, - "__updatedtime__": 1610749235611, - "active": true, - "role": { - "__createdtime__": 1610749235609, - "__updatedtime__": 1610749235609, - "id": "745b3138-a7cf-455a-8256-ac03722eef12", - "permission": { - "super_user": true - }, - "role": "super_user" - }, - "username": "HDB_ADMIN" + "__createdtime__": 1610749235611, + "__updatedtime__": 1610749235611, + "active": true, + "role": { + "__createdtime__": 1610749235609, + "__updatedtime__": 1610749235609, + "id": "745b3138-a7cf-455a-8256-ac03722eef12", + "permission": { + "super_user": true + }, + "role": "super_user" + }, + "username": "HDB_ADMIN" } ``` --- ## Add User + Creates a new user with the specified role and credentials. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_user` -* role _(required)_ - 'role' name value of the role you wish to assign to the user. See `add_role` for more detail -* username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash -* password _(required)_ - clear text for password. Harper will encrypt the password upon receipt -* active _(required)_ - boolean value for status of user's access to your Harper instance. If set to false, user will not be able to access your instance of Harper. +- operation _(required)_ - must always be `add_user` +- role _(required)_ - 'role' name value of the role you wish to assign to the user. See `add_role` for more detail +- username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash +- password _(required)_ - clear text for password. Harper will encrypt the password upon receipt +- active _(required)_ - boolean value for status of user's access to your Harper instance. If set to false, user will not be able to access your instance of Harper. ### Body + ```json { - "operation": "add_user", - "role": "role_name", - "username": "hdb_user", - "password": "password", - "active": true + "operation": "add_user", + "role": "role_name", + "username": "hdb_user", + "password": "password", + "active": true } ``` ### Response: 200 + ```json { - "message": "hdb_user successfully added" + "message": "hdb_user successfully added" } ``` --- ## Alter User + Modifies an existing user's role and/or credentials. [Learn more about Harper roles here.](../security/users-and-roles) -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ - * operation _(required)_ - must always be `alter_user` - * username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash. - * password _(optional)_ - clear text for password. Harper will encrypt the password upon receipt - * role _(optional)_ - `role` name value of the role you wish to assign to the user. See `add_role` for more detail - * active _(optional)_ - status of user's access to your Harper instance. See `add_role` for more detail +- operation _(required)_ - must always be `alter_user` +- username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash. +- password _(optional)_ - clear text for password. Harper will encrypt the password upon receipt +- role _(optional)_ - `role` name value of the role you wish to assign to the user. See `add_role` for more detail +- active _(optional)_ - status of user's access to your Harper instance. See `add_role` for more detail ### Body + ```json { - "operation": "alter_user", - "role": "role_name", - "username": "hdb_user", - "password": "password", - "active": true + "operation": "alter_user", + "role": "role_name", + "username": "hdb_user", + "password": "password", + "active": true } ``` ### Response: 200 + ```json { - "message": "updated 1 of 1 records", - "new_attributes": [], - "txn_time": 1611615114397.988, - "update_hashes": [ - "hdb_user" - ], - "skipped_hashes": [] + "message": "updated 1 of 1 records", + "new_attributes": [], + "txn_time": 1611615114397.988, + "update_hashes": ["hdb_user"], + "skipped_hashes": [] } ``` --- ## Drop User + Deletes an existing user by username. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_user` -* username _(required)_ - username assigned to the user +- operation _(required)_ - must always be `drop_user` +- username _(required)_ - username assigned to the user ### Body + ```json { - "operation": "drop_user", - "username": "sgoldberg" + "operation": "drop_user", + "username": "sgoldberg" } ``` ### Response: 200 + ```json { - "message": "sgoldberg successfully deleted" + "message": "sgoldberg successfully deleted" } ``` diff --git a/site/versioned_docs/version-4.4/developers/operations-api/utilities.md b/site/versioned_docs/version-4.4/developers/operations-api/utilities.md index 6cfec533..4259f507 100644 --- a/site/versioned_docs/version-4.4/developers/operations-api/utilities.md +++ b/site/versioned_docs/version-4.4/developers/operations-api/utilities.md @@ -5,64 +5,74 @@ title: Utilities # Utilities ## Restart + Restarts the Harper instance. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `restart` +- operation _(required)_ - must always be `restart` ### Body + ```json { - "operation": "restart" + "operation": "restart" } ``` ### Response: 200 + ```json { - "message": "Restarting HarperDB. This may take up to 60 seconds." + "message": "Restarting HarperDB. This may take up to 60 seconds." } ``` + --- ## Restart Service + Restarts servers for the specified Harper service. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `restart_service` -* service _(required)_ - must be one of: `http_workers`, `clustering_config` or `clustering` -* replicated _(optional)_ - must be a boolean. If set to `true`, Harper will replicate the restart service operation across all nodes in the cluster. The restart will occur as a rolling restart, ensuring that each node is fully restarted before the next node begins restarting. +- operation _(required)_ - must always be `restart_service` +- service _(required)_ - must be one of: `http_workers`, `clustering_config` or `clustering` +- replicated _(optional)_ - must be a boolean. If set to `true`, Harper will replicate the restart service operation across all nodes in the cluster. The restart will occur as a rolling restart, ensuring that each node is fully restarted before the next node begins restarting. ### Body + ```json { - "operation": "restart_service", - "service": "http_workers" + "operation": "restart_service", + "service": "http_workers" } ``` ### Response: 200 + ```json { - "message": "Restarting http_workers" + "message": "Restarting http_workers" } ``` --- + ## System Information + Returns detailed metrics on the host system. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `system_information` -* attributes _(optional)_ - string array of top level attributes desired in the response, if no value is supplied all attributes will be returned. Available attributes are: ['system', 'time', 'cpu', 'memory', 'disk', 'network', 'harperdb_processes', 'table_size', 'metrics', 'threads', 'replication'] +- operation _(required)_ - must always be `system_information` +- attributes _(optional)_ - string array of top level attributes desired in the response, if no value is supplied all attributes will be returned. Available attributes are: ['system', 'time', 'cpu', 'memory', 'disk', 'network', 'harperdb_processes', 'table_size', 'metrics', 'threads', 'replication'] ### Body + ```json { - "operation": "system_information" + "operation": "system_information" } ``` @@ -74,118 +84,125 @@ Delete data before the specified timestamp on the specified database table exclu _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_records_before` -* date _(required)_ - records older than this date will be deleted. Supported format looks like: `YYYY-MM-DDThh:mm:ss.sZ` -* schema _(required)_ - name of the schema where you are deleting your data -* table _(required)_ - name of the table where you are deleting your data +- operation _(required)_ - must always be `delete_records_before` +- date _(required)_ - records older than this date will be deleted. Supported format looks like: `YYYY-MM-DDThh:mm:ss.sZ` +- schema _(required)_ - name of the schema where you are deleting your data +- table _(required)_ - name of the table where you are deleting your data ### Body + ```json { - "operation": "delete_records_before", - "date": "2021-01-25T23:05:27.464", - "schema": "dev", - "table": "breed" + "operation": "delete_records_before", + "date": "2021-01-25T23:05:27.464", + "schema": "dev", + "table": "breed" } ``` ### Response: 200 + ```json { - "message": "Starting job with id d3aed926-e9fe-4ec1-aea7-0fb4451bd373", - "job_id": "d3aed926-e9fe-4ec1-aea7-0fb4451bd373" + "message": "Starting job with id d3aed926-e9fe-4ec1-aea7-0fb4451bd373", + "job_id": "d3aed926-e9fe-4ec1-aea7-0fb4451bd373" } ``` --- ## Export Local + Exports data based on a given search operation to a local file in JSON or CSV format. -* operation _(required)_ - must always be `export_local` -* format _(required)_ - the format you wish to export the data, options are `json` & `csv` -* path _(required)_ - path local to the server to export the data -* search_operation _(required)_ - search_operation of `search_by_hash`, `search_by_value`, `search_by_conditions` or `sql` -* filename _(optional)_ - the name of the file where your export will be written to (do not include extension in filename). If one is not provided it will be autogenerated based on the epoch. +- operation _(required)_ - must always be `export_local` +- format _(required)_ - the format you wish to export the data, options are `json` & `csv` +- path _(required)_ - path local to the server to export the data +- search*operation *(required)\_ - search_operation of `search_by_hash`, `search_by_value`, `search_by_conditions` or `sql` +- filename _(optional)_ - the name of the file where your export will be written to (do not include extension in filename). If one is not provided it will be autogenerated based on the epoch. ### Body + ```json { - "operation": "export_local", - "format": "json", - "path": "/data/", - "search_operation": { - "operation": "sql", - "sql": "SELECT * FROM dev.breed" - } + "operation": "export_local", + "format": "json", + "path": "/data/", + "search_operation": { + "operation": "sql", + "sql": "SELECT * FROM dev.breed" + } } ``` ### Response: 200 + ```json { - "message": "Starting job with id 6fc18eaa-3504-4374-815c-44840a12e7e5" + "message": "Starting job with id 6fc18eaa-3504-4374-815c-44840a12e7e5" } ``` --- ## Export To S3 + Exports data based on a given search operation from table to AWS S3 in JSON or CSV format. -* operation _(required)_ - must always be `export_to_s3` -* format _(required)_ - the format you wish to export the data, options are `json` & `csv` -* s3 _(required)_ - details your access keys, bucket, bucket region and key for saving the data to S3 -* search_operation _(required)_ - search_operation of `search_by_hash`, `search_by_value`, `search_by_conditions` or `sql` +- operation _(required)_ - must always be `export_to_s3` +- format _(required)_ - the format you wish to export the data, options are `json` & `csv` +- s3 _(required)_ - details your access keys, bucket, bucket region and key for saving the data to S3 +- search*operation *(required)\_ - search_operation of `search_by_hash`, `search_by_value`, `search_by_conditions` or `sql` ### Body + ```json { - "operation": "export_to_s3", - "format": "json", - "s3": { - "aws_access_key_id": "YOUR_KEY", - "aws_secret_access_key": "YOUR_SECRET_KEY", - "bucket": "BUCKET_NAME", - "key": "OBJECT_NAME", - "region": "BUCKET_REGION" - }, - "search_operation": { - "operation": "sql", - "sql": "SELECT * FROM dev.dog" - } + "operation": "export_to_s3", + "format": "json", + "s3": { + "aws_access_key_id": "YOUR_KEY", + "aws_secret_access_key": "YOUR_SECRET_KEY", + "bucket": "BUCKET_NAME", + "key": "OBJECT_NAME", + "region": "BUCKET_REGION" + }, + "search_operation": { + "operation": "sql", + "sql": "SELECT * FROM dev.dog" + } } ``` ### Response: 200 + ```json { - "message": "Starting job with id 9fa85968-4cb1-4008-976e-506c4b13fc4a", - "job_id": "9fa85968-4cb1-4008-976e-506c4b13fc4a" + "message": "Starting job with id 9fa85968-4cb1-4008-976e-506c4b13fc4a", + "job_id": "9fa85968-4cb1-4008-976e-506c4b13fc4a" } ``` --- ## Install Node Modules + This operation is deprecated, as it is handled automatically by deploy_component and restart. Executes npm install against specified custom function projects. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `install_node_modules` -* projects _(required)_ - must ba an array of custom functions projects. -* dry_run _(optional)_ - refers to the npm --dry-run flag: [https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run](https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run). Defaults to false. +- operation _(required)_ - must always be `install_node_modules` +- projects _(required)_ - must ba an array of custom functions projects. +- dry*run *(optional)\_ - refers to the npm --dry-run flag: [https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run](https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run). Defaults to false. ### Body + ```json { - "operation": "install_node_modules", - "projects": [ - "dogs", - "cats" - ], - "dry_run": true + "operation": "install_node_modules", + "projects": ["dogs", "cats"], + "dry_run": true } ``` @@ -197,126 +214,127 @@ Modifies the Harper configuration file parameters. Must follow with a restart or _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_configuration` -* logging_level _(example/optional)_ - one or more configuration keywords to be updated in the Harper configuration file -* clustering_enabled _(example/optional)_ - one or more configuration keywords to be updated in the Harper configuration file +- operation _(required)_ - must always be `set_configuration` +- logging*level *(example/optional)\_ - one or more configuration keywords to be updated in the Harper configuration file +- clustering*enabled *(example/optional)\_ - one or more configuration keywords to be updated in the Harper configuration file ### Body + ```json { - "operation": "set_configuration", - "logging_level": "trace", - "clustering_enabled": true + "operation": "set_configuration", + "logging_level": "trace", + "clustering_enabled": true } ``` ### Response: 200 + ```json { - "message": "Configuration successfully set. You must restart HarperDB for new config settings to take effect." + "message": "Configuration successfully set. You must restart HarperDB for new config settings to take effect." } ``` --- ## Get Configuration + Returns the Harper configuration parameters. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_configuration` +- operation _(required)_ - must always be `get_configuration` ### Body + ```json { - "operation": "get_configuration" + "operation": "get_configuration" } ``` ### Response: 200 + ```json { - "http": { - "compressionThreshold": 1200, - "cors": false, - "corsAccessList": [ - null - ], - "keepAliveTimeout": 30000, - "port": 9926, - "securePort": null, - "timeout": 120000 - }, - "threads": 11, - "authentication": { - "cacheTTL": 30000, - "enableSessions": true, - "operationTokenTimeout": "1d", - "refreshTokenTimeout": "30d" - }, - "analytics": { - "aggregatePeriod": 60 - }, - "replication": { - "hostname": "node1", - "databases": "*", - "routes": null, - "url": "wss://127.0.0.1:9925" - }, - "componentsRoot": "/Users/hdb/components", - "localStudio": { - "enabled": false - }, - "logging": { - "auditAuthEvents": { - "logFailed": false, - "logSuccessful": false - }, - "auditLog": true, - "auditRetention": "3d", - "file": true, - "level": "error", - "root": "/Users/hdb/log", - "rotation": { - "enabled": false, - "compress": false, - "interval": null, - "maxSize": null, - "path": "/Users/hdb/log" - }, - "stdStreams": false - }, - "mqtt": { - "network": { - "port": 1883, - "securePort": 8883 - }, - "webSocket": true, - "requireAuthentication": true - }, - "operationsApi": { - "network": { - "cors": true, - "corsAccessList": [ - "*" - ], - "domainSocket": "/Users/hdb/operations-server", - "port": 9925, - "securePort": null - } - }, - "rootPath": "/Users/hdb", - "storage": { - "writeAsync": false, - "caching": true, - "compression": false, - "noReadAhead": true, - "path": "/Users/hdb/database", - "prefetchWrites": true - }, - "tls": { - "privateKey": "/Users/hdb/keys/privateKey.pem" - } + "http": { + "compressionThreshold": 1200, + "cors": false, + "corsAccessList": [null], + "keepAliveTimeout": 30000, + "port": 9926, + "securePort": null, + "timeout": 120000 + }, + "threads": 11, + "authentication": { + "cacheTTL": 30000, + "enableSessions": true, + "operationTokenTimeout": "1d", + "refreshTokenTimeout": "30d" + }, + "analytics": { + "aggregatePeriod": 60 + }, + "replication": { + "hostname": "node1", + "databases": "*", + "routes": null, + "url": "wss://127.0.0.1:9925" + }, + "componentsRoot": "/Users/hdb/components", + "localStudio": { + "enabled": false + }, + "logging": { + "auditAuthEvents": { + "logFailed": false, + "logSuccessful": false + }, + "auditLog": true, + "auditRetention": "3d", + "file": true, + "level": "error", + "root": "/Users/hdb/log", + "rotation": { + "enabled": false, + "compress": false, + "interval": null, + "maxSize": null, + "path": "/Users/hdb/log" + }, + "stdStreams": false + }, + "mqtt": { + "network": { + "port": 1883, + "securePort": 8883 + }, + "webSocket": true, + "requireAuthentication": true + }, + "operationsApi": { + "network": { + "cors": true, + "corsAccessList": ["*"], + "domainSocket": "/Users/hdb/operations-server", + "port": 9925, + "securePort": null + } + }, + "rootPath": "/Users/hdb", + "storage": { + "writeAsync": false, + "caching": true, + "compression": false, + "noReadAhead": true, + "path": "/Users/hdb/database", + "prefetchWrites": true + }, + "tls": { + "privateKey": "/Users/hdb/keys/privateKey.pem" + } } ``` @@ -324,34 +342,36 @@ _Operation is restricted to super_user roles only_ ## Add Certificate -Adds or updates a certificate in the `hdb_certificate` system table. -If a `private_key` is provided it will __not__ be stored in `hdb_certificate`, it will be written to file in `/keys/`. +Adds or updates a certificate in the `hdb_certificate` system table. +If a `private_key` is provided it will **not** be stored in `hdb_certificate`, it will be written to file in `/keys/`. If a `private_key` is not passed the operation will search for one that matches the certificate. If one is not found an error will be returned. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_certificate` -* name _(required)_ - a unique name for the certificate -* certificate _(required)_ - a PEM formatted certificate string -* is_authority _(required)_ - a boolean indicating if the certificate is a certificate authority -* hosts _(optional)_ - an array of hostnames that the certificate is valid for -* private_key _(optional)_ - a PEM formatted private key string +- operation _(required)_ - must always be `add_certificate` +- name _(required)_ - a unique name for the certificate +- certificate _(required)_ - a PEM formatted certificate string +- is*authority *(required)\_ - a boolean indicating if the certificate is a certificate authority +- hosts _(optional)_ - an array of hostnames that the certificate is valid for +- private*key *(optional)\_ - a PEM formatted private key string ### Body + ```json { - "operation": "add_certificate", - "name": "my-cert", - "certificate": "-----BEGIN CERTIFICATE-----ZDFAay... -----END CERTIFICATE-----", - "is_authority": false, - "private_key": "-----BEGIN RSA PRIVATE KEY-----Y4dMpw5f... -----END RSA PRIVATE KEY-----" + "operation": "add_certificate", + "name": "my-cert", + "certificate": "-----BEGIN CERTIFICATE-----ZDFAay... -----END CERTIFICATE-----", + "is_authority": false, + "private_key": "-----BEGIN RSA PRIVATE KEY-----Y4dMpw5f... -----END RSA PRIVATE KEY-----" } ``` ### Response: 200 + ```json { - "message": "Successfully added certificate: my-cert" + "message": "Successfully added certificate: my-cert" } ``` @@ -363,21 +383,23 @@ Removes a certificate from the `hdb_certificate` system table and deletes the co _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `remove_certificate` -* name _(required)_ - the name of the certificate +- operation _(required)_ - must always be `remove_certificate` +- name _(required)_ - the name of the certificate ### Body + ```json { - "operation": "remove_certificate", - "name": "my-cert" + "operation": "remove_certificate", + "name": "my-cert" } ``` ### Response: 200 + ```json { - "message": "Successfully removed my-cert" + "message": "Successfully removed my-cert" } ``` @@ -389,54 +411,50 @@ Lists all certificates in the `hdb_certificate` system table. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `list_certificates` +- operation _(required)_ - must always be `list_certificates` ### Body + ```json { - "operation": "list_certificates" + "operation": "list_certificates" } ``` ### Response: 200 + ```json [ - { - "name": "HarperDB-Certificate-Authority-node1", - "certificate": "-----BEGIN CERTIFICATE-----\r\nTANBgkqhk... S34==\r\n-----END CERTIFICATE-----\r\n", - "private_key_name": "privateKey.pem", - "is_authority": true, - "details": { - "issuer": "CN=HarperDB-Certificate-Authority-node1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", - "subject": "CN=HarperDB-Certificate-Authority-node1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", - "serial_number": "5235345", - "valid_from": "Aug 27 15:00:00 2024 GMT", - "valid_to": "Aug 25 15:00:00 2034 GMT" - }, - "is_self_signed": true, - "uses": [ - "https", - "wss" - ] - }, - { - "name": "node1", - "certificate": "-----BEGIN CERTIFICATE-----\r\ngIEcSR1M... 5bv==\r\n-----END CERTIFICATE-----\r\n", - "private_key_name": "privateKey.pem", - "is_authority": false, - "details": { - "issuer": "CN=HarperDB-Certificate-Authority-node1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", - "subject": "CN=node.1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", - "subject_alt_name": "IP Address:127.0.0.1, DNS:localhost, IP Address:0:0:0:0:0:0:0:1, DNS:node.1", - "serial_number": "5243646", - "valid_from": "Aug 27 15:00:00 2024 GMT", - "valid_to": "Aug 25 15:00:00 2034 GMT" - }, - "is_self_signed": true, - "uses": [ - "https", - "wss" - ] - } + { + "name": "HarperDB-Certificate-Authority-node1", + "certificate": "-----BEGIN CERTIFICATE-----\r\nTANBgkqhk... S34==\r\n-----END CERTIFICATE-----\r\n", + "private_key_name": "privateKey.pem", + "is_authority": true, + "details": { + "issuer": "CN=HarperDB-Certificate-Authority-node1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", + "subject": "CN=HarperDB-Certificate-Authority-node1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", + "serial_number": "5235345", + "valid_from": "Aug 27 15:00:00 2024 GMT", + "valid_to": "Aug 25 15:00:00 2034 GMT" + }, + "is_self_signed": true, + "uses": ["https", "wss"] + }, + { + "name": "node1", + "certificate": "-----BEGIN CERTIFICATE-----\r\ngIEcSR1M... 5bv==\r\n-----END CERTIFICATE-----\r\n", + "private_key_name": "privateKey.pem", + "is_authority": false, + "details": { + "issuer": "CN=HarperDB-Certificate-Authority-node1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", + "subject": "CN=node.1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", + "subject_alt_name": "IP Address:127.0.0.1, DNS:localhost, IP Address:0:0:0:0:0:0:0:1, DNS:node.1", + "serial_number": "5243646", + "valid_from": "Aug 27 15:00:00 2024 GMT", + "valid_to": "Aug 25 15:00:00 2034 GMT" + }, + "is_self_signed": true, + "uses": ["https", "wss"] + } ] ``` diff --git a/site/versioned_docs/version-4.4/developers/real-time.md b/site/versioned_docs/version-4.4/developers/real-time.md index 639cfce4..9c5c79e4 100644 --- a/site/versioned_docs/version-4.4/developers/real-time.md +++ b/site/versioned_docs/version-4.4/developers/real-time.md @@ -9,9 +9,11 @@ title: Real-Time Harper provides real-time access to data and messaging. This allows clients to monitor and subscribe to data for changes in real-time as well as handling data-oriented messaging. Harper supports multiple standardized protocols to facilitate diverse standards-based client interaction. Harper real-time communication is based around database tables. Declared tables are the basis for monitoring data, and defining "topics" for publishing and subscribing to messages. Declaring a table that establishes a topic can be as simple as adding a table with no attributes to your [schema.graphql in a Harper application folder](./applications/): + ``` type MyTopic @table @export ``` + You can then subscribe to records or sub-topics in this topic/namespace, as well as save data and publish messages, with the protocols discussed below. ### Content Negotiation @@ -61,6 +63,7 @@ Harper supports QoS 0 and 1 for publishing and subscribing. Harper supports multi-level topics, both for subscribing and publishing. Harper also supports multi-level wildcards, so you can subscribe to /`my-resource/#` to receive notifications for `my-resource/some-id` as well as `my-resource/nested/id`, or you can subscribe to `my-resource/nested/#` and receive the latter, but not the former, topic messages. Harper currently only supports trailing multi-level wildcards (no single-level wildcards with '\*'). #### Events + JavaScript components can also listen for MQTT events. This is available on the server.mqtt.events object. For example, to set up a listener/callback for when MQTT clients connect and authorize, we can do: ```javascript @@ -68,11 +71,13 @@ server.mqtt.events.on('connected', (session, socket) => { console.log('client connected with id', session.clientId); }); ``` + The following MQTT events are available: -* `connection` - When a client initially establishes a TCP or WS connection to the server -* `connected` - When a client establishes an authorized MQTT connection -* `auth-failed` - When a client fails to authenticate -* `disconnected` - When a client disconnects from the server + +- `connection` - When a client initially establishes a TCP or WS connection to the server +- `connected` - When a client establishes an authorized MQTT connection +- `auth-failed` - When a client fails to authenticate +- `disconnected` - When a client disconnects from the server ### Ordering @@ -144,7 +149,7 @@ eventSource.onmessage = (event) => { ### MQTT Feature Support Matrix | Feature | Support | -|--------------------------------------------------------------------|----------------------------------------------------------------| +| ------------------------------------------------------------------ | -------------------------------------------------------------- | | Connections, protocol negotiation, and acknowledgement with v3.1.1 | :heavy_check_mark: | | Connections, protocol negotiation, and acknowledgement with v5 | :heavy_check_mark: | | Secure MQTTS | :heavy_check_mark: | diff --git a/site/versioned_docs/version-4.4/developers/replication/index.md b/site/versioned_docs/version-4.4/developers/replication/index.md index 938bffd2..9be729b2 100644 --- a/site/versioned_docs/version-4.4/developers/replication/index.md +++ b/site/versioned_docs/version-4.4/developers/replication/index.md @@ -37,10 +37,9 @@ You can also use the [operations API](../operations-api/clustering) to dynamical ```json { - "operation": "add_node", - "hostname": "server-two" + "operation": "add_node", + "hostname": "server-two" } - ``` These operations will also dynamically generating certificates as needed, if there are no existing signed certificates, or if the existing certificates are not valid for the new node. @@ -60,8 +59,8 @@ By default, all tables within a replicated database will be replicated. Transact ```graphql type LocalTableForNode @table(replicate: false) { - id: ID! - name: String! + id: ID! + name: String! } ``` @@ -83,6 +82,7 @@ Harper supports the highest levels of security through public key infrastructure #### Provide your own certificates If you want to secure your Harper connections with your own signed certificates, you can easily do so. Whether you have certificates from a public authority (like Let's Encrypt or Digicert) or a corporate certificate authority, you can use them to authenticate nodes securely. You can then allow nodes to authorize each other by checking the certificate against the standard list of root certificate authorities by enabling the `enableRootCAs` option in the config: + ``` replication enableRootCAs: true @@ -127,13 +127,13 @@ Example configuration: ```json { - "operation": "add_node", - "hostname": "server-two", - "verify_tls": false, - "authorization": { - "username": "admin", - "password": "password" - } + "operation": "add_node", + "hostname": "server-two", + "verify_tls": false, + "authorization": { + "username": "admin", + "password": "password" + } } ``` @@ -141,8 +141,8 @@ When you connect to another node (e.g., `server-two`), Harper uses secure WebSoc If you’re working with a fresh install, you’ll need to set `verify_tls` to `false` temporarily, so the self-signed certificate is accepted. Once the connection is made, Harper will automatically handle the certificate signing process: -* It creates a certificate signing request (CSR), sends it to `server-two`, which then signs it and returns the signed certificate along with the certificate authority (CA). -* The signed certificate is stored for future connections between the nodes, ensuring secure communication. +- It creates a certificate signing request (CSR), sends it to `server-two`, which then signs it and returns the signed certificate along with the certificate authority (CA). +- The signed certificate is stored for future connections between the nodes, ensuring secure communication. **Important:** Your credentials are not stored—they are discarded immediately after use. @@ -156,8 +156,8 @@ Nodes can be removed from the cluster using the [`remove_node` operation](../ope ```json { - "operation": "remove_node", - "hostname": "server-two" + "operation": "remove_node", + "hostname": "server-two" } ``` @@ -193,14 +193,16 @@ Example configuration: ```json { - "operation": "add_node", - "hostname": "server-two", - "subscriptions": [{ - "database": "dev", - "table": "my-table", - "publish": true, - "subscribe": false - }] + "operation": "add_node", + "hostname": "server-two", + "subscriptions": [ + { + "database": "dev", + "table": "my-table", + "publish": true, + "subscribe": false + } + ] } ``` @@ -210,14 +212,16 @@ Here we are updating the subscription to receive transactions on the `dev.my-tab ```json { - "operation": "update_node", - "hostname": "server-two", - "subscriptions": [{ - "database": "dev", - "table": "my-table", - "publish": true, - "subscribe": true - }] + "operation": "update_node", + "hostname": "server-two", + "subscriptions": [ + { + "database": "dev", + "table": "my-table", + "publish": true, + "subscribe": true + } + ] } ``` @@ -227,7 +231,7 @@ You can monitor the status of replication through the operations API. You can us ```json { - "operation": "cluster_status" + "operation": "cluster_status" } ``` @@ -239,14 +243,14 @@ You may also specify a `start_time` in the `add_node` to specify that when a dat **Advanced Configuration** -You can also check the configuration of the replication system, including the current known nodes and certificates, by querying the hdb\_nodes and hdb\_certificate table: +You can also check the configuration of the replication system, including the current known nodes and certificates, by querying the hdb_nodes and hdb_certificate table: ```json { - "operation": "search_by_value", - "database": "system", - "table": "hdb_nodes", - "search_attribute": "name", - "search_value": "*" + "operation": "search_by_value", + "database": "system", + "table": "hdb_nodes", + "search_attribute": "name", + "search_value": "*" } ``` diff --git a/site/versioned_docs/version-4.4/developers/replication/sharding.md b/site/versioned_docs/version-4.4/developers/replication/sharding.md index 2e80318c..86115f4a 100644 --- a/site/versioned_docs/version-4.4/developers/replication/sharding.md +++ b/site/versioned_docs/version-4.4/developers/replication/sharding.md @@ -5,17 +5,22 @@ title: Sharding Harper's replication system supports various levels of replication or sharding. Harper can be configured or set up to replicate to different data to different subsets of nodes. This can be used facilitate horizontally scalability of storage and write performance, while maintaining optimal strategies of data locality and data consistency. When sharding is configured, Harper will replicate data to only a subset of nodes, based on the sharding configuration, and can then retrieve data from the appropriate nodes as needed to fulfill requests for data. ## Configuration + By default, Harper will replicate all data to all nodes. However, replication can easily be configured for "sharding", or storing different data in different locations or nodes. The simplest way to configure sharding and limit replication to improve performance and efficiency is to configure a replication-to count. This will limit the number of nodes that data is replicated to. For example, to specify that writes should replicate to 2 other nodes besides the node that first stored the data, you can set the `replicateTo` to 2 in the `replication` section of the `harperdb-config.yaml` file: + ```yaml replication: replicateTo: 2 ``` + This will ensure that data is replicated to two other nodes, so that each record will be stored on three nodes in total. -With a sharding configuration (or customization below) in place, requests will for records that don't reside on the server handling requests will automatically be forwarded to the appropriate node. This will be done transparently, so that the client will not need to know where the data is stored. +With a sharding configuration (or customization below) in place, requests will for records that don't reside on the server handling requests will automatically be forwarded to the appropriate node. This will be done transparently, so that the client will not need to know where the data is stored. ## Replication Control with Headers -With the REST interface, replication levels and destinations can also specified with the `X-Replicate-To` header. This can be used to indicate the number of additional nodes that data should be replicated to, or to specify the nodes that data should be replicated to. The `X-Replicate-To` header can be used with the `POST` and `PUT` methods. This header can also specify if the response should wait for confirmation from other nodes, and how many, with the `confirm` parameter. For example, to specify that data should be replicated to two other nodes, and the response should be returned once confirmation is received from one other node, you can use the following header: + +With the REST interface, replication levels and destinations can also specified with the `X-Replicate-To` header. This can be used to indicate the number of additional nodes that data should be replicated to, or to specify the nodes that data should be replicated to. The `X-Replicate-To` header can be used with the `POST` and `PUT` methods. This header can also specify if the response should wait for confirmation from other nodes, and how many, with the `confirm` parameter. For example, to specify that data should be replicated to two other nodes, and the response should be returned once confirmation is received from one other node, you can use the following header: + ```http PUT /MyTable/3 X-Replicate-To: 2;confirm=1 @@ -24,35 +29,44 @@ X-Replicate-To: 2;confirm=1 ``` You can also explicitly specify destination nodes by providing a comma-separated list of node hostnames. For example, to specify that data should be replicated to nodes `node1` and `node2`, you can use the following header: + ```http PUT /MyTable/3 X-Replicate-To: node1,node2 ``` + (This can also be used with the `confirm` parameter.) ## Replication Control with Operations + Likewise, you can specify replicateTo and confirm parameters in the operation object when using the Harper API. For example, to specify that data should be replicated to two other nodes, and the response should be returned once confirmation is received from one other node, you can use the following operation object: + ```json { - "operation": "update", - "schema": "dev", - "table": "MyTable", - "hashValues": [3], - "record": { - "name": "John Doe" - }, - "replicateTo": 2, - "replicatedConfirmation": 1 + "operation": "update", + "schema": "dev", + "table": "MyTable", + "hashValues": [3], + "record": { + "name": "John Doe" + }, + "replicateTo": 2, + "replicatedConfirmation": 1 } ``` + or you can specify nodes: + ```json ..., "replicateTo": ["node-1", "node-2"] ... ``` + ## Programmatic Replication Control + Additionally, you can specify `replicateTo` and `replicatedConfirmation` parameters programmatically in the context of a resource. For example, you can define a put method: + ```javascript class MyTable extends tables.MyTable { put(record) { @@ -65,34 +79,42 @@ class MyTable extends tables.MyTable { ``` ## Custom Sharding -You can also define a custom sharding strategy by specifying a function to compute the "residency" or location of where records should be stored and reside. To do this we use the `setResidency` method, providing a function that will determine the residency of each record. The function you provide will be called with the record entry, and should return an array of nodes that the record should be replicated to (using their hostname). For example, to shard records based on the value of the `id` field, you can use the following code: + +You can also define a custom sharding strategy by specifying a function to compute the "residency" or location of where records should be stored and reside. To do this we use the `setResidency` method, providing a function that will determine the residency of each record. The function you provide will be called with the record entry, and should return an array of nodes that the record should be replicated to (using their hostname). For example, to shard records based on the value of the `id` field, you can use the following code: + ```javascript MyTable.setResidency((record) => { - return record.id % 2 === 0 ? ['node1'] : ['node2']; + return record.id % 2 === 0 ? ['node1'] : ['node2']; }); ``` -With this approach, the record metadata, which includes the residency information, and any indexed properties, will be replicated to all nodes, but the full record will only be replicated to the nodes specified by the residency function. + +With this approach, the record metadata, which includes the residency information, and any indexed properties, will be replicated to all nodes, but the full record will only be replicated to the nodes specified by the residency function. ### Custom Sharding By Primary Key -Alternately you can define a custom sharding strategy based on the primary key alone. This allows records to be retrieved without needing access to the record data or metadata. With this approach, data will only be replicated to the nodes specified by the residency function (the record metadata doesn't need to replicated to all nodes). To do this, you can use the `setResidencyById` method, providing a function that will determine the residency of each record based on the primary key. The function you provide will be called with the primary key, and should return an array of nodes that the record should be replicated to (using their hostname). For example, to shard records based on the value of the primary key, you can use the following code: + +Alternately you can define a custom sharding strategy based on the primary key alone. This allows records to be retrieved without needing access to the record data or metadata. With this approach, data will only be replicated to the nodes specified by the residency function (the record metadata doesn't need to replicated to all nodes). To do this, you can use the `setResidencyById` method, providing a function that will determine the residency of each record based on the primary key. The function you provide will be called with the primary key, and should return an array of nodes that the record should be replicated to (using their hostname). For example, to shard records based on the value of the primary key, you can use the following code: ```javascript MyTable.setResidencyById((id) => { - return id % 2 === 0 ? ['node1'] : ['node2']; + return id % 2 === 0 ? ['node1'] : ['node2']; }); ``` ### Disabling Cross-Node Access -Normally sharding allows data to be stored in specific nodes, but still allows access to the data from any node. However, you can also disable cross-node access so that data is only returned if is stored on the node where it is accessed. To do this, you can set the `replicateFrom` property on the context of operation to `false`: + +Normally sharding allows data to be stored in specific nodes, but still allows access to the data from any node. However, you can also disable cross-node access so that data is only returned if is stored on the node where it is accessed. To do this, you can set the `replicateFrom` property on the context of operation to `false`: + ```json { - "operation": "search_by_id", - "table": "MyTable", - "ids": [3], - "replicateFrom": false + "operation": "search_by_id", + "table": "MyTable", + "ids": [3], + "replicateFrom": false } ``` + Or use a header with the REST API: + ```http GET /MyTable/3 X-Replicate-From: none diff --git a/site/versioned_docs/version-4.4/developers/rest.md b/site/versioned_docs/version-4.4/developers/rest.md index 6a6db875..2d18003d 100644 --- a/site/versioned_docs/version-4.4/developers/rest.md +++ b/site/versioned_docs/version-4.4/developers/rest.md @@ -12,11 +12,11 @@ Resources, including tables, can be configured as RESTful endpoints. Make sure y The default path structure provides access to resources at several levels: -* `/my-resource` - The root path of a resource usually has a description of the resource (like a describe operation for a table). -* `/my-resource/` - The trailing slash in a path indicates it is a collection of the records. The root collection for a table represents all the records in a table, and usually you will append query parameters to query and search for more specific records. -* `/my-resource/record-id` - This resource locator represents a specific record, referenced by its id. This is typically how you can retrieve, update, and delete individual records. -* `/my-resource/record-id/` - Again, a trailing slash indicates a collection; here it is the collection of the records that begin with the specified id prefix. -* `/my-resource/record-id/with/multiple/parts` - A record id can consist of multiple path segments. +- `/my-resource` - The root path of a resource usually has a description of the resource (like a describe operation for a table). +- `/my-resource/` - The trailing slash in a path indicates it is a collection of the records. The root collection for a table represents all the records in a table, and usually you will append query parameters to query and search for more specific records. +- `/my-resource/record-id` - This resource locator represents a specific record, referenced by its id. This is typically how you can retrieve, update, and delete individual records. +- `/my-resource/record-id/` - Again, a trailing slash indicates a collection; here it is the collection of the records that begin with the specified id prefix. +- `/my-resource/record-id/with/multiple/parts` - A record id can consist of multiple path segments. ### GET @@ -81,13 +81,13 @@ Generally the POST method can be used for custom actions since POST has the broa This is handled by the Resource method `post(data)`, which is a good method to extend to make various other types of modifications. Also, with a table you can create a new record without specifying a primary key, for example: -````http +`````http ````http POST /MyTable/ Content-Type: application/json `{ "name": "some data" }` -```` +````` This will create a new record, auto-assigning a primary key, which will be returned in the `Location` header. @@ -334,7 +334,7 @@ PUT /Product/123 Content-Type: application/json { "id": "123", "resellerIds": ["first-reseller-id", "second-reseller-id", "last-reseller-id"], -...} +...} ``` #### Type Conversion @@ -402,3 +402,4 @@ Content-Type: image/gif ...image data... ``` +```` diff --git a/site/versioned_docs/version-4.4/developers/security/basic-auth.md b/site/versioned_docs/version-4.4/developers/security/basic-auth.md index 0faa7d4c..a4510b13 100644 --- a/site/versioned_docs/version-4.4/developers/security/basic-auth.md +++ b/site/versioned_docs/version-4.4/developers/security/basic-auth.md @@ -6,7 +6,7 @@ title: Basic Authentication Harper uses Basic Auth and JSON Web Tokens (JWTs) to secure our HTTP requests. In the context of an HTTP transaction, **basic access authentication** is a method for an HTTP user agent to provide a username and password when making a request. -** _**You do not need to log in separately. Basic Auth is added to each HTTP request like create\_database, create\_table, insert etc… via headers.**_ ** +** \_**You do not need to log in separately. Basic Auth is added to each HTTP request like create_database, create_table, insert etc… via headers.**\_ ** A header is added to each HTTP request. The header key is **“Authorization”** the header value is **“Basic <<your username and password buffer token>>”** @@ -17,46 +17,41 @@ In the below code sample, you can see where we add the authorization header to t _Note: This function uses btoa. Learn about_ [_btoa here_](https://developer.mozilla.org/en-US/docs/Web/API/btoa)_._ ```javascript -function callHarperDB(call_object, operation, callback){ - - const options = { - "method": "POST", - "hostname": call_object.endpoint_url, - "port": call_object.endpoint_port, - "path": "/", - "headers": { - "content-type": "application/json", - "authorization": "Basic " + btoa(call_object.username + ':' + call_object.password), - "cache-control": "no-cache" - - } - }; - - const http_req = http.request(options, function (hdb_res) { - let chunks = []; - - hdb_res.on("data", function (chunk) { - chunks.push(chunk); - }); - - hdb_res.on("end", function () { - const body = Buffer.concat(chunks); - if (isJson(body)) { - return callback(null, JSON.parse(body)); - } else { - return callback(body, null); - - } - - }); - }); - - http_req.on("error", function (chunk) { - return callback("Failed to connect", null); - }); - - http_req.write(JSON.stringify(operation)); - http_req.end(); - +function callHarperDB(call_object, operation, callback) { + const options = { + method: 'POST', + hostname: call_object.endpoint_url, + port: call_object.endpoint_port, + path: '/', + headers: { + 'content-type': 'application/json', + 'authorization': 'Basic ' + btoa(call_object.username + ':' + call_object.password), + 'cache-control': 'no-cache', + }, + }; + + const http_req = http.request(options, function (hdb_res) { + let chunks = []; + + hdb_res.on('data', function (chunk) { + chunks.push(chunk); + }); + + hdb_res.on('end', function () { + const body = Buffer.concat(chunks); + if (isJson(body)) { + return callback(null, JSON.parse(body)); + } else { + return callback(body, null); + } + }); + }); + + http_req.on('error', function (chunk) { + return callback('Failed to connect', null); + }); + + http_req.write(JSON.stringify(operation)); + http_req.end(); } ``` diff --git a/site/versioned_docs/version-4.4/developers/security/configuration.md b/site/versioned_docs/version-4.4/developers/security/configuration.md index 7638ef86..19251614 100644 --- a/site/versioned_docs/version-4.4/developers/security/configuration.md +++ b/site/versioned_docs/version-4.4/developers/security/configuration.md @@ -8,18 +8,19 @@ Harper was set up to require very minimal configuration to work out of the box. ## CORS -Harper allows for managing [cross-origin HTTP requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access\_control\_CORS). By default, Harper enables CORS for all domains if you need to disable CORS completely or set up an access list of domains you can do the following: +Harper allows for managing [cross-origin HTTP requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS). By default, Harper enables CORS for all domains if you need to disable CORS completely or set up an access list of domains you can do the following: 1. Open the harperdb-config.yaml file, which can be found in \, the location you specified during install. 1. In harperdb-config.yaml there should be 2 entries under `operationsApi.network`: cors and corsAccessList. - * `cors` + - `cors` 1. To turn off, change to: `cors: false` 1. To turn on, change to: `cors: true` - * `corsAccessList` + - `corsAccessList` 1. The `corsAccessList` will only be recognized by the system when `cors` is `true` 1. To create an access list you set `corsAccessList` to a comma-separated list of domains. - i.e. `corsAccessList` is `https://harpersystems.dev,https://products.harpersystems.dev` + i.e. `corsAccessList` is `https://harpersystems.dev,https://products.harpersystems.dev` + 1. To clear out the access list and allow all domains: `corsAccessList` is `[null]` ## SSL diff --git a/site/versioned_docs/version-4.4/developers/security/index.md b/site/versioned_docs/version-4.4/developers/security/index.md index 55897945..6539f007 100644 --- a/site/versioned_docs/version-4.4/developers/security/index.md +++ b/site/versioned_docs/version-4.4/developers/security/index.md @@ -6,8 +6,8 @@ title: Security Harper uses role-based, attribute-level security to ensure that users can only gain access to the data they’re supposed to be able to access. Our granular permissions allow for unparalleled flexibility and control, and can actually lower the total cost of ownership compared to other database solutions, since you no longer have to replicate subsets of your data to isolate use cases. -* [JWT Authentication](./jwt-auth) -* [Basic Authentication](./basic-auth) -* [mTLS Authentication](./mtls-auth) -* [Configuration](./configuration) -* [Users and Roles](./users-and-roles) +- [JWT Authentication](./jwt-auth) +- [Basic Authentication](./basic-auth) +- [mTLS Authentication](./mtls-auth) +- [Configuration](./configuration) +- [Users and Roles](./users-and-roles) diff --git a/site/versioned_docs/version-4.4/developers/security/jwt-auth.md b/site/versioned_docs/version-4.4/developers/security/jwt-auth.md index 5dda54ed..0ea7290f 100644 --- a/site/versioned_docs/version-4.4/developers/security/jwt-auth.md +++ b/site/versioned_docs/version-4.4/developers/security/jwt-auth.md @@ -8,8 +8,8 @@ Harper uses token based authentication with JSON Web Tokens, JWTs. This consists of two primary operations `create_authentication_tokens` and `refresh_operation_token`. These generate two types of tokens, as follows: -* The `operation_token` which is used to authenticate all Harper operations in the Bearer Token Authorization Header. The default expiry is one day. -* The `refresh_token` which is used to generate a new `operation_token` upon expiry. This token is used in the Bearer Token Authorization Header for the `refresh_operation_token` operation only. The default expiry is thirty days. +- The `operation_token` which is used to authenticate all Harper operations in the Bearer Token Authorization Header. The default expiry is one day. +- The `refresh_token` which is used to generate a new `operation_token` upon expiry. This token is used in the Bearer Token Authorization Header for the `refresh_operation_token` operation only. The default expiry is thirty days. The `create_authentication_tokens` operation can be used at any time to refresh both tokens in the event that both have expired or been lost. @@ -19,9 +19,9 @@ Users must initially create tokens using their Harper credentials. The following ```json { - "operation": "create_authentication_tokens", - "username": "username", - "password": "password" + "operation": "create_authentication_tokens", + "username": "username", + "password": "password" } ``` @@ -41,8 +41,8 @@ An example expected return object is: ```json { - "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDUwNjQ2MDAsInN1YiI6Im9wZXJhdGlvbiJ9.MpQA-9CMjA-mn-7mHyUXSuSC_-kqMqJXp_NDiKLFtbtMRbodCuY3DzH401rvy_4vb0yCELf0B5EapLVY1545sv80nxSl6FoZFxQaDWYXycoia6zHpiveR8hKlmA6_XTWHJbY2FM1HAFrdtt3yUTiF-ylkdNbPG7u7fRjTmHfsZ78gd2MNWIDkHoqWuFxIyqk8XydQpsjULf2Uacirt9FmHfkMZ-Jr_rRpcIEW0FZyLInbm6uxLfseFt87wA0TbZ0ofImjAuaW_3mYs-3H48CxP152UJ0jByPb0kHsk1QKP7YHWx1-Wce9NgNADfG5rfgMHANL85zvkv8sJmIGZIoSpMuU3CIqD2rgYnMY-L5dQN1fgfROrPMuAtlYCRK7r-IpjvMDQtRmCiNG45nGsM4DTzsa5GyDrkGssd5OBhl9gr9z9Bb5HQVYhSKIOiy72dK5dQNBklD4eGLMmo-u322zBITmE0lKaBcwYGJw2mmkYcrjDOmsDseU6Bf_zVUd9WF3FqwNkhg4D7nrfNSC_flalkxPHckU5EC_79cqoUIX2ogufBW5XgYbU4WfLloKcIpb51YTZlZfwBHlHPSyaq_guaXFaeCUXKq39_i1n0HRF_mRaxNru0cNDFT9Fm3eD7V8axFijSVAMDyQs_JR7SY483YDKUfN4l-vw-EVynImr4", - "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDc1NzAyMDAsInN1YiI6InJlZnJlc2gifQ.acaCsk-CJWIMLGDZdGnsthyZsJfQ8ihXLyE8mTji8PgGkpbwhs7e1O0uitMgP_pGjHq2tey1BHSwoeCL49b18WyMIB10hK-q2BXGKQkykltjTrQbg7VsdFi0h57mGfO0IqAwYd55_hzHZNnyJMh4b0iPQFDwU7iTD7x9doHhZAvzElpkWbc_NKVw5_Mw3znjntSzbuPN105zlp4Niurin-_5BnukwvoJWLEJ-ZlF6hE4wKhaMB1pWTJjMvJQJE8khTTvlUN8tGxmzoaDYoe1aCGNxmDEQnx8Y5gKzVd89sylhqi54d2nQrJ2-ElfEDsMoXpR01Ps6fNDFtLTuPTp7ixj8LvgL2nCjAg996Ga3PtdvXJAZPDYCqqvaBkZZcsiqOgqLV0vGo3VVlfrcgJXQImMYRr_Inu0FCe47A93IAWuQTs-KplM1KdGJsHSnNBV6oe6QEkROJT5qZME-8xhvBYvOXqp9Znwg39bmiBCMxk26Ce66_vw06MNgoa3D5AlXPWemfdVKPZDnj_aLVjZSs0gAfFElcVn7l9yjWJOaT2Muk26U8bJl-2BEq_DSclqKHODuYM5kkPKIdE4NFrsqsDYuGxcA25rlNETFyl0q-UXj1aoz_joy5Hdnr4mFELmjnoo4jYQuakufP9xeGPsj1skaodKl0mmoGcCD6v1F60" + "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDUwNjQ2MDAsInN1YiI6Im9wZXJhdGlvbiJ9.MpQA-9CMjA-mn-7mHyUXSuSC_-kqMqJXp_NDiKLFtbtMRbodCuY3DzH401rvy_4vb0yCELf0B5EapLVY1545sv80nxSl6FoZFxQaDWYXycoia6zHpiveR8hKlmA6_XTWHJbY2FM1HAFrdtt3yUTiF-ylkdNbPG7u7fRjTmHfsZ78gd2MNWIDkHoqWuFxIyqk8XydQpsjULf2Uacirt9FmHfkMZ-Jr_rRpcIEW0FZyLInbm6uxLfseFt87wA0TbZ0ofImjAuaW_3mYs-3H48CxP152UJ0jByPb0kHsk1QKP7YHWx1-Wce9NgNADfG5rfgMHANL85zvkv8sJmIGZIoSpMuU3CIqD2rgYnMY-L5dQN1fgfROrPMuAtlYCRK7r-IpjvMDQtRmCiNG45nGsM4DTzsa5GyDrkGssd5OBhl9gr9z9Bb5HQVYhSKIOiy72dK5dQNBklD4eGLMmo-u322zBITmE0lKaBcwYGJw2mmkYcrjDOmsDseU6Bf_zVUd9WF3FqwNkhg4D7nrfNSC_flalkxPHckU5EC_79cqoUIX2ogufBW5XgYbU4WfLloKcIpb51YTZlZfwBHlHPSyaq_guaXFaeCUXKq39_i1n0HRF_mRaxNru0cNDFT9Fm3eD7V8axFijSVAMDyQs_JR7SY483YDKUfN4l-vw-EVynImr4", + "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDc1NzAyMDAsInN1YiI6InJlZnJlc2gifQ.acaCsk-CJWIMLGDZdGnsthyZsJfQ8ihXLyE8mTji8PgGkpbwhs7e1O0uitMgP_pGjHq2tey1BHSwoeCL49b18WyMIB10hK-q2BXGKQkykltjTrQbg7VsdFi0h57mGfO0IqAwYd55_hzHZNnyJMh4b0iPQFDwU7iTD7x9doHhZAvzElpkWbc_NKVw5_Mw3znjntSzbuPN105zlp4Niurin-_5BnukwvoJWLEJ-ZlF6hE4wKhaMB1pWTJjMvJQJE8khTTvlUN8tGxmzoaDYoe1aCGNxmDEQnx8Y5gKzVd89sylhqi54d2nQrJ2-ElfEDsMoXpR01Ps6fNDFtLTuPTp7ixj8LvgL2nCjAg996Ga3PtdvXJAZPDYCqqvaBkZZcsiqOgqLV0vGo3VVlfrcgJXQImMYRr_Inu0FCe47A93IAWuQTs-KplM1KdGJsHSnNBV6oe6QEkROJT5qZME-8xhvBYvOXqp9Znwg39bmiBCMxk26Ce66_vw06MNgoa3D5AlXPWemfdVKPZDnj_aLVjZSs0gAfFElcVn7l9yjWJOaT2Muk26U8bJl-2BEq_DSclqKHODuYM5kkPKIdE4NFrsqsDYuGxcA25rlNETFyl0q-UXj1aoz_joy5Hdnr4mFELmjnoo4jYQuakufP9xeGPsj1skaodKl0mmoGcCD6v1F60" } ``` @@ -90,7 +90,7 @@ The `refresh_token` also expires at a set interval, but a longer interval. Once Token timeouts are configurable in [harperdb-config.yaml](../../deployments/configuration) with the following parameters: -* `operationsApi.authentication.operationTokenTimeout`: Defines the length of time until the operation\_token expires (default 1d). -* `operationsApi.authentication.refreshTokenTimeout`: Defines the length of time until the refresh\_token expires (default 30d). +- `operationsApi.authentication.operationTokenTimeout`: Defines the length of time until the operation_token expires (default 1d). +- `operationsApi.authentication.refreshTokenTimeout`: Defines the length of time until the refresh_token expires (default 30d). A full list of valid values for both parameters can be found [here](https://github.com/vercel/ms). diff --git a/site/versioned_docs/version-4.4/developers/security/mtls-auth.md b/site/versioned_docs/version-4.4/developers/security/mtls-auth.md index 0d4538aa..375ec927 100644 --- a/site/versioned_docs/version-4.4/developers/security/mtls-auth.md +++ b/site/versioned_docs/version-4.4/developers/security/mtls-auth.md @@ -4,4 +4,4 @@ title: mTLS Authentication # mTLS Authentication -Harper supports mTLS authentication for incoming connections. When enabled in the [HTTP config settings](../../deployments/configuration#http) the client certificate will be checked against the certificate authority specified with `tls.certificateAuthority`. If the certificate can be properly verified, the connection will authenticate users where the user's id/username is specified by the `CN` (common name) from the client certificate's `subject`, by default. The [HTTP config settings](../../deployments/configuration#http) allow you to determine if mTLS is required for all connections or optional. \ No newline at end of file +Harper supports mTLS authentication for incoming connections. When enabled in the [HTTP config settings](../../deployments/configuration#http) the client certificate will be checked against the certificate authority specified with `tls.certificateAuthority`. If the certificate can be properly verified, the connection will authenticate users where the user's id/username is specified by the `CN` (common name) from the client certificate's `subject`, by default. The [HTTP config settings](../../deployments/configuration#http) allow you to determine if mTLS is required for all connections or optional. diff --git a/site/versioned_docs/version-4.4/developers/security/users-and-roles.md b/site/versioned_docs/version-4.4/developers/security/users-and-roles.md index c3c2beb3..76ed6901 100644 --- a/site/versioned_docs/version-4.4/developers/security/users-and-roles.md +++ b/site/versioned_docs/version-4.4/developers/security/users-and-roles.md @@ -19,65 +19,66 @@ Role permissions in Harper are broken into two categories – permissions around **Built-In Roles** -There are three built-in roles within Harper. See full breakdown of operations restricted to only super\_user roles [here](./users-and-roles#role-based-operation-restrictions). +There are three built-in roles within Harper. See full breakdown of operations restricted to only super_user roles [here](./users-and-roles#role-based-operation-restrictions). -* `super_user` - This role provides full access to all operations and methods within a Harper instance, this can be considered the admin role. - * This role provides full access to all Database Definition operations and the ability to run Database Manipulation operations across the entire database schema with no restrictions. -* `cluster_user` - This role is an internal system role type that is managed internally to allow clustered instances to communicate with one another. - * This role is an internally managed role to facilitate communication between clustered instances. -* `structure_user` - This role provides specific access for creation and deletion of data. - * When defining this role type you can either assign a value of true which will allow the role to create and drop databases & tables. Alternatively the role type can be assigned a string array. The values in this array are databases and allows the role to only create and drop tables in the designated databases. +- `super_user` - This role provides full access to all operations and methods within a Harper instance, this can be considered the admin role. + - This role provides full access to all Database Definition operations and the ability to run Database Manipulation operations across the entire database schema with no restrictions. +- `cluster_user` - This role is an internal system role type that is managed internally to allow clustered instances to communicate with one another. + - This role is an internally managed role to facilitate communication between clustered instances. +- `structure_user` - This role provides specific access for creation and deletion of data. + - When defining this role type you can either assign a value of true which will allow the role to create and drop databases & tables. Alternatively the role type can be assigned a string array. The values in this array are databases and allows the role to only create and drop tables in the designated databases. **User-Defined Roles** -In addition to built-in roles, admins (i.e. users assigned to the super\_user role) can create customized roles for other users to interact with and manipulate the data within explicitly defined tables and attributes. +In addition to built-in roles, admins (i.e. users assigned to the super_user role) can create customized roles for other users to interact with and manipulate the data within explicitly defined tables and attributes. -* Unless the user-defined role is given `super_user` permissions, permissions must be defined explicitly within the request body JSON. -* Describe operations will return metadata for all databases, tables, and attributes that a user-defined role has CRUD permissions for. +- Unless the user-defined role is given `super_user` permissions, permissions must be defined explicitly within the request body JSON. +- Describe operations will return metadata for all databases, tables, and attributes that a user-defined role has CRUD permissions for. **Role Permissions** When creating a new, user-defined role in a Harper instance, you must provide a role name and the permissions to assign to that role. _Reminder, only super users can create and manage roles._ -* `role` name used to easily identify the role assigned to individual users. +- `role` name used to easily identify the role assigned to individual users. - _Roles can be altered/dropped based on the role name used in and returned from a successful `add_role` , `alter_role`, or `list_roles` operation._ -* `permissions` used to explicitly define CRUD access to existing table data. + _Roles can be altered/dropped based on the role name used in and returned from a successful `add_role` , `alter_role`, or `list_roles` operation._ + +- `permissions` used to explicitly define CRUD access to existing table data. Example JSON for `add_role` request ```json { - "operation":"add_role", - "role":"software_developer", - "permission":{ - "super_user":false, - "database_name":{ - "tables": { - "table_name1": { - "read":true, - "insert":true, - "update":true, - "delete":false, - "attribute_permissions":[ - { - "attribute_name":"attribute1", - "read":true, - "insert":true, - "update":true - } - ] - }, - "table_name2": { - "read":true, - "insert":true, - "update":true, - "delete":false, - "attribute_permissions":[] - } - } - } - } + "operation": "add_role", + "role": "software_developer", + "permission": { + "super_user": false, + "database_name": { + "tables": { + "table_name1": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "attribute1", + "read": true, + "insert": true, + "update": true + } + ] + }, + "table_name2": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [] + } + } + } + } } ``` @@ -85,12 +86,13 @@ Example JSON for `add_role` request There are two parts to a permissions set: -* `super_user` – boolean value indicating if role should be provided super\_user access. +- `super_user` – boolean value indicating if role should be provided super_user access. + + _If `super_user` is set to true, there should be no additional database-specific permissions values included since the role will have access to the entire database schema. If permissions are included in the body of the operation, they will be stored within Harper, but ignored, as super_users have full access to the database._ - _If `super_user` is set to true, there should be no additional database-specific permissions values included since the role will have access to the entire database schema. If permissions are included in the body of the operation, they will be stored within Harper, but ignored, as super\_users have full access to the database._ -* `permissions`: Database tables that a role should have specific CRUD access to should be included in the final, database-specific `permissions` JSON. +- `permissions`: Database tables that a role should have specific CRUD access to should be included in the final, database-specific `permissions` JSON. - _For user-defined roles (i.e. non-super\_user roles, blank permissions will result in the user being restricted from accessing any of the database schema._ + _For user-defined roles (i.e. non-super_user roles, blank permissions will result in the user being restricted from accessing any of the database schema._ **Table Permissions JSON** @@ -124,139 +126,142 @@ Each table that a role should be given some level of CRUD permissions to must be 1. If there are attribute-specific CRUD permissions that need to be enforced on a table, those need to be explicitly described in the `attribute_permissions` array. 1. If a non-hash attribute is given some level of CRUD access, that same access will be assigned to the table’s `hash_attribute` (also referred to as the `primary_key`), even if it is not explicitly defined in the permissions JSON. - _See table\_name1’s permission set for an example of this – even though the table’s hash attribute is not specifically defined in the attribute\_permissions array, because the role has CRUD access to ‘attribute1’, the role will have the same access to the table’s hash attribute._ -1. If attribute-level permissions are set – _i.e. attribute\_permissions.length > 0_ – any table attribute not explicitly included will be assumed to have not CRUD access (with the exception of the `hash_attribute` described in #2). + _See table_name1’s permission set for an example of this – even though the table’s hash attribute is not specifically defined in the attribute_permissions array, because the role has CRUD access to ‘attribute1’, the role will have the same access to the table’s hash attribute._ + +1. If attribute-level permissions are set – _i.e. attribute_permissions.length > 0_ – any table attribute not explicitly included will be assumed to have not CRUD access (with the exception of the `hash_attribute` described in #2). + + _See table_name1’s permission set for an example of this – in this scenario, the role will have the ability to create, insert and update ‘attribute1’ and the table’s hash attribute but no other attributes on that table._ - _See table\_name1’s permission set for an example of this – in this scenario, the role will have the ability to create, insert and update ‘attribute1’ and the table’s hash attribute but no other attributes on that table._ 1. If an `attribute_permissions` array is empty, the role’s access to a table’s attributes will be based on the table-level CRUD permissions. - _See table\_name2’s permission set for an example of this._ + _See table_name2’s permission set for an example of this._ + 1. The `__createdtime__` and `__updatedtime__` attributes that Harper manages internally can have read perms set but, if set, all other attribute-level permissions will be ignored. 1. Please note that DELETE permissions are not included as a part of an individual attribute-level permission set. That is because it is not possible to delete individual attributes from a row, rows must be deleted in full. - * If a role needs the ability to delete rows from a table, that permission should be set on the table-level. - * The practical approach to deleting an individual attribute of a row would be to set that attribute to null via an update statement. + - If a role needs the ability to delete rows from a table, that permission should be set on the table-level. + - The practical approach to deleting an individual attribute of a row would be to set that attribute to null via an update statement. ## `Role-Based Operation Restrictions ` -The table below includes all API operations available in Harper and indicates whether or not the operation is restricted to super\_user roles. - -_Keep in mind that non-super\_user roles will also be restricted within the operations they do have access to by the database-level CRUD permissions set for the roles._ - -| Databases and Tables | Restricted to Super\_Users | -|----------------------| :------------------------: | -| describe\_all | | -| describe\_database | | -| describe\_table | | -| create\_database | X | -| drop\_database | X | -| create\_table | X | -| drop\_table | X | -| create\_attribute | | -| drop\_attribute | X | - -| NoSQL Operations | Restricted to Super\_Users | -| ---------------------- | :------------------------: | -| insert | | -| update | | -| upsert | | -| delete | | -| search\_by\_hash | | -| search\_by\_value | | -| search\_by\_conditions | | - -| SQL Operations | Restricted to Super\_Users | -| -------------- | :------------------------: | -| select | | -| insert | | -| update | | -| delete | | - -| Bulk Operations | Restricted to Super\_Users | -| ---------------- | :------------------------: | -| csv\_data\_load | | -| csv\_file\_load | | -| csv\_url\_load | | -| import\_from\_s3 | | - -| Users and Roles | Restricted to Super\_Users | -| --------------- | :------------------------: | -| list\_roles | X | -| add\_role | X | -| alter\_role | X | -| drop\_role | X | -| list\_users | X | -| user\_info | | -| add\_user | X | -| alter\_user | X | -| drop\_user | X | - -| Clustering | Restricted to Super\_Users | -| ----------------------- | :------------------------: | -| cluster\_set\_routes | X | -| cluster\_get\_routes | X | -| cluster\_delete\_routes | X | -| add\_node | X | -| update\_node | X | -| cluster\_status | X | -| remove\_node | X | -| configure\_cluster | X | - -| Components | Restricted to Super\_Users | -| -------------------- | :------------------------: | -| get\_components | X | -| get\_component\_file | X | -| set\_component\_file | X | -| drop\_component | X | -| add\_component | X | -| package\_component | X | -| deploy\_component | X | - -| Custom Functions | Restricted to Super\_Users | -| ---------------------------------- | :------------------------: | -| custom\_functions\_status | X | -| get\_custom\_functions | X | -| get\_custom\_function | X | -| set\_custom\_function | X | -| drop\_custom\_function | X | -| add\_custom\_function\_project | X | -| drop\_custom\_function\_project | X | -| package\_custom\_function\_project | X | -| deploy\_custom\_function\_project | X | - -| Registration | Restricted to Super\_Users | -| ------------------ | :------------------------: | -| registration\_info | | -| get\_fingerprint | X | -| set\_license | X | - -| Jobs | Restricted to Super\_Users | -| ----------------------------- | :------------------------: | -| get\_job | | -| search\_jobs\_by\_start\_date | X | - -| Logs | Restricted to Super\_Users | -| --------------------------------- | :------------------------: | -| read\_log | X | -| read\_transaction\_log | X | -| delete\_transaction\_logs\_before | X | -| read\_audit\_log | X | -| delete\_audit\_logs\_before | X | - -| Utilities | Restricted to Super\_Users | -| ----------------------- | :------------------------: | -| delete\_records\_before | X | -| export\_local | X | -| export\_to\_s3 | X | -| system\_information | X | -| restart | X | -| restart\_service | X | -| get\_configuration | X | -| configure\_cluster | X | - -| Token Authentication | Restricted to Super\_Users | -| ------------------------------ | :------------------------: | -| create\_authentication\_tokens | | -| refresh\_operation\_token | | +The table below includes all API operations available in Harper and indicates whether or not the operation is restricted to super_user roles. + +_Keep in mind that non-super_user roles will also be restricted within the operations they do have access to by the database-level CRUD permissions set for the roles._ + +| Databases and Tables | Restricted to Super_Users | +| -------------------- | :-----------------------: | +| describe_all | | +| describe_database | | +| describe_table | | +| create_database | X | +| drop_database | X | +| create_table | X | +| drop_table | X | +| create_attribute | | +| drop_attribute | X | + +| NoSQL Operations | Restricted to Super_Users | +| -------------------- | :-----------------------: | +| insert | | +| update | | +| upsert | | +| delete | | +| search_by_hash | | +| search_by_value | | +| search_by_conditions | | + +| SQL Operations | Restricted to Super_Users | +| -------------- | :-----------------------: | +| select | | +| insert | | +| update | | +| delete | | + +| Bulk Operations | Restricted to Super_Users | +| --------------- | :-----------------------: | +| csv_data_load | | +| csv_file_load | | +| csv_url_load | | +| import_from_s3 | | + +| Users and Roles | Restricted to Super_Users | +| --------------- | :-----------------------: | +| list_roles | X | +| add_role | X | +| alter_role | X | +| drop_role | X | +| list_users | X | +| user_info | | +| add_user | X | +| alter_user | X | +| drop_user | X | + +| Clustering | Restricted to Super_Users | +| --------------------- | :-----------------------: | +| cluster_set_routes | X | +| cluster_get_routes | X | +| cluster_delete_routes | X | +| add_node | X | +| update_node | X | +| cluster_status | X | +| remove_node | X | +| configure_cluster | X | + +| Components | Restricted to Super_Users | +| ------------------ | :-----------------------: | +| get_components | X | +| get_component_file | X | +| set_component_file | X | +| drop_component | X | +| add_component | X | +| package_component | X | +| deploy_component | X | + +| Custom Functions | Restricted to Super_Users | +| ------------------------------- | :-----------------------: | +| custom_functions_status | X | +| get_custom_functions | X | +| get_custom_function | X | +| set_custom_function | X | +| drop_custom_function | X | +| add_custom_function_project | X | +| drop_custom_function_project | X | +| package_custom_function_project | X | +| deploy_custom_function_project | X | + +| Registration | Restricted to Super_Users | +| ----------------- | :-----------------------: | +| registration_info | | +| get_fingerprint | X | +| set_license | X | + +| Jobs | Restricted to Super_Users | +| ------------------------- | :-----------------------: | +| get_job | | +| search_jobs_by_start_date | X | + +| Logs | Restricted to Super_Users | +| ------------------------------ | :-----------------------: | +| read_log | X | +| read_transaction_log | X | +| delete_transaction_logs_before | X | +| read_audit_log | X | +| delete_audit_logs_before | X | + +| Utilities | Restricted to Super_Users | +| --------------------- | :-----------------------: | +| delete_records_before | X | +| export_local | X | +| export_to_s3 | X | +| system_information | X | +| restart | X | +| restart_service | X | +| get_configuration | X | +| configure_cluster | X | + +| Token Authentication | Restricted to Super_Users | +| ---------------------------- | :-----------------------: | +| create_authentication_tokens | | +| refresh_operation_token | | ## Error: Must execute as User @@ -264,4 +269,4 @@ _Keep in mind that non-super\_user roles will also be restricted within the oper This means that you installed Harper as `<>`. Because Harper stores files natively on the operating system, we only allow the Harper executable to be run by a single user. This prevents permissions issues on files. -For example if you installed as user\_a, but later wanted to run as user\_b. User\_b may not have access to the hdb files Harper needs. This also keeps Harper more secure as it allows you to lock files down to a specific user and prevents other users from accessing your files. +For example if you installed as user_a, but later wanted to run as user_b. User_b may not have access to the hdb files Harper needs. This also keeps Harper more secure as it allows you to lock files down to a specific user and prevents other users from accessing your files. diff --git a/site/versioned_docs/version-4.4/developers/sql-guide/date-functions.md b/site/versioned_docs/version-4.4/developers/sql-guide/date-functions.md index 8503ca91..d44917c3 100644 --- a/site/versioned_docs/version-4.4/developers/sql-guide/date-functions.md +++ b/site/versioned_docs/version-4.4/developers/sql-guide/date-functions.md @@ -44,6 +44,7 @@ Referencing this variable will evaluate as the current Unix Timestamp in millise "current_timestamp_result": 1587568845765 } ``` + ### DATE([date_string]) Formats and returns the date_string argument in UTC in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. @@ -68,9 +69,8 @@ If a date_string is not provided, the function will return the current UTC date/ Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. - | Key | Shorthand | -|--------------|-----------| +| ------------ | --------- | | years | y | | quarters | Q | | months | M | @@ -81,7 +81,6 @@ Adds the defined amount of time to the date provided in UTC and returns the resu | seconds | s | | milliseconds | ms | - ``` "SELECT DATE_ADD(1587568845765, 1, 'days') AS date_add_result" AND "SELECT DATE_ADD(1587568845765, 1, 'd') AS date_add_result" both return @@ -103,13 +102,14 @@ AS date_add_result2" returns Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. Accepted interval values: -* years -* months -* weeks -* days -* hours -* minutes -* seconds + +- years +- months +- weeks +- days +- hours +- minutes +- seconds ``` "SELECT DATE_DIFF(CURRENT_TIMESTAMP, 1650643129017, 'hours') @@ -136,7 +136,7 @@ AS date_format_result" returns Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date_sub interval values- Either string value (key or shorthand) can be passed as the interval argument. | Key | Shorthand | -|--------------|-----------| +| ------------ | --------- | | years | y | | quarters | Q | | months | M | @@ -147,7 +147,6 @@ Subtracts the defined amount of time from the date provided in UTC and returns t | seconds | s | | milliseconds | ms | - ``` "SELECT DATE_SUB(1587568845765, 2, 'years') AS date_sub_result" returns { @@ -159,15 +158,15 @@ Subtracts the defined amount of time from the date provided in UTC and returns t Extracts and returns the date_part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” -| date_part | Example return value* | -|--------------|------------------------| -| year | “2020” | -| month | “3” | -| day | “26” | - | hour | “15” | -| minute | “13” | -| second | “2” | -| millisecond | “41” | +| date_part | Example return value\* | +| ----------- | ---------------------- | +| year | “2020” | +| month | “3” | +| day | “26” | +| hour | “15” | +| minute | “13” | +| second | “2” | +| millisecond | “41” | ``` "SELECT EXTRACT(1587568845765, 'year') AS extract_result" returns @@ -188,6 +187,7 @@ Returns the current Unix Timestamp in milliseconds. ``` ### GET_SERVER_TIME() + Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. ``` @@ -198,6 +198,7 @@ Returns the current date/time value based on the server’s timezone in `YYYY-MM ``` ### OFFSET_UTC(date, offset) + Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. ``` @@ -215,6 +216,7 @@ Returns the UTC date time value with the offset provided included in the return ``` ### NOW() + Returns the current Unix Timestamp in milliseconds. ``` @@ -223,4 +225,3 @@ Returns the current Unix Timestamp in milliseconds. "now_result": 1587568845765 } ``` - diff --git a/site/versioned_docs/version-4.4/developers/sql-guide/features-matrix.md b/site/versioned_docs/version-4.4/developers/sql-guide/features-matrix.md index f4225cf9..f436ad62 100644 --- a/site/versioned_docs/version-4.4/developers/sql-guide/features-matrix.md +++ b/site/versioned_docs/version-4.4/developers/sql-guide/features-matrix.md @@ -12,77 +12,77 @@ Harper encourages developers to utilize other querying tools over SQL for perfor Harper provides access to most SQL functions, and we’re always expanding that list. Check below to see if we cover what you need. -| INSERT | | -| ---------------------------------- | - | -| Values - multiple values supported | ✔ | -| Sub-SELECT | ✗ | +| INSERT | | +| ---------------------------------- | --- | +| Values - multiple values supported | ✔ | +| Sub-SELECT | ✗ | -| UPDATE | | -| ---------------- | - | -| SET | ✔ | -| Sub-SELECT | ✗ | -| Conditions | ✔ | -| Date Functions\* | ✔ | -| Math Functions | ✔ | +| UPDATE | | +| ---------------- | --- | +| SET | ✔ | +| Sub-SELECT | ✗ | +| Conditions | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | -| DELETE | | -| ---------- | - | -| FROM | ✔ | -| Sub-SELECT | ✗ | -| Conditions | ✔ | +| DELETE | | +| ---------- | --- | +| FROM | ✔ | +| Sub-SELECT | ✗ | +| Conditions | ✔ | -| SELECT | | -| -------------------- | - | -| Column SELECT | ✔ | -| Aliases | ✔ | -| Aggregator Functions | ✔ | -| Date Functions\* | ✔ | -| Math Functions | ✔ | -| Constant Values | ✔ | -| Distinct | ✔ | -| Sub-SELECT | ✗ | +| SELECT | | +| -------------------- | --- | +| Column SELECT | ✔ | +| Aliases | ✔ | +| Aggregator Functions | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | +| Constant Values | ✔ | +| Distinct | ✔ | +| Sub-SELECT | ✗ | -| FROM | | -| ---------------- | - | -| Multi-table JOIN | ✔ | -| INNER JOIN | ✔ | -| LEFT OUTER JOIN | ✔ | -| LEFT INNER JOIN | ✔ | -| RIGHT OUTER JOIN | ✔ | -| RIGHT INNER JOIN | ✔ | -| FULL JOIN | ✔ | -| UNION | ✗ | -| Sub-SELECT | ✗ | -| TOP | ✔ | +| FROM | | +| ---------------- | --- | +| Multi-table JOIN | ✔ | +| INNER JOIN | ✔ | +| LEFT OUTER JOIN | ✔ | +| LEFT INNER JOIN | ✔ | +| RIGHT OUTER JOIN | ✔ | +| RIGHT INNER JOIN | ✔ | +| FULL JOIN | ✔ | +| UNION | ✗ | +| Sub-SELECT | ✗ | +| TOP | ✔ | -| WHERE | | -| -------------------------- | - | -| Multi-Conditions | ✔ | -| Wildcards | ✔ | -| IN | ✔ | -| LIKE | ✔ | -| Bit-wise Operators AND, OR | ✔ | -| Bit-wise Operators NOT | ✔ | -| NULL | ✔ | -| BETWEEN | ✔ | -| EXISTS,ANY,ALL | ✔ | -| Compare columns | ✔ | -| Compare constants | ✔ | -| Date Functions\* | ✔ | -| Math Functions | ✔ | -| Sub-SELECT | ✗ | +| WHERE | | +| -------------------------- | --- | +| Multi-Conditions | ✔ | +| Wildcards | ✔ | +| IN | ✔ | +| LIKE | ✔ | +| Bit-wise Operators AND, OR | ✔ | +| Bit-wise Operators NOT | ✔ | +| NULL | ✔ | +| BETWEEN | ✔ | +| EXISTS,ANY,ALL | ✔ | +| Compare columns | ✔ | +| Compare constants | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | +| Sub-SELECT | ✗ | -| GROUP BY | | -| --------------------- | - | -| Multi-Column GROUP BY | ✔ | +| GROUP BY | | +| --------------------- | --- | +| Multi-Column GROUP BY | ✔ | -| HAVING | | -| ----------------------------- | - | -| Aggregate function conditions | ✔ | +| HAVING | | +| ----------------------------- | --- | +| Aggregate function conditions | ✔ | -| ORDER BY | | -| --------------------- | - | -| Multi-Column ORDER BY | ✔ | -| Aliases | ✔ | -| Date Functions\* | ✔ | -| Math Functions | ✔ | +| ORDER BY | | +| --------------------- | --- | +| Multi-Column ORDER BY | ✔ | +| Aliases | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | diff --git a/site/versioned_docs/version-4.4/developers/sql-guide/functions.md b/site/versioned_docs/version-4.4/developers/sql-guide/functions.md index 70b9cdfe..0847a657 100644 --- a/site/versioned_docs/version-4.4/developers/sql-guide/functions.md +++ b/site/versioned_docs/version-4.4/developers/sql-guide/functions.md @@ -11,147 +11,149 @@ Harper encourages developers to utilize other querying tools over SQL for perfor This SQL keywords reference contains the SQL functions available in Harper. ## Functions + ### Aggregate -| Keyword | Syntax | Description | -|-----------------|---------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| -| AVG | AVG(_expression_) | Returns the average of a given numeric expression. | -| COUNT | SELECT COUNT(_column_name_) FROM _database.table_ WHERE _condition_ | Returns the number records that match the given criteria. Nulls are not counted. | -| GROUP_CONCAT | GROUP_CONCAT(_expression_) | Returns a string with concatenated values that are comma separated and that are non-null from a group. Will return null when there are non-null values. | -| MAX | SELECT MAX(_column_name_) FROM _database.table_ WHERE _condition_ | Returns largest value in a specified column. | -| MIN | SELECT MIN(_column_name_) FROM _database.table_ WHERE _condition_ | Returns smallest value in a specified column. | -| SUM | SUM(_column_name_) | Returns the sum of the numeric values provided. | -| ARRAY* | ARRAY(_expression_) | Returns a list of data as a field. | -| DISTINCT_ARRAY* | DISTINCT_ARRAY(_expression_) | When placed around a standard ARRAY() function, returns a distinct (deduplicated) results set. | +| Keyword | Syntax | Description | +| ---------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| AVG | AVG(_expression_) | Returns the average of a given numeric expression. | +| COUNT | SELECT COUNT(_column_name_) FROM _database.table_ WHERE _condition_ | Returns the number records that match the given criteria. Nulls are not counted. | +| GROUP_CONCAT | GROUP*CONCAT(\_expression*) | Returns a string with concatenated values that are comma separated and that are non-null from a group. Will return null when there are non-null values. | +| MAX | SELECT MAX(_column_name_) FROM _database.table_ WHERE _condition_ | Returns largest value in a specified column. | +| MIN | SELECT MIN(_column_name_) FROM _database.table_ WHERE _condition_ | Returns smallest value in a specified column. | +| SUM | SUM(_column_name_) | Returns the sum of the numeric values provided. | +| ARRAY\* | ARRAY(_expression_) | Returns a list of data as a field. | +| DISTINCT_ARRAY\* | DISTINCT*ARRAY(\_expression*) | When placed around a standard ARRAY() function, returns a distinct (deduplicated) results set. | -*For more information on ARRAY() and DISTINCT_ARRAY() see [this blog](https://www.harperdb.io/post/sql-queries-to-complex-objects). +\*For more information on ARRAY() and DISTINCT_ARRAY() see [this blog](https://www.harperdb.io/post/sql-queries-to-complex-objects). ### Conversion -| Keyword | Syntax | Description | -|---------|--------------------------------------------------|------------------------------------------------------------------------| -| CAST | CAST(_expression AS datatype(length)_) | Converts a value to a specified datatype. | -| CONVERT | CONVERT(_data_type(length), expression, style_) | Converts a value from one datatype to a different, specified datatype. | - +| Keyword | Syntax | Description | +| ------- | ----------------------------------------------- | ---------------------------------------------------------------------- | +| CAST | CAST(_expression AS datatype(length)_) | Converts a value to a specified datatype. | +| CONVERT | CONVERT(_data_type(length), expression, style_) | Converts a value from one datatype to a different, specified datatype. | ### Date & Time -| Keyword | Syntax | Description | -|-------------------|-----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CURRENT_DATE | CURRENT_DATE() | Returns the current date in UTC in “YYYY-MM-DD” String format. | -| CURRENT_TIME | CURRENT_TIME() | Returns the current time in UTC in “HH:mm:ss.SSS” string format. | -| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | Referencing this variable will evaluate as the current Unix Timestamp in milliseconds. For more information, go here. | +| Keyword | Syntax | Description | +| ----------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------- | +| CURRENT_DATE | CURRENT_DATE() | Returns the current date in UTC in “YYYY-MM-DD” String format. | +| CURRENT_TIME | CURRENT_TIME() | Returns the current time in UTC in “HH:mm:ss.SSS” string format. | +| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | Referencing this variable will evaluate as the current Unix Timestamp in milliseconds. For more information, go here. | + | -| DATE | DATE([_date_string_]) | Formats and returns the date_string argument in UTC in ‘YYYY-MM-DDTHH:mm:ss.SSSZZ’ string format. If a date_string is not provided, the function will return the current UTC date/time value in the return format defined above. For more information, go here. | +| DATE | DATE([_date_string_]) | Formats and returns the date*string argument in UTC in ‘YYYY-MM-DDTHH:mm:ss.SSSZZ’ string format. If a date_string is not provided, the function will return the current UTC date/time value in the return format defined above. For more information, go here. | | -| DATE_ADD | DATE_ADD(_date, value, interval_) | Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | +| DATE_ADD | DATE_ADD(\_date, value, interval*) | Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | | -| DATE_DIFF | DATEDIFF(_date_1, date_2[, interval]_) | Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. For more information, go here. | +| DATE*DIFF | DATEDIFF(\_date_1, date_2[, interval]*) | Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. For more information, go here. | | -| DATE_FORMAT | DATE_FORMAT(_date, format_) | Formats and returns a date value in the String format provided. Find more details on accepted format values in the moment.js docs. For more information, go here. | +| DATE*FORMAT | DATE_FORMAT(\_date, format*) | Formats and returns a date value in the String format provided. Find more details on accepted format values in the moment.js docs. For more information, go here. | | -| DATE_SUB | DATE_SUB(_date, format_) | Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date_sub interval values- Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | +| DATE*SUB | DATE_SUB(\_date, format*) | Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date*sub interval values- Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | | -| DAY | DAY(_date_) | Return the day of the month for the given date. | +| DAY | DAY(\_date*) | Return the day of the month for the given date. | | -| DAYOFWEEK | DAYOFWEEK(_date_) | Returns the numeric value of the weekday of the date given(“YYYY-MM-DD”).NOTE: 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, and 6=Saturday. | -| EXTRACT | EXTRACT(_date, date_part_) | Extracts and returns the date_part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” For more information, go here. | +| DAYOFWEEK | DAYOFWEEK(_date_) | Returns the numeric value of the weekday of the date given(“YYYY-MM-DD”).NOTE: 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, and 6=Saturday. | +| EXTRACT | EXTRACT(_date, date_part_) | Extracts and returns the date*part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” For more information, go here. | | -| GETDATE | GETDATE() | Returns the current Unix Timestamp in milliseconds. | -| GET_SERVER_TIME | GET_SERVER_TIME() | Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. | -| OFFSET_UTC | OFFSET_UTC(_date, offset_) | Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. | -| NOW | NOW() | Returns the current Unix Timestamp in milliseconds. | +| GETDATE | GETDATE() | Returns the current Unix Timestamp in milliseconds. | +| GET_SERVER_TIME | GET_SERVER_TIME() | Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. | +| OFFSET_UTC | OFFSET_UTC(\_date, offset*) | Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. | +| NOW | NOW() | Returns the current Unix Timestamp in milliseconds. | | -| HOUR | HOUR(_datetime_) | Returns the hour part of a given date in range of 0 to 838. | +| HOUR | HOUR(_datetime_) | Returns the hour part of a given date in range of 0 to 838. | | -| MINUTE | MINUTE(_datetime_) | Returns the minute part of a time/datetime in range of 0 to 59. | +| MINUTE | MINUTE(_datetime_) | Returns the minute part of a time/datetime in range of 0 to 59. | | -| MONTH | MONTH(_date_) | Returns month part for a specified date in range of 1 to 12. | +| MONTH | MONTH(_date_) | Returns month part for a specified date in range of 1 to 12. | | -| SECOND | SECOND(_datetime_) | Returns the seconds part of a time/datetime in range of 0 to 59. | -| YEAR | YEAR(_date_) | Returns the year part for a specified date. | +| SECOND | SECOND(_datetime_) | Returns the seconds part of a time/datetime in range of 0 to 59. | +| YEAR | YEAR(_date_) | Returns the year part for a specified date. | | ### Logical -| Keyword | Syntax | Description | -|---------|--------------------------------------------------|--------------------------------------------------------------------------------------------| -| IF | IF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | -| IIF | IIF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | -| IFNULL | IFNULL(_expression, alt_value_) | Returns a specified value if the expression is null. | -| NULLIF | NULLIF(_expression_1, expression_2_) | Returns null if expression_1 is equal to expression_2, if not equal, returns expression_1. | +| Keyword | Syntax | Description | +| ------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------ | +| IF | IF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | +| IIF | IIF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | +| IFNULL | IFNULL(_expression, alt_value_) | Returns a specified value if the expression is null. | +| NULLIF | NULLIF(_expression_1, expression_2_) | Returns null if expression_1 is equal to expression_2, if not equal, returns expression_1. | ### Mathematical -| Keyword | Syntax | Description | -|---------|---------------------------------|-----------------------------------------------------------------------------------------------------| -| ABS | ABS(_expression_) | Returns the absolute value of a given numeric expression. | -| CEIL | CEIL(_number_) | Returns integer ceiling, the smallest integer value that is bigger than or equal to a given number. | -| EXP | EXP(_number_) | Returns e to the power of a specified number. | -| FLOOR | FLOOR(_number_) | Returns the largest integer value that is smaller than, or equal to, a given number. | -| RANDOM | RANDOM(_seed_) | Returns a pseudo random number. | -| ROUND | ROUND(_number,decimal_places_) | Rounds a given number to a specified number of decimal places. | -| SQRT | SQRT(_expression_) | Returns the square root of an expression. | - +| Keyword | Syntax | Description | +| ------- | ------------------------------ | --------------------------------------------------------------------------------------------------- | +| ABS | ABS(_expression_) | Returns the absolute value of a given numeric expression. | +| CEIL | CEIL(_number_) | Returns integer ceiling, the smallest integer value that is bigger than or equal to a given number. | +| EXP | EXP(_number_) | Returns e to the power of a specified number. | +| FLOOR | FLOOR(_number_) | Returns the largest integer value that is smaller than, or equal to, a given number. | +| RANDOM | RANDOM(_seed_) | Returns a pseudo random number. | +| ROUND | ROUND(_number,decimal_places_) | Rounds a given number to a specified number of decimal places. | +| SQRT | SQRT(_expression_) | Returns the square root of an expression. | ### String -| Keyword | Syntax | Description | -|-------------|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CONCAT | CONCAT(_string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together, resulting in a single string. | -| CONCAT_WS | CONCAT_WS(_separator, string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together with a separator, resulting in a single string. | -| INSTR | INSTR(_string_1, string_2_) | Returns the first position, as an integer, of string_2 within string_1. | -| LEN | LEN(_string_) | Returns the length of a string. | -| LOWER | LOWER(_string_) | Converts a string to lower-case. | -| REGEXP | SELECT _column_name_ FROM _database.table_ WHERE _column_name_ REGEXP _pattern_ | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | -| REGEXP_LIKE | SELECT _column_name_ FROM _database.table_ WHERE REGEXP_LIKE(_column_name, pattern_) | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | -| REPLACE | REPLACE(_string, old_string, new_string_) | Replaces all instances of old_string within new_string, with string. | -| SUBSTRING | SUBSTRING(_string, string_position, length_of_substring_) | Extracts a specified amount of characters from a string. | -| TRIM | TRIM([_character(s) FROM_] _string_) | Removes leading and trailing spaces, or specified character(s), from a string. | -| UPPER | UPPER(_string_) | Converts a string to upper-case. | +| Keyword | Syntax | Description | +| ----------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| CONCAT | CONCAT(_string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together, resulting in a single string. | +| CONCAT_WS | CONCAT*WS(\_separator, string_1, string_2, ...., string_n*) | Concatenates, or joins, two or more strings together with a separator, resulting in a single string. | +| INSTR | INSTR(_string_1, string_2_) | Returns the first position, as an integer, of string_2 within string_1. | +| LEN | LEN(_string_) | Returns the length of a string. | +| LOWER | LOWER(_string_) | Converts a string to lower-case. | +| REGEXP | SELECT _column_name_ FROM _database.table_ WHERE _column_name_ REGEXP _pattern_ | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | +| REGEXP_LIKE | SELECT _column_name_ FROM _database.table_ WHERE REGEXP*LIKE(\_column_name, pattern*) | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | +| REPLACE | REPLACE(_string, old_string, new_string_) | Replaces all instances of old_string within new_string, with string. | +| SUBSTRING | SUBSTRING(_string, string_position, length_of_substring_) | Extracts a specified amount of characters from a string. | +| TRIM | TRIM([_character(s) FROM_] _string_) | Removes leading and trailing spaces, or specified character(s), from a string. | +| UPPER | UPPER(_string_) | Converts a string to upper-case. | ## Operators + ### Logical Operators -| Keyword | Syntax | Description | -|----------|--------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------| -| BETWEEN | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ BETWEEN _value_1_ AND _value_2_ | (inclusive) Returns values(numbers, text, or dates) within a given range. | -| IN | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IN(_value(s)_) | Used to specify multiple values in a WHERE clause. | -| LIKE | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_n_ LIKE _pattern_ | Searches for a specified pattern within a WHERE clause. | +| Keyword | Syntax | Description | +| ------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| BETWEEN | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ BETWEEN _value_1_ AND _value_2_ | (inclusive) Returns values(numbers, text, or dates) within a given range. | +| IN | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IN(_value(s)_) | Used to specify multiple values in a WHERE clause. | +| LIKE | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_n_ LIKE _pattern_ | Searches for a specified pattern within a WHERE clause. | ## Queries + ### General -| Keyword | Syntax | Description | -|-----------|--------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------| -| DISTINCT | SELECT DISTINCT _column_name(s)_ FROM _database.table_ | Returns only unique values, eliminating duplicate records. | -| FROM | FROM _database.table_ | Used to list the database(s), table(s), and any joins required for a SQL statement. | -| GROUP BY | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ GROUP BY _column_name(s)_ ORDER BY _column_name(s)_ | Groups rows that have the same values into summary rows. | -| HAVING | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ GROUP BY _column_name(s)_ HAVING _condition_ ORDER BY _column_name(s)_ | Filters data based on a group or aggregate function. | -| SELECT | SELECT _column_name(s)_ FROM _database.table_ | Selects data from table. | -| WHERE | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ | Extracts records based on a defined condition. | +| Keyword | Syntax | Description | +| -------- | -------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| DISTINCT | SELECT DISTINCT _column_name(s)_ FROM _database.table_ | Returns only unique values, eliminating duplicate records. | +| FROM | FROM _database.table_ | Used to list the database(s), table(s), and any joins required for a SQL statement. | +| GROUP BY | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ GROUP BY _column_name(s)_ ORDER BY _column_name(s)_ | Groups rows that have the same values into summary rows. | +| HAVING | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ GROUP BY _column_name(s)_ HAVING _condition_ ORDER BY _column_name(s)_ | Filters data based on a group or aggregate function. | +| SELECT | SELECT _column_name(s)_ FROM _database.table_ | Selects data from table. | +| WHERE | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ | Extracts records based on a defined condition. | ### Joins -| Keyword | Syntax | Description | -|---------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CROSS JOIN | SELECT _column_name(s)_ FROM _database.table_1_ CROSS JOIN _database.table_2_ | Returns a paired combination of each row from _table_1_ with row from _table_2_. _Note: CROSS JOIN can return very large result sets and is generally considered bad practice._ | -| FULL OUTER | SELECT _column_name(s)_ FROM _database.table_1_ FULL OUTER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ WHERE _condition_ | Returns all records when there is a match in either _table_1_ (left table) or _table_2_ (right table). | -| [INNER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ INNER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return only matching records from _table_1_ (left table) and _table_2_ (right table). The INNER keyword is optional and does not affect the result. | -| LEFT [OUTER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ LEFT OUTER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return all records from _table_1_ (left table) and matching data from _table_2_ (right table). The OUTER keyword is optional and does not affect the result. | -| RIGHT [OUTER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ RIGHT OUTER JOIN _database.table_2_ ON _table_1.column_name = table_2.column_name_ | Return all records from _table_2_ (right table) and matching data from _table_1_ (left table). The OUTER keyword is optional and does not affect the result. | +| Keyword | Syntax | Description | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| CROSS JOIN | SELECT _column_name(s)_ FROM _database.table_1_ CROSS JOIN _database.table_2_ | Returns a paired combination of each row from _table_1_ with row from _table_2_. _Note: CROSS JOIN can return very large result sets and is generally considered bad practice._ | +| FULL OUTER | SELECT _column_name(s)_ FROM _database.table_1_ FULL OUTER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ WHERE _condition_ | Returns all records when there is a match in either _table_1_ (left table) or _table_2_ (right table). | +| [INNER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ INNER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return only matching records from _table_1_ (left table) and _table_2_ (right table). The INNER keyword is optional and does not affect the result. | +| LEFT [OUTER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ LEFT OUTER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return all records from _table_1_ (left table) and matching data from _table_2_ (right table). The OUTER keyword is optional and does not affect the result. | +| RIGHT [OUTER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ RIGHT OUTER JOIN _database.table_2_ ON _table_1.column_name = table_2.column_name_ | Return all records from _table_2_ (right table) and matching data from _table_1_ (left table). The OUTER keyword is optional and does not affect the result. | ### Predicates -| Keyword | Syntax | Description | -|--------------|------------------------------------------------------------------------------|----------------------------| -| IS NOT NULL | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IS NOT NULL | Tests for non-null values. | -| IS NULL | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IS NULL | Tests for null values. | +| Keyword | Syntax | Description | +| ----------- | ----------------------------------------------------------------------------- | -------------------------- | +| IS NOT NULL | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IS NOT NULL | Tests for non-null values. | +| IS NULL | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IS NULL | Tests for null values. | ### Statements -| Keyword | Syntax | Description | -|---------|---------------------------------------------------------------------------------------------|-------------------------------------| +| Keyword | Syntax | Description | +| ------- | --------------------------------------------------------------------------------------------- | ----------------------------------- | | DELETE | DELETE FROM _database.table_ WHERE condition | Deletes existing data from a table. | | INSERT | INSERT INTO _database.table(column_name(s))_ VALUES(_value(s)_) | Inserts new records into a table. | | UPDATE | UPDATE _database.table_ SET _column_1 = value_1, column_2 = value_2, ....,_ WHERE _condition_ | Alters existing records in a table. | diff --git a/site/versioned_docs/version-4.4/developers/sql-guide/index.md b/site/versioned_docs/version-4.4/developers/sql-guide/index.md index 941be5d0..18674950 100644 --- a/site/versioned_docs/version-4.4/developers/sql-guide/index.md +++ b/site/versioned_docs/version-4.4/developers/sql-guide/index.md @@ -72,9 +72,9 @@ DELETE FROM dev.dog Harper allows developers to join any number of tables and currently supports the following join types: -* INNER JOIN LEFT -* INNER JOIN LEFT -* OUTER JOIN +- INNER JOIN LEFT +- INNER JOIN LEFT +- OUTER JOIN Here’s a basic example joining two tables from our Get Started example- joining a dogs table with a breeds table: diff --git a/site/versioned_docs/version-4.4/developers/sql-guide/json-search.md b/site/versioned_docs/version-4.4/developers/sql-guide/json-search.md index a7dddd0a..13bd3b90 100644 --- a/site/versioned_docs/version-4.4/developers/sql-guide/json-search.md +++ b/site/versioned_docs/version-4.4/developers/sql-guide/json-search.md @@ -8,11 +8,11 @@ Harper encourages developers to utilize other querying tools over SQL for perfor # SQL JSON Search -Harper automatically indexes all top level attributes in a row / object written to a table. However, any attributes which hold JSON data do not have their nested attributes indexed. In order to make searching and/or transforming these JSON documents easy, Harper offers a special SQL function called SEARCH\_JSON. The SEARCH\_JSON function works in SELECT & WHERE clauses allowing queries to perform powerful filtering on any element of your JSON by implementing the [JSONata library](https://docs.jsonata.org/overview.html) into our SQL engine. +Harper automatically indexes all top level attributes in a row / object written to a table. However, any attributes which hold JSON data do not have their nested attributes indexed. In order to make searching and/or transforming these JSON documents easy, Harper offers a special SQL function called SEARCH_JSON. The SEARCH_JSON function works in SELECT & WHERE clauses allowing queries to perform powerful filtering on any element of your JSON by implementing the [JSONata library](https://docs.jsonata.org/overview.html) into our SQL engine. ## Syntax -SEARCH\_JSON(_expression, attribute_) +SEARCH_JSON(_expression, attribute_) Executes the supplied string _expression_ against data of the defined top level _attribute_ for each row. The expression both filters and defines output from the JSON document. @@ -24,14 +24,14 @@ Here are two records in the database: ```json [ - { - "id": 1, - "name": ["Harper", "Penny"] - }, - { - "id": 2, - "name": ["Penny"] - } + { + "id": 1, + "name": ["Harper", "Penny"] + }, + { + "id": 2, + "name": ["Penny"] + } ] ``` @@ -64,37 +64,37 @@ A sample of this data from the movie The Avengers looks like ```json [ - { - "cast_id": 46, - "character": "Tony Stark / Iron Man", - "credit_id": "52fe4495c3a368484e02b251", - "gender": "male", - "id": 3223, - "name": "Robert Downey Jr.", - "order": 0 - }, - { - "cast_id": 2, - "character": "Steve Rogers / Captain America", - "credit_id": "52fe4495c3a368484e02b19b", - "gender": "male", - "id": 16828, - "name": "Chris Evans", - "order": 1 - }, - { - "cast_id": 307, - "character": "Bruce Banner / The Hulk", - "credit_id": "5e85e8083344c60015411cfa", - "gender": "male", - "id": 103, - "name": "Mark Ruffalo", - "order": 2 - } + { + "cast_id": 46, + "character": "Tony Stark / Iron Man", + "credit_id": "52fe4495c3a368484e02b251", + "gender": "male", + "id": 3223, + "name": "Robert Downey Jr.", + "order": 0 + }, + { + "cast_id": 2, + "character": "Steve Rogers / Captain America", + "credit_id": "52fe4495c3a368484e02b19b", + "gender": "male", + "id": 16828, + "name": "Chris Evans", + "order": 1 + }, + { + "cast_id": 307, + "character": "Bruce Banner / The Hulk", + "credit_id": "5e85e8083344c60015411cfa", + "gender": "male", + "id": 103, + "name": "Mark Ruffalo", + "order": 2 + } ] ``` -Let’s break down the SEARCH\_JSON function call in the SELECT: +Let’s break down the SEARCH_JSON function call in the SELECT: ``` SEARCH_JSON( @@ -117,7 +117,7 @@ SEARCH_JSON( ) ``` -The first argument passed to SEARCH\_JSON is the expression to execute against the second argument which is the cast attribute on the credits table. This expression will execute for every row. Looking into the expression it starts with “$\[…]” this tells the expression to iterate all elements of the cast array. +The first argument passed to SEARCH_JSON is the expression to execute against the second argument which is the cast attribute on the credits table. This expression will execute for every row. Looking into the expression it starts with “$\[…]” this tells the expression to iterate all elements of the cast array. Then the expression tells the function to only return entries where the name attribute matches any of the actors defined in the array: @@ -131,22 +131,22 @@ So far, we’ve iterated the array and filtered out rows, but we also want the r ```json [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - } + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + } ] ``` -Just having the SEARCH\_JSON function in our SELECT is powerful, but given our criteria it would still return every other movie that doesn’t have our matching actors, in order to filter out the movies we do not want we also use SEARCH\_JSON in the WHERE clause. +Just having the SEARCH_JSON function in our SELECT is powerful, but given our criteria it would still return every other movie that doesn’t have our matching actors, in order to filter out the movies we do not want we also use SEARCH_JSON in the WHERE clause. This function call in the WHERE clause is similar, but we don’t need to perform the same transformation as occurred in the SELECT: @@ -172,6 +172,6 @@ SEARCH_JSON( As seen above we execute the same name filter against the cast array, the primary difference is we are wrapping the filtered results in $count(…). As it looks this returns a count of the results back which we then use against our SQL comparator of >= 2. -To see further SEARCH\_JSON examples in action view our Postman Collection that provides a [sample database & data with query examples](../operations-api/advanced-json-sql-examples). +To see further SEARCH_JSON examples in action view our Postman Collection that provides a [sample database & data with query examples](../operations-api/advanced-json-sql-examples). To learn more about how to build expressions check out the JSONata documentation: [https://docs.jsonata.org/overview](https://docs.jsonata.org/overview) diff --git a/site/versioned_docs/version-4.4/developers/sql-guide/reserved-word.md b/site/versioned_docs/version-4.4/developers/sql-guide/reserved-word.md index 8ce9f025..2cd812ba 100644 --- a/site/versioned_docs/version-4.4/developers/sql-guide/reserved-word.md +++ b/site/versioned_docs/version-4.4/developers/sql-guide/reserved-word.md @@ -8,7 +8,7 @@ Harper encourages developers to utilize other querying tools over SQL for perfor # Harper SQL Reserved Words -This is a list of reserved words in the SQL Parser. Use of these words or symbols may result in unexpected behavior or inaccessible tables/attributes. If any of these words must be used, any SQL call referencing a database, table, or attribute must have backticks (`…`) or brackets ([…]) around the variable. +This is a list of reserved words in the SQL Parser. Use of these words or symbols may result in unexpected behavior or inaccessible tables/attributes. If any of these words must be used, any SQL call referencing a database, table, or attribute must have backticks (`…`) or brackets ([…]) around the variable. For Example, for a table called `ASSERT` in the `data` database, a SQL select on that table would look like: @@ -24,184 +24,184 @@ SELECT * from data.[ASSERT] ### RESERVED WORD LIST -* ABSOLUTE -* ACTION -* ADD -* AGGR -* ALL -* ALTER -* AND -* ANTI -* ANY -* APPLY -* ARRAY -* AS -* ASSERT -* ASC -* ATTACH -* AUTOINCREMENT -* AUTO_INCREMENT -* AVG -* BEGIN -* BETWEEN -* BREAK -* BY -* CALL -* CASE -* CAST -* CHECK -* CLASS -* CLOSE -* COLLATE -* COLUMN -* COLUMNS -* COMMIT -* CONSTRAINT -* CONTENT -* CONTINUE -* CONVERT -* CORRESPONDING -* COUNT -* CREATE -* CROSS -* CUBE -* CURRENT_TIMESTAMP -* CURSOR -* DATABASE -* DECLARE -* DEFAULT -* DELETE -* DELETED -* DESC -* DETACH -* DISTINCT -* DOUBLEPRECISION -* DROP -* ECHO -* EDGE -* END -* ENUM -* ELSE -* EXCEPT -* EXISTS -* EXPLAIN -* FALSE -* FETCH -* FIRST -* FOREIGN -* FROM -* GO -* GRAPH -* GROUP -* GROUPING -* HAVING -* HDB_HASH -* HELP -* IF -* IDENTITY -* IS -* IN -* INDEX -* INNER -* INSERT -* INSERTED -* INTERSECT -* INTO -* JOIN -* KEY -* LAST -* LET -* LEFT -* LIKE -* LIMIT -* LOOP -* MATCHED -* MATRIX -* MAX -* MERGE -* MIN -* MINUS -* MODIFY -* NATURAL -* NEXT -* NEW -* NOCASE -* NO -* NOT -* NULL -* OFF -* ON -* ONLY -* OFFSET -* OPEN -* OPTION -* OR -* ORDER -* OUTER -* OVER -* PATH -* PARTITION -* PERCENT -* PLAN -* PRIMARY -* PRINT -* PRIOR -* QUERY -* READ -* RECORDSET -* REDUCE -* REFERENCES -* RELATIVE -* REPLACE -* REMOVE -* RENAME -* REQUIRE -* RESTORE -* RETURN -* RETURNS -* RIGHT -* ROLLBACK -* ROLLUP -* ROW -* SCHEMA -* SCHEMAS -* SEARCH -* SELECT -* SEMI -* SET -* SETS -* SHOW -* SOME -* SOURCE -* STRATEGY -* STORE -* SYSTEM -* SUM -* TABLE -* TABLES -* TARGET -* TEMP -* TEMPORARY -* TEXTSTRING -* THEN -* TIMEOUT -* TO -* TOP -* TRAN -* TRANSACTION -* TRIGGER -* TRUE -* TRUNCATE -* UNION -* UNIQUE -* UPDATE -* USE -* USING -* VALUE -* VERTEX -* VIEW -* WHEN -* WHERE -* WHILE -* WITH -* WORK +- ABSOLUTE +- ACTION +- ADD +- AGGR +- ALL +- ALTER +- AND +- ANTI +- ANY +- APPLY +- ARRAY +- AS +- ASSERT +- ASC +- ATTACH +- AUTOINCREMENT +- AUTO_INCREMENT +- AVG +- BEGIN +- BETWEEN +- BREAK +- BY +- CALL +- CASE +- CAST +- CHECK +- CLASS +- CLOSE +- COLLATE +- COLUMN +- COLUMNS +- COMMIT +- CONSTRAINT +- CONTENT +- CONTINUE +- CONVERT +- CORRESPONDING +- COUNT +- CREATE +- CROSS +- CUBE +- CURRENT_TIMESTAMP +- CURSOR +- DATABASE +- DECLARE +- DEFAULT +- DELETE +- DELETED +- DESC +- DETACH +- DISTINCT +- DOUBLEPRECISION +- DROP +- ECHO +- EDGE +- END +- ENUM +- ELSE +- EXCEPT +- EXISTS +- EXPLAIN +- FALSE +- FETCH +- FIRST +- FOREIGN +- FROM +- GO +- GRAPH +- GROUP +- GROUPING +- HAVING +- HDB_HASH +- HELP +- IF +- IDENTITY +- IS +- IN +- INDEX +- INNER +- INSERT +- INSERTED +- INTERSECT +- INTO +- JOIN +- KEY +- LAST +- LET +- LEFT +- LIKE +- LIMIT +- LOOP +- MATCHED +- MATRIX +- MAX +- MERGE +- MIN +- MINUS +- MODIFY +- NATURAL +- NEXT +- NEW +- NOCASE +- NO +- NOT +- NULL +- OFF +- ON +- ONLY +- OFFSET +- OPEN +- OPTION +- OR +- ORDER +- OUTER +- OVER +- PATH +- PARTITION +- PERCENT +- PLAN +- PRIMARY +- PRINT +- PRIOR +- QUERY +- READ +- RECORDSET +- REDUCE +- REFERENCES +- RELATIVE +- REPLACE +- REMOVE +- RENAME +- REQUIRE +- RESTORE +- RETURN +- RETURNS +- RIGHT +- ROLLBACK +- ROLLUP +- ROW +- SCHEMA +- SCHEMAS +- SEARCH +- SELECT +- SEMI +- SET +- SETS +- SHOW +- SOME +- SOURCE +- STRATEGY +- STORE +- SYSTEM +- SUM +- TABLE +- TABLES +- TARGET +- TEMP +- TEMPORARY +- TEXTSTRING +- THEN +- TIMEOUT +- TO +- TOP +- TRAN +- TRANSACTION +- TRIGGER +- TRUE +- TRUNCATE +- UNION +- UNIQUE +- UPDATE +- USE +- USING +- VALUE +- VERTEX +- VIEW +- WHEN +- WHERE +- WHILE +- WITH +- WORK diff --git a/site/versioned_docs/version-4.4/developers/sql-guide/sql-geospatial-functions.md b/site/versioned_docs/version-4.4/developers/sql-guide/sql-geospatial-functions.md index 59978c1d..0c56cf10 100644 --- a/site/versioned_docs/version-4.4/developers/sql-guide/sql-geospatial-functions.md +++ b/site/versioned_docs/version-4.4/developers/sql-guide/sql-geospatial-functions.md @@ -10,13 +10,11 @@ Harper encourages developers to utilize other querying tools over SQL for perfor Harper geospatial features require data to be stored in a single column using the [GeoJSON standard](https://geojson.org/), a standard commonly used in geospatial technologies. Geospatial functions are available to be used in SQL statements. - - If you are new to GeoJSON you should check out the full specification here: [https://geojson.org/](https://geojson.org/). There are a few important things to point out before getting started. -1) All GeoJSON coordinates are stored in `[longitude, latitude]` format. -2) Coordinates or GeoJSON geometries must be passed as string when written directly in a SQL statement. -3) Note if you are using Postman for you testing. Due to limitations in the Postman client, you will need to escape quotes in your strings and your SQL will need to be passed on a single line. +1. All GeoJSON coordinates are stored in `[longitude, latitude]` format. +2. Coordinates or GeoJSON geometries must be passed as string when written directly in a SQL statement. +3. Note if you are using Postman for you testing. Due to limitations in the Postman client, you will need to escape quotes in your strings and your SQL will need to be passed on a single line. In the examples contained in the left-hand navigation, database and table names may change, but all GeoJSON data will be stored in a column named geo_data. @@ -31,7 +29,7 @@ geoArea(_geoJSON_) ### Parameters | Parameter | Description | -|-----------|---------------------------------| +| --------- | ------------------------------- | | geoJSON | Required. One or more features. | #### Example 1 @@ -72,10 +70,10 @@ geoLength(_geoJSON_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| geoJSON | Required. GeoJSON to measure. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| geoJSON | Required. GeoJSON to measure. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 @@ -116,10 +114,10 @@ geoDifference(_polygon1, polygon2_) ## Parameters -| Parameter | Description | -|------------|----------------------------------------------------------------------------| -| polygon1 | Required. Polygon or MultiPolygon GeoJSON feature. | -| polygon2 | Required. Polygon or MultiPolygon GeoJSON feature to remove from polygon1. | +| Parameter | Description | +| --------- | -------------------------------------------------------------------------- | +| polygon1 | Required. Polygon or MultiPolygon GeoJSON feature. | +| polygon2 | Required. Polygon or MultiPolygon GeoJSON feature to remove from polygon1. | ### Example @@ -173,11 +171,11 @@ geoDistance(_point1, point2_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| point1 | Required. GeoJSON Point specifying the origin. | -| point2 | Required. GeoJSON Point specifying the destination. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| point1 | Required. GeoJSON Point specifying the origin. | +| point2 | Required. GeoJSON Point specifying the destination. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 @@ -208,12 +206,12 @@ geoNear(_point1, point2, distance_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| point1 | Required. GeoJSON Point specifying the origin. | -| point2 | Required. GeoJSON Point specifying the destination. | -| distance | Required. The maximum distance in units as an integer or decimal. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| point1 | Required. GeoJSON Point specifying the origin. | +| point2 | Required. GeoJSON Point specifying the destination. | +| distance | Required. The maximum distance in units as an integer or decimal. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 @@ -246,10 +244,10 @@ geoContains(_geo1, geo2_) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------| -| geo1 | Required. Polygon or MultiPolygon GeoJSON feature. | -| geo2 | Required. Polygon or MultiPolygon GeoJSON feature tested to be contained by geo1. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------- | +| geo1 | Required. Polygon or MultiPolygon GeoJSON feature. | +| geo2 | Required. Polygon or MultiPolygon GeoJSON feature tested to be contained by geo1. | ### Example 1 @@ -308,15 +306,18 @@ WHERE geoContains(geo_data, '{ Determines if two GeoJSON features are the same type and have identical X,Y coordinate values. For more information see [https://developers.arcgis.com/documentation/spatial-references/](https://developers.arcgis.com/documentation/spatial-references/). Returns a Boolean. ## Syntax + geoEqual(_geo1_, _geo2_) ## Parameters -| Parameter | Description | -|------------|----------------------------------------| -| geo1 | Required. GeoJSON geometry or feature. | -| geo2 | Required. GeoJSON geometry or feature. | + +| Parameter | Description | +| --------- | -------------------------------------- | +| geo1 | Required. GeoJSON geometry or feature. | +| geo2 | Required. GeoJSON geometry or feature. | ### Example + Find Harper Headquarters within all locations within the database. ``` @@ -343,18 +344,22 @@ WHERE geoEqual(geo_data, '{ ``` # geoCrosses + Determines if the geometries cross over each other. Returns boolean. ## Syntax + geoCrosses(_geo1, geo2_) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------| -| geo1 | Required. GeoJSON geometry or feature. | -| geo2 | Required. GeoJSON geometry or feature. | + +| Parameter | Description | +| --------- | -------------------------------------- | +| geo1 | Required. GeoJSON geometry or feature. | +| geo2 | Required. GeoJSON geometry or feature. | ### Example + Find all locations that cross over a highway. ``` @@ -388,16 +393,19 @@ WHERE geoCrosses( Converts a series of coordinates into a GeoJSON of the specified type. ## Syntax + geoConvert(_coordinates, geo_type_[, _properties_]) ## Parameters -| Parameter | Description | -|--------------|------------------------------------------------------------------------------------------------------------------------------------| -| coordinates | Required. One or more coordinates | -| geo_type | Required. GeoJSON geometry type. Options are ‘point’, ‘lineString’, ‘multiLineString’, ‘multiPoint’, ‘multiPolygon’, and ‘polygon’ | -| properties | Optional. Escaped JSON array with properties to be added to the GeoJSON output. | + +| Parameter | Description | +| ----------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| coordinates | Required. One or more coordinates | +| geo_type | Required. GeoJSON geometry type. Options are ‘point’, ‘lineString’, ‘multiLineString’, ‘multiPoint’, ‘multiPolygon’, and ‘polygon’ | +| properties | Optional. Escaped JSON array with properties to be added to the GeoJSON output. | ### Example + Convert a given coordinate into a GeoJSON point with specified properties. ``` diff --git a/site/versioned_docs/version-4.4/getting-started.md b/site/versioned_docs/version-4.4/getting-started.md index 6f7dcace..daf46ef4 100644 --- a/site/versioned_docs/version-4.4/getting-started.md +++ b/site/versioned_docs/version-4.4/getting-started.md @@ -21,7 +21,7 @@ Here we installed Harper globally (and we recommend this) to make it easy to run You can run Harper by running: ```javascript -harperdb +harperdb; ``` You can now use Harper as a standalone database. You can also create a cloud instance (see below), which is also an easy way to get started. diff --git a/site/versioned_docs/version-4.4/technical-details/_category_.json b/site/versioned_docs/version-4.4/technical-details/_category_.json index 69ce80a6..b965ef06 100644 --- a/site/versioned_docs/version-4.4/technical-details/_category_.json +++ b/site/versioned_docs/version-4.4/technical-details/_category_.json @@ -1,12 +1,10 @@ { - "label": "Technical Details", - "position": 4, - "link": { - "type": "generated-index", - "title": "Technical Details Documentation", - "description": "Reference documentation and technical specifications", - "keywords": [ - "technical-details" - ] - } -} \ No newline at end of file + "label": "Technical Details", + "position": 4, + "link": { + "type": "generated-index", + "title": "Technical Details Documentation", + "description": "Reference documentation and technical specifications", + "keywords": ["technical-details"] + } +} diff --git a/site/versioned_docs/version-4.4/technical-details/reference/analytics.md b/site/versioned_docs/version-4.4/technical-details/reference/analytics.md index d3156053..39c92109 100644 --- a/site/versioned_docs/version-4.4/technical-details/reference/analytics.md +++ b/site/versioned_docs/version-4.4/technical-details/reference/analytics.md @@ -8,7 +8,7 @@ Harper provides extensive telemetry and analytics data to help monitor the statu Harper collects statistics for all operations, URL endpoints, and messaging topics, aggregating information by thread, operation, resource, and methods, in real-time. These statistics are logged in the `hdb_raw_analytics` and `hdb_analytics` table in the `system` database. -There are two "levels" of analytics in the Harper analytics table: the first is the immediate level of raw direct logging of real-time statistics. These analytics entries are recorded once a second (when there is activity) by each thread, and include all recorded activity in the last second, along with system resource information. The records have a primary key that is the timestamp in milliseconds since epoch. This can be queried (with `superuser` permission) using the search\_by\_conditions operation (this will search for 10 seconds worth of analytics) on the `hdb_raw_analytics` table: +There are two "levels" of analytics in the Harper analytics table: the first is the immediate level of raw direct logging of real-time statistics. These analytics entries are recorded once a second (when there is activity) by each thread, and include all recorded activity in the last second, along with system resource information. The records have a primary key that is the timestamp in milliseconds since epoch. This can be queried (with `superuser` permission) using the search_by_conditions operation (this will search for 10 seconds worth of analytics) on the `hdb_raw_analytics` table: ``` POST http:/localhost:9925 @@ -104,14 +104,14 @@ And a summary record looks like: The following are general resource usage statistics that are tracked: -* memory - This includes RSS, heap, buffer and external data usage. -* utilization - How much of the time the worker was processing requests. -* mqtt-connections - The number of MQTT connections. +- memory - This includes RSS, heap, buffer and external data usage. +- utilization - How much of the time the worker was processing requests. +- mqtt-connections - The number of MQTT connections. The following types of information is tracked for each HTTP request: -* success - How many requests returned a successful response (20x response code). TTFB - Time to first byte in the response to the client. -* transfer - Time to finish the transfer of the data to the client. -* bytes-sent - How many bytes of data were sent to the client. +- success - How many requests returned a successful response (20x response code). TTFB - Time to first byte in the response to the client. +- transfer - Time to finish the transfer of the data to the client. +- bytes-sent - How many bytes of data were sent to the client. Requests are categorized by operation name, for the operations API, by the resource (name) with the REST API, and by command for the MQTT interface. diff --git a/site/versioned_docs/version-4.4/technical-details/reference/architecture.md b/site/versioned_docs/version-4.4/technical-details/reference/architecture.md index dd451ded..4155d5ff 100644 --- a/site/versioned_docs/version-4.4/technical-details/reference/architecture.md +++ b/site/versioned_docs/version-4.4/technical-details/reference/architecture.md @@ -38,5 +38,5 @@ Harper's architecture consists of resources, which includes tables and user defi │ │ │ │ │ └────────────────┘ │ │ │ - └────────────────────────────────────────┘ + └────────────────────────────────────────┘ ``` diff --git a/site/versioned_docs/version-4.4/technical-details/reference/data-types.md b/site/versioned_docs/version-4.4/technical-details/reference/data-types.md index 9beea167..50705400 100644 --- a/site/versioned_docs/version-4.4/technical-details/reference/data-types.md +++ b/site/versioned_docs/version-4.4/technical-details/reference/data-types.md @@ -20,10 +20,10 @@ Strings, or text, are a sequence of any unicode characters and are internally en Numbers can be stored as signed integers up to a 1000 bits of precision (about 300 digits) or floating point with 64-bit floating point precision, and numbers are automatically stored using the most optimal type. With JSON, numbers are automatically parsed and stored in the most appropriate format. Custom components and applications may use BigInt numbers to store/access integers that are larger than 53-bit. The following GraphQL schema type name are supported: -* `Float` - Any number that can be represented with [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision\_floating-point\_format) ("double") -* `Int` - Any integer between from -2147483648 to 2147483647 -* `Long` - Any integer between from -9007199254740992 to 9007199254740992 -* `BigInt` - Any integer (negative or positive) with less than 300 digits +- `Float` - Any number that can be represented with [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision_floating-point_format) ("double") +- `Int` - Any integer between from -2147483648 to 2147483647 +- `Long` - Any integer between from -9007199254740992 to 9007199254740992 +- `BigInt` - Any integer (negative or positive) with less than 300 digits Note that `BigInt` is a distinct and separate type from standard numbers in JavaScript, so custom code should handle this type appropriately. diff --git a/site/versioned_docs/version-4.4/technical-details/reference/dynamic-schema.md b/site/versioned_docs/version-4.4/technical-details/reference/dynamic-schema.md index 8cce2f1a..2141ee36 100644 --- a/site/versioned_docs/version-4.4/technical-details/reference/dynamic-schema.md +++ b/site/versioned_docs/version-4.4/technical-details/reference/dynamic-schema.md @@ -16,8 +16,8 @@ Harper databases hold a collection of tables together in a single file that are Harper tables group records together with a common data pattern. To create a table users must provide a table name and a primary key. -* **Table Name**: Used to identify the table. -* **Primary Key**: This is a required attribute that serves as the unique identifier for a record and is also known as the `hash_attribute` in Harper operations API. +- **Table Name**: Used to identify the table. +- **Primary Key**: This is a required attribute that serves as the unique identifier for a record and is also known as the `hash_attribute` in Harper operations API. ## Primary Key @@ -31,8 +31,8 @@ With tables that are using dynamic schemas, additional attributes are reflexivel Harper automatically creates two audit attributes used on each record if the table is created without a schema. -* `__createdtime__`: The time the record was created in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. -* `__updatedtime__`: The time the record was updated in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. +- `__createdtime__`: The time the record was created in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. +- `__updatedtime__`: The time the record was updated in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. ### Dynamic Schema Example @@ -64,7 +64,7 @@ At this point the table does not have structure beyond what we provided, so the **dev.dog** -![](/img/v4.4/reference/dynamic\_schema\_2\_create\_table.png.webp) +![](/img/v4.4/reference/dynamic_schema_2_create_table.png.webp) **Insert Record** @@ -85,7 +85,7 @@ With a single record inserted and new attributes defined, our table now looks li **dev.dog** -![](/img/v4.4/reference/dynamic\_schema\_3\_insert\_record.png.webp) +![](/img/v4.4/reference/dynamic_schema_3_insert_record.png.webp) Indexes have been automatically created for `dog_name` and `owner_name` attributes. @@ -109,7 +109,7 @@ In this case, there is no change to the schema. Our table now looks like this: **dev.dog** -![](/img/v4.4/reference/dynamic\_schema\_4\_insert\_additional\_record.png.webp) +![](/img/v4.4/reference/dynamic_schema_4_insert_additional_record.png.webp) **Update Existing Record** @@ -130,7 +130,7 @@ Now we have a new attribute called `weight_lbs`. Our table now looks like this: **dev.dog** -![](/img/v4.4/reference/dynamic\_schema\_5\_update\_existing\_record.png.webp) +![](/img/v4.4/reference/dynamic_schema_5_update_existing_record.png.webp) **Query Table with SQL** @@ -145,4 +145,4 @@ Now if we query for all records where `weight_lbs` is `null` we expect to get ba This results in the expected two records being returned. -![](/img/v4.4/reference/dynamic\_schema\_6\_query\_table\_with\_sql.png.webp) +![](/img/v4.4/reference/dynamic_schema_6_query_table_with_sql.png.webp) diff --git a/site/versioned_docs/version-4.4/technical-details/reference/globals.md b/site/versioned_docs/version-4.4/technical-details/reference/globals.md index 4bed5c56..48483d22 100644 --- a/site/versioned_docs/version-4.4/technical-details/reference/globals.md +++ b/site/versioned_docs/version-4.4/technical-details/reference/globals.md @@ -38,7 +38,7 @@ async function getRecord() { } ``` -It is recommended that you [define a database](../../getting-started) for all the tables that are required to exist in your application. This will ensure that the tables exist on the `tables` object. Also note that the property names follow a CamelCase convention for use in JavaScript and in the GraphQL Schemas, but these are translated to snake\_case for the actual table names, and converted back to CamelCase when added to the `tables` object. +It is recommended that you [define a database](../../getting-started) for all the tables that are required to exist in your application. This will ensure that the tables exist on the `tables` object. Also note that the property names follow a CamelCase convention for use in JavaScript and in the GraphQL Schemas, but these are translated to snake_case for the actual table names, and converted back to CamelCase when added to the `tables` object. ## `databases` @@ -76,13 +76,14 @@ Returns an array of server instances based on the specified `options.port` and ` Example: ```js -server.http((request, next) => { - return request.url === '/graphql' - ? handleGraphQLRequest(request) - : next(request); -}, { - runFirst: true, // run this handler first -}); +server.http( + (request, next) => { + return request.url === '/graphql' ? handleGraphQLRequest(request) : next(request); + }, + { + runFirst: true, // run this handler first + } +); ``` #### `RequestListener` @@ -96,6 +97,7 @@ The HTTP request listener to be added to the middleware chain. To continue chain The `Request` and `Response` classes are based on the WHATWG APIs for the [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) and [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) classes. Requests and responses are based on these standard-based APIs to facilitate reuse with modern web code. While Node.js' HTTP APIs are powerful low-level APIs, the `Request`/`Response` APIs provide excellent composability characteristics, well suited for layered middleware and for clean mapping to [RESTful method handlers](./resource) with promise-based responses, as well as interoperability with other standards-based APIs like [streams](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) used with [`Blob`s](https://developer.mozilla.org/en-US/docs/Web/API/Blob). However, the Harper implementation of these classes is not a direct implementation of the WHATWG APIs, but implements additional/distinct properties for the the Harper server environment: #### `Request` + A `Request` object is passed to the direct static REST handlers, and preserved as the context for instance methods, and has the following properties: - `url` - This is the request target, which is the portion of the URL that was received by the server. If a client sends a request to `https://example.com:8080/path?query=string`, the actual received request is `GET /path?query=string` and the `url` property will be `/path?query=string`. @@ -103,7 +105,7 @@ A `Request` object is passed to the direct static REST handlers, and preserved a - `headers` - This is a [`Headers`](https://developer.mozilla.org/en-US/docs/Web/API/Headers) object that contains the headers of the request. - `pathname` - This is the path portion of the URL, without the query string. For example, if the URL is `/path?query=string`, the `pathname` will be `/path`. - `protocol` - This is the protocol of the request, like `http` or `https`. -- `data` - This is the deserialized body of the request (based on the type of data specified by `Content-Type` header). +- `data` - This is the deserialized body of the request (based on the type of data specified by `Content-Type` header). - `ip` - This is the remote IP address of the client that made the request (or the remote IP address of the last proxy to connect to Harper). - `host` - This is the host of the request, like `example.com`. - `sendEarlyHints(link: string, headers?: object): void` - This method sends an early hints response to the client, prior to actually returning a response. This is useful for sending a link header to the client to indicate that another resource should be preloaded. The `headers` argument can be used to send additional headers with the early hints response, in addition to the `link`. @@ -162,15 +164,15 @@ Example: ```js server.ws((ws, request, chainCompletion) => { - chainCompletion.then(() => { - ws.on('error', console.error); + chainCompletion.then(() => { + ws.on('error', console.error); - ws.on('message', function message(data) { - console.log('received: %s', data); - }); + ws.on('message', function message(data) { + console.log('received: %s', data); + }); - ws.send('something'); - }); + ws.send('something'); + }); }); ``` @@ -192,10 +194,10 @@ Type: `Object` Properties: -* `maxPayload` - _optional_ - `number` - Set the max payload size for the WebSocket server. Defaults to 100 MB. -* `runFirst` - _optional_ - `boolean` - Add listener to the front of the middleware chain. Defaults to `false` -* `port` - _optional_ - `number` - Specify which WebSocket server middleware chain to add the listener to. Defaults to the Harper system default HTTP port configured by `harperdb-config.yaml`, generally `9926` -* `securePort` - _optional_ - `number` - Specify which WebSocket secure server middleware chain to add the listener to. Defaults to the Harper system default HTTP secure port configured by `harperdb-config.yaml`, generally `9927` +- `maxPayload` - _optional_ - `number` - Set the max payload size for the WebSocket server. Defaults to 100 MB. +- `runFirst` - _optional_ - `boolean` - Add listener to the front of the middleware chain. Defaults to `false` +- `port` - _optional_ - `number` - Specify which WebSocket server middleware chain to add the listener to. Defaults to the Harper system default HTTP port configured by `harperdb-config.yaml`, generally `9926` +- `securePort` - _optional_ - `number` - Specify which WebSocket secure server middleware chain to add the listener to. Defaults to the Harper system default HTTP secure port configured by `harperdb-config.yaml`, generally `9927` ### `server.upgrade(listener: UpgradeListener, options: UpgradeOptions): void` @@ -236,9 +238,9 @@ Type: `Object` Properties: -* `runFirst` - _optional_ - `boolean` - Add listener to the front of the middleware chain. Defaults to `false` -* `port` - _optional_ - `number` - Specify which HTTP server middleware chain to add the listener to. Defaults to the Harper system default HTTP port configured by `harperdb-config.yaml`, generally `9926` -* `securePort` - _optional_ - `number` - Specify which HTTP secure server middleware chain to add the listener to. Defaults to the Harper system default HTTP secure port configured by `harperdb-config.yaml`, generally `9927` +- `runFirst` - _optional_ - `boolean` - Add listener to the front of the middleware chain. Defaults to `false` +- `port` - _optional_ - `number` - Specify which HTTP server middleware chain to add the listener to. Defaults to the Harper system default HTTP port configured by `harperdb-config.yaml`, generally `9926` +- `securePort` - _optional_ - `number` - Specify which HTTP secure server middleware chain to add the listener to. Defaults to the Harper system default HTTP secure port configured by `harperdb-config.yaml`, generally `9927` ### `server.config` @@ -248,8 +250,8 @@ This provides access to the Harper configuration object. This comes from the [ha This records the provided value as a metric into Harper's analytics. Harper efficiently records and tracks these metrics and makes them available through [analytics API](./analytics). The values are aggregated and statistical information is computed when many operations are performed. The optional parameters can be used to group statistics. For the parameters, make sure you are not grouping on too fine of a level for useful aggregation. The parameters are: -* `value` - This is a numeric value for the metric that is being recorded. This can be a value measuring time or bytes, for example. -* `metric` - This is the name of the metric. -* `path` - This is an optional path (like a URL path). For a URL like /my-resource/, you would typically include a path of "my-resource", not including the id so you can group by all the requests to "my-resource" instead of individually aggregating by each individual id. -* `method` - Optional method to group by. -* `type` - Optional type to group by. +- `value` - This is a numeric value for the metric that is being recorded. This can be a value measuring time or bytes, for example. +- `metric` - This is the name of the metric. +- `path` - This is an optional path (like a URL path). For a URL like /my-resource/, you would typically include a path of "my-resource", not including the id so you can group by all the requests to "my-resource" instead of individually aggregating by each individual id. +- `method` - Optional method to group by. +- `type` - Optional type to group by. diff --git a/site/versioned_docs/version-4.4/technical-details/reference/graphql.md b/site/versioned_docs/version-4.4/technical-details/reference/graphql.md index d56958a3..d2c282fa 100644 --- a/site/versioned_docs/version-4.4/technical-details/reference/graphql.md +++ b/site/versioned_docs/version-4.4/technical-details/reference/graphql.md @@ -15,6 +15,7 @@ This automatically enables a `/graphql` endpoint that can be used for GraphQL qu Queries can either be `GET` or `POST` requests, and both follow essentially the same request format. `GET` requests must use search parameters, and `POST` requests use the request body. For example, to request the GraphQL Query: + ```graphql query GetDogs { Dog { @@ -91,6 +92,7 @@ The Harper GraphQL Querying system takes many liberties from the GraphQL specifi In variable definitions, the querying system will ensure non-null values exist (and error appropriately), but it will not do any type checking of the value itself. For example, the variable `$name: String!` states that `name` should be a non-null, string value. + - If the request does not contain the `name` variable, an error will be returned - If the request provides `null` for the `name` variable, an error will be returned - If the request provides any non-string value for the `name` variable, i.e. `1`, `true`, `{ foo: "bar" }`, the behavior is undefined and an error may or may not be returned. @@ -100,6 +102,7 @@ For example, the variable `$name: String!` states that `name` should be a non-nu - Fragments will generally extend non-specified types, and the querying system will do no validity checking on them. For example, `fragment Fields on Any { ... }` is just as valid as `fragment Fields on MadeUpTypeName { ... }`. See the Fragments sections for more details. The only notable place the querying system will do some level of type analysis is the transformation of arguments into a query. + - Objects will be transformed into properly nested attributes - Strings and Boolean values are passed through as their AST values - Float and Int values will be parsed using the JavaScript `parseFloat` and `parseInt` methods respectively. @@ -174,6 +177,7 @@ query GetDog($id: ID!) { ``` And as a properly formed request: + ```http POST /graphql/ Content-Type: application/json @@ -188,6 +192,7 @@ Accept: application/graphql-response+json ``` The REST equivalent would be: + ```http GET /Dog/?id==0&select(name,breed,owner{name}) # or @@ -211,6 +216,7 @@ query GetDog { ``` Would be equivalent to + ```http GET /Dog/?owner.name==John&select(name,breed,owner{name}) ``` @@ -220,7 +226,7 @@ And finally, we can put all of these together to create semi-complex, equality b The following query has two variables and will return all dogs who have the specified name as well as the specified owner name. ```graphql -query GetDog($dogName: String!, $ownerName: String! ) { +query GetDog($dogName: String!, $ownerName: String!) { Dog(name: $dogName, owner: { name: $ownerName }) { name breed @@ -245,4 +251,4 @@ query GetDog($dogName: String!, $ownerName: String! ) { ### Directives -> Coming soon! \ No newline at end of file +> Coming soon! diff --git a/site/versioned_docs/version-4.4/technical-details/reference/headers.md b/site/versioned_docs/version-4.4/technical-details/reference/headers.md index 0301b152..5c85fc88 100644 --- a/site/versioned_docs/version-4.4/technical-details/reference/headers.md +++ b/site/versioned_docs/version-4.4/technical-details/reference/headers.md @@ -6,7 +6,7 @@ title: Harper Headers All Harper API responses include headers that are important for interoperability and debugging purposes. The following headers are returned with all Harper API responses: -| Key | Example Value | Description | -|-------------------|------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| -| server-timing | db;dur=7.165 | This reports the duration of the operation, in milliseconds. This follows the standard for Server-Timing and can be consumed by network monitoring tools. | -| content-type | application/json | This reports the MIME type of the returned content, which is negotiated based on the requested content type in the Accept header. | +| Key | Example Value | Description | +| ------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| server-timing | db;dur=7.165 | This reports the duration of the operation, in milliseconds. This follows the standard for Server-Timing and can be consumed by network monitoring tools. | +| content-type | application/json | This reports the MIME type of the returned content, which is negotiated based on the requested content type in the Accept header. | diff --git a/site/versioned_docs/version-4.4/technical-details/reference/index.md b/site/versioned_docs/version-4.4/technical-details/reference/index.md index 8b2629e5..4bdb8ca9 100644 --- a/site/versioned_docs/version-4.4/technical-details/reference/index.md +++ b/site/versioned_docs/version-4.4/technical-details/reference/index.md @@ -6,11 +6,11 @@ title: Reference This section contains technical details and reference materials for Harper. -* [Resource API](./resource) -* [Transactions](./transactions) -* [Storage Algorithm](./storage-algorithm) -* [Dynamic Schema](./dynamic-schema) -* [Headers](./headers) -* [Limitations](./limits) -* Content Types -* [Data Types](./data-types) +- [Resource API](./resource) +- [Transactions](./transactions) +- [Storage Algorithm](./storage-algorithm) +- [Dynamic Schema](./dynamic-schema) +- [Headers](./headers) +- [Limitations](./limits) +- Content Types +- [Data Types](./data-types) diff --git a/site/versioned_docs/version-4.4/technical-details/reference/limits.md b/site/versioned_docs/version-4.4/technical-details/reference/limits.md index 9e343887..97214620 100644 --- a/site/versioned_docs/version-4.4/technical-details/reference/limits.md +++ b/site/versioned_docs/version-4.4/technical-details/reference/limits.md @@ -33,4 +33,5 @@ Additionally, they cannot contain the first 31 non-printing characters. Spaces a Harper limits the number of total indexed attributes across tables (including the primary key of each table) to 10,000 per database. ## Primary Keys -The maximum length of a primary key is 1978 bytes or 659 characters (whichever is shortest). \ No newline at end of file + +The maximum length of a primary key is 1978 bytes or 659 characters (whichever is shortest). diff --git a/site/versioned_docs/version-4.4/technical-details/reference/resource.md b/site/versioned_docs/version-4.4/technical-details/reference/resource.md index 6d51f361..93af431a 100644 --- a/site/versioned_docs/version-4.4/technical-details/reference/resource.md +++ b/site/versioned_docs/version-4.4/technical-details/reference/resource.md @@ -12,20 +12,20 @@ Conceptually, a Resource class provides an interface for accessing, querying, mo Resource classes also have static methods, which are generally the preferred way to externally interact with tables and resources. The static methods handle parsing paths and query strings, starting a transaction as necessary, performing access authorization checks (if required), creating a resource instance, and calling the instance methods. This general rule for how to interact with resources: -* If you want to _act upon_ a table or resource, querying or writing to it, then use the static methods to initial access or write data. For example, you could use `MyTable.get(34)` to access the record with a primary key of `34`. - * You can subsequently use the instance methods on the returned resource instance to perform additional actions on the record. -* If you want to _define custom behavior_ for a table or resource (to control how a resource responds to queries/writes), then extend the class and override/define instance methods. +- If you want to _act upon_ a table or resource, querying or writing to it, then use the static methods to initial access or write data. For example, you could use `MyTable.get(34)` to access the record with a primary key of `34`. + - You can subsequently use the instance methods on the returned resource instance to perform additional actions on the record. +- If you want to _define custom behavior_ for a table or resource (to control how a resource responds to queries/writes), then extend the class and override/define instance methods. The Resource API is heavily influenced by the REST/HTTP API, and the methods and properties of the Resource class are designed to map to and be used in a similar way to how you would interact with a RESTful API. The REST-based API is a little different than traditional Create-Read-Update-Delete (CRUD) APIs that were designed with single-server interactions in mind, but semantics that attempt to guarantee no existing record or overwrite-only behavior require locks that don't scale well in distributed database. Centralizing writes around `put` calls provides much more scalable, simple, and consistent behavior in a distributed eventually consistent database. You can generally think of CRUD operations mapping to REST operations like this: -* Read - `get` -* Create with a known primary key - `put` -* Create with a generated primary key - `post`/`create` -* Update (Full) - `put` -* Update (Partial) - `patch` -* Delete - `delete` +- Read - `get` +- Create with a known primary key - `put` +- Create with a generated primary key - `post`/`create` +- Update (Full) - `put` +- Update (Partial) - `patch` +- Delete - `delete` The RESTful HTTP server and other server interfaces will directly call resource methods of the same name to fulfill incoming requests so resources can be defined as endpoints for external interaction. When resources are used by the server interfaces, the static method will be executed (which starts a transaction and does access checks), which will then create the resource instance and call the corresponding instance method. Paths (URL, MQTT topics) are mapped to different resource instances. Using a path that specifies an ID like `/MyResource/3492` will be mapped to a Resource instance where the instance's ID will be `3492`, and interactions will use the instance methods like `get()`, `put()`, and `post()`. Using the root path (`/MyResource/`) will map to a Resource instance with an ID of `null`, and this represents the collection of all the records in the resource or table. @@ -33,16 +33,16 @@ You can create classes that extend `Resource` to define your own data sources, t ```javascript export class MyExternalData extends Resource { - async get() { - // fetch data from an external source, using our id - let response = await this.fetch(this.id); - // do something with the response - } - put(data) { + async get() { + // fetch data from an external source, using our id + let response = await this.fetch(this.id); + // do something with the response + } + put(data) { // send the data into the external source } delete() { - // delete an entity in the external data source + // delete an entity in the external data source } subscribe(options) { // if the external data source is capable of real-time notification of changes, can subscribe @@ -68,7 +68,7 @@ export class MyTable extends tables.MyTable { super.put(data); } delete() { - super.delete(); + super.delete(); } post(data) { // providing a post handler (for HTTP POST requests) is a common way to create additional @@ -152,7 +152,7 @@ It is important to note that `this` is the resource instance for a specific reco - Arguments - `query`: The [Query](#query) object to use for the search - Return value - * An [AsyncIterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncIterator) of records that match the query + - An [AsyncIterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncIterator) of records that match the query This performs a query on this resource, searching for records that are descendants. By default, this is called by `get(query)` from a collection resource. When this is called for the root resource (like `/Table/`) it searches through all records in the table. However, if you call search from an instance with a specific ID like `1` from a path like `Table/1`, it will only return records that are descendants of that record, like `[1, 1]` (path of Table/1/1) and `[1, 2]` (path of Table/1/2). If you want to do a standard search of the table, make you call the static method like `Table.search(...)`. You can define or override this method to define how records should be queried. The default `search` method on tables (`super.search(query)`) will perform a query and return an AsyncIterable of results. The query object can be used to specify the desired query. @@ -209,10 +209,10 @@ The returned (promise resolves to) Subscription object is an `AsyncIterable` tha The `SubscriptionRequest` object supports the following properties (all optional): -* `includeDescendants` - If this is enabled, this will create a subscription to all the record updates/messages that are prefixed with the id. For example, a subscription request of `{id:'sub', includeDescendants: true}` would return events for any update with an id/topic of the form sub/\* (like `sub/1`). -* `startTime` - This will begin the subscription at a past point in time, returning all updates/messages since the start time (a catch-up of historical messages). This can be used to resume a subscription, getting all messages since the last subscription. -* `previousCount` - This specifies the number of previous updates/messages to deliver. For example, `previousCount: 10` would return the last ten messages. Note that `previousCount` can not be used in conjunction with `startTime`. -* `omitCurrent` - Indicates that the current (or retained) record should _not_ be immediately sent as the first update in the subscription (if no `startTime` or `previousCount` was used). By default, the current record is sent as the first update. +- `includeDescendants` - If this is enabled, this will create a subscription to all the record updates/messages that are prefixed with the id. For example, a subscription request of `{id:'sub', includeDescendants: true}` would return events for any update with an id/topic of the form sub/\* (like `sub/1`). +- `startTime` - This will begin the subscription at a past point in time, returning all updates/messages since the start time (a catch-up of historical messages). This can be used to resume a subscription, getting all messages since the last subscription. +- `previousCount` - This specifies the number of previous updates/messages to deliver. For example, `previousCount: 10` would return the last ten messages. Note that `previousCount` can not be used in conjunction with `startTime`. +- `omitCurrent` - Indicates that the current (or retained) record should _not_ be immediately sent as the first update in the subscription (if no `startTime` or `previousCount` was used). By default, the current record is sent as the first update. ### `connect(incomingMessages?: AsyncIterable, query?: Query): AsyncIterable` @@ -258,25 +258,25 @@ Returns the context for this resource. The context contains information about th The `Context` object has the following (potential) properties: -* `user` - This is the user object, which includes information about the username, role, and authorizations. -* `transaction` - The current transaction If the current method was triggered by an HTTP request, the following properties are available: -* `lastModified` - This value is used to indicate the last modified or updated timestamp of any resource(s) that are accessed and will inform the response's `ETag` (or `Last-Modified`) header. This can be updated by application code if it knows that modification should cause this timestamp to be updated. +- `user` - This is the user object, which includes information about the username, role, and authorizations. +- `transaction` - The current transaction If the current method was triggered by an HTTP request, the following properties are available: +- `lastModified` - This value is used to indicate the last modified or updated timestamp of any resource(s) that are accessed and will inform the response's `ETag` (or `Last-Modified`) header. This can be updated by application code if it knows that modification should cause this timestamp to be updated. When a resource gets a request through HTTP, the request object is the context, which has the following properties: -* `url` - The local path/URL of the request (this will not include the protocol or host name, but will start at the path and includes the query string). -* `method` - The method of the HTTP request. -* `headers` - This is an object with the headers that were included in the HTTP request. You can access headers by calling `context.headers.get(headerName)`. -* `responseHeaders` - This is an object with the headers that will be included in the HTTP response. You can set headers by calling `context.responseHeaders.set(headerName, value)`. -* `pathname` - This provides the path part of the URL (no querystring). -* `host` - This provides the host name of the request (from the `Host` header). -* `ip` - This provides the ip address of the client that made the request. -* `body` - This is the request body as a raw NodeJS Readable stream, if there is a request body. -* `data` - If the HTTP request had a request body, this provides a promise to the deserialized data from the request body. (Note that for methods that normally have a request body like `POST` and `PUT`, the resolved deserialized data is passed in as the main argument, but accessing the data from the context provides access to this for requests that do not traditionally have a request body like `DELETE`). +- `url` - The local path/URL of the request (this will not include the protocol or host name, but will start at the path and includes the query string). +- `method` - The method of the HTTP request. +- `headers` - This is an object with the headers that were included in the HTTP request. You can access headers by calling `context.headers.get(headerName)`. +- `responseHeaders` - This is an object with the headers that will be included in the HTTP response. You can set headers by calling `context.responseHeaders.set(headerName, value)`. +- `pathname` - This provides the path part of the URL (no querystring). +- `host` - This provides the host name of the request (from the `Host` header). +- `ip` - This provides the ip address of the client that made the request. +- `body` - This is the request body as a raw NodeJS Readable stream, if there is a request body. +- `data` - If the HTTP request had a request body, this provides a promise to the deserialized data from the request body. (Note that for methods that normally have a request body like `POST` and `PUT`, the resolved deserialized data is passed in as the main argument, but accessing the data from the context provides access to this for requests that do not traditionally have a request body like `DELETE`). When a resource is accessed as a data source: -* `requestContext` - For resources that are acting as a data source for another resource, this provides access to the context of the resource that is making a request for data from the data source resource. Note that it is generally not recommended to rely on this context. The resolved data may be used fulfilled many different requests, and relying on this first request context may not be representative of future requests. Also, source resolution may be triggered by various actions, not just specified endpoints (for example queries, operations, studio, etc.), so make sure you are not relying on specific request context information. +- `requestContext` - For resources that are acting as a data source for another resource, this provides access to the context of the resource that is making a request for data from the data source resource. Note that it is generally not recommended to rely on this context. The resolved data may be used fulfilled many different requests, and relying on this first request context may not be representative of future requests. Also, source resolution may be triggered by various actions, not just specified endpoints (for example queries, operations, studio, etc.), so make sure you are not relying on specific request context information. ### `operation(operationObject: Object, authorize?: boolean): Promise` @@ -297,7 +297,7 @@ The `get`, `put`, `delete`, `publish`, `subscribe`, and `connect` methods all ha This will retrieve a resource instance by id. For example, if you want to retrieve comments by id in the retrieval of a blog post you could do: ```javascript -const { MyTable, Comment } = tables; +const { MyTable, Comment } = tables; ... // in class: async get() { @@ -311,7 +311,7 @@ const { MyTable, Comment } = tables; Type definition for `Id`: ```typescript -Id = string|number|array +Id = string | number | array; ``` ### `get(query: Query, context?: Resource|Context)` @@ -372,7 +372,7 @@ This will define the function to use for a computed attribute. To use this, the ```javascript MyTable.setComputedAttribute('computedAttribute', (record) => { - return record.attribute1 + record.attribute2; + return record.attribute1 + record.attribute2; }); ``` @@ -380,10 +380,10 @@ For a schema like: ```graphql type MyTable @table { - id: ID @primaryKey - attribute1: Int - attribute2: Int - computedAttribute: Int @computed + id: ID @primaryKey + attribute1: Int + attribute2: Int + computedAttribute: Int @computed } ``` @@ -404,9 +404,9 @@ There are additional methods that are only available on table classes (which are This defines the source for a table. This allows a table to function as a cache for an external resource. When a table is configured to have a source, any request for a record that is not found in the table will be delegated to the source resource to retrieve (via `get`) and the result will be cached/stored in the table. All writes to the table will also first be delegated to the source (if the source defines write functions like `put`, `delete`, etc.). The `options` parameter can include an `expiration` property that will configure the table with a time-to-live expiration window for automatic deletion or invalidation of older entries. The `options` parameter (also) supports: -* `expiration` - Default expiration time for records in seconds. -* `eviction` - Eviction time for records in seconds. -* `scanInterval` - Time period for scanning the table for records to evict. +- `expiration` - Default expiration time for records in seconds. +- `eviction` - Eviction time for records in seconds. +- `scanInterval` - Time period for scanning the table for records to evict. If the source resource implements subscription support, real-time invalidation can be performed to ensure the cache is guaranteed to be fresh (and this can eliminate or reduce the need for time-based expiration of data). @@ -440,10 +440,10 @@ const { Comment } = tables; export class BlogPost extends tables.BlogPost { post(comment) { // add a comment record to the comment table, using this resource as the source for the context - Comment.put(comment, this); + Comment.put(comment, this); this.comments.push(comment.id); // add the id for the record to our array of comment ids // Both of these actions will be committed atomically as part of the same transaction - } + } } ``` @@ -457,22 +457,27 @@ The `get`/`search` methods accept a Query object that can be used to specify a q This is an array of objects that specify the conditions to use the match records (if conditions are omitted or it is an empty array, this is a search for everything in the table). Each condition object can have the following properties: -* `attribute`: Name of the property/attribute to match on. -* `value`: The value to match. -* `comparator`: This can specify how the value is compared. This defaults to "equals", but can also be "greater\_than", "greater\_than\_equal", "less\_than", "less\_than\_equal", "starts\_with", "contains", "ends\_with", "between", and "not\_equal". -* `conditions`: An array of conditions, which follows the same structure as above. -* `operator`: Specifies the operator to apply to this set of conditions (`and` or `or`. This is optional and defaults to `and`). For example, a complex query might look like: +- `attribute`: Name of the property/attribute to match on. +- `value`: The value to match. +- `comparator`: This can specify how the value is compared. This defaults to "equals", but can also be "greater_than", "greater_than_equal", "less_than", "less_than_equal", "starts_with", "contains", "ends_with", "between", and "not_equal". +- `conditions`: An array of conditions, which follows the same structure as above. +- `operator`: Specifies the operator to apply to this set of conditions (`and` or `or`. This is optional and defaults to `and`). For example, a complex query might look like: For example, a more complex query might look like: ```javascript -Table.search({ conditions: [ - { attribute: 'price', comparator: 'less_than', value: 100 }, - { operator: 'or', conditions: [ - { attribute: 'rating', comparator: 'greater_than', value: 4 }, - { attribute: 'featured', value: true } - ]} -]}); +Table.search({ + conditions: [ + { attribute: 'price', comparator: 'less_than', value: 100 }, + { + operator: 'or', + conditions: [ + { attribute: 'rating', comparator: 'greater_than', value: 4 }, + { attribute: 'featured', value: true }, + ], + }, + ], +}); ``` **Chained Attributes/Properties** @@ -480,9 +485,7 @@ Table.search({ conditions: [ Chained attribute/property references can be used to search on properties within related records that are referenced by [relationship properties](../../developers/applications/defining-schemas) (in addition to the [schema documentation](../../developers/applications/defining-schemas), see the [REST documentation](../../developers/rest) for more of overview of relationships and querying). Chained property references are specified with an array, with each entry in the array being a property name for successive property references. For example, if a relationship property called `brand` has been defined that references a `Brand` table, we could search products by brand name: ```javascript -Product.search({ conditions: [ - { attribute: ['brand', 'name'], value: 'Harper' } -]}); +Product.search({ conditions: [{ attribute: ['brand', 'name'], value: 'Harper' }] }); ``` This effectively executes a join, searching on the `Brand` table and joining results with matching records in the `Product` table. Chained array properties can be used in any condition, as well nested/grouped conditions. The chain of properties may also be more than two entries, allowing for multiple relationships to be traversed, effectively joining across multiple tables. An array of chained properties can also be used as the `attribute` in the `sort` property, allowing for sorting by an attribute in a referenced joined tables. @@ -515,8 +518,8 @@ Table.search({ select: [ 'name', { name: 'related', select: ['description', 'id' The select properties can also include certain special properties: -* `$id` - This will specifically return the primary key of the record (regardless of name, even if there is no defined primary key attribute for the table). -* `$updatedtime` - This will return the last updated timestamp/version of the record (regardless of whether there is an attribute for the updated time). +- `$id` - This will specifically return the primary key of the record (regardless of name, even if there is no defined primary key attribute for the table). +- `$updatedtime` - This will return the last updated timestamp/version of the record (regardless of whether there is an attribute for the updated time). Alternately, the select value can be a string value, to specify that the value of the specified property should be returned for each iteration/element in the results. For example to just return an iterator of the `id`s of object: @@ -528,9 +531,9 @@ Table.search({ select: 'id', conditions: ...}) This defines the sort order, and should be an object that can have the following properties: -* `attributes`: The attribute to sort on. -* `descending`: If true, will sort in descending order (optional and defaults to `false`). -* `next`: Specifies the next sort order to resolve ties. This is an object that follows the same structure as `sort`. +- `attributes`: The attribute to sort on. +- `descending`: If true, will sort in descending order (optional and defaults to `false`). +- `next`: Specifies the next sort order to resolve ties. This is an object that follows the same structure as `sort`. #### `explain` @@ -554,8 +557,8 @@ let results = Product.search({ offset: 20, limit: 10, select: ['id', 'name', 'price', 'rating'], - sort: { attribute: 'price' } -}) + sort: { attribute: 'price' }, +}); for await (let record of results) { // iterate through each record in the query results } @@ -583,7 +586,7 @@ export class CustomProduct extends Product { get(query) { let name = this.name; // this is the name of the current product let rating = this.rating; // this is the rating of the current product - this.rating = 3 // we can also modify the rating for the current instance + this.rating = 3; // we can also modify the rating for the current instance // (with a get this won't be saved by default, but will be used when serialized) return super.get(query); } @@ -596,8 +599,7 @@ Likewise, we can interact with resource instances in the same way when retrievin let product1 = await Product.get(1); let name = product1.name; // this is the name of the product with a primary key of 1 let rating = product1.rating; // this is the rating of the product with a primary key of 1 -product1.rating = 3 // modify the rating for this instance (this will be saved without a call to update()) - +product1.rating = 3; // modify the rating for this instance (this will be saved without a call to update()) ``` If there are additional properties on (some) products that aren't defined in the schema, we can still access them through the resource instance, but since they aren't declared, there won't be getter/setter definition for direct property access, but we can access properties with the `get(propertyName)` method and modify properties with the `set(propertyName, value)` method: @@ -605,7 +607,7 @@ If there are additional properties on (some) products that aren't defined in the ```javascript let product1 = await Product.get(1); let additionalInformation = product1.get('additionalInformation'); // get the additionalInformation property value even though it isn't defined in the schema -product1.set('newProperty', 'some value'); // we can assign any properties we want with set +product1.set('newProperty', 'some value'); // we can assign any properties we want with set ``` And likewise, we can do this in an instance method, although you will probably want to use super.get()/set() so you don't have to write extra logic to avoid recursion: @@ -614,7 +616,7 @@ And likewise, we can do this in an instance method, although you will probably w export class CustomProduct extends Product { get(query) { let additionalInformation = super.get('additionalInformation'); // get the additionalInformation property value even though it isn't defined in the schema - super.set('newProperty', 'some value'); // we can assign any properties we want with set + super.set('newProperty', 'some value'); // we can assign any properties we want with set } } ``` diff --git a/site/versioned_docs/version-4.4/technical-details/reference/transactions.md b/site/versioned_docs/version-4.4/technical-details/reference/transactions.md index e0851655..7e8546fb 100644 --- a/site/versioned_docs/version-4.4/technical-details/reference/transactions.md +++ b/site/versioned_docs/version-4.4/technical-details/reference/transactions.md @@ -18,7 +18,7 @@ This executes the callback in a transaction, providing a context that can be use ```javascript import { tables } from 'harperdb'; -const { MyTable } = tables; +const { MyTable } = tables; if (isMainThread) // only on main thread setInterval(async () => { let someData = await (await fetch(... some URL ...)).json(); @@ -34,7 +34,7 @@ You can provide your own context object for the transaction to attach to. If you Once the transaction callback is completed (for non-nested transaction calls), the transaction will commit, and if the callback throws an error, the transaction will abort. However, the callback is called with the `transaction` object, which also provides the following methods and property: -* `commit(): Promise` - Commits the current transaction. The transaction will be committed once the returned promise resolves. -* `abort(): void` - Aborts the current transaction and resets it. -* `resetReadSnapshot(): void` - Resets the read snapshot for the transaction, resetting to the latest data in the database. -* `timestamp: number` - This is the timestamp associated with the current transaction. +- `commit(): Promise` - Commits the current transaction. The transaction will be committed once the returned promise resolves. +- `abort(): void` - Aborts the current transaction and resets it. +- `resetReadSnapshot(): void` - Resets the read snapshot for the transaction, resetting to the latest data in the database. +- `timestamp: number` - This is the timestamp associated with the current transaction. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/index.md b/site/versioned_docs/version-4.4/technical-details/release-notes/index.md index 4159c5ab..955471f3 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/index.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/index.md @@ -202,7 +202,7 @@ title: Release Notes [3.0.0 Monkey](./v3-monkey/3.0.0) -*** +--- [Meet Penny](./v2-penny/) Our 2nd Release Pup @@ -218,7 +218,7 @@ title: Release Notes [2.1.1 Penny](./v2-penny/2.1.1) -*** +--- [Meet Alby](./v1-alby/) Our 1st Release Pup diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.1.0.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.1.0.md index b42514a2..2256a825 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.1.0.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.1.0.md @@ -4,74 +4,69 @@ sidebar_position: 89899 --- ### HarperDB 1.1.0, Alby Release + 4/18/2018 **Features** -* Users & Roles: +- Users & Roles: + - Limit/Assign access to all HarperDB operations + + - Limit/Assign access to schemas, tables & attributes + + - Limit/Assign access to specific SQL operations (`INSERT`, `UPDATE`, `DELETE`, `SELECT`) - * Limit/Assign access to all HarperDB operations +- Enhanced SQL parser + - Added extensive ANSI SQL Support. + - Added Array function, which allows for converting relational data into Object/Hierarchical data + - `Distinct_Array` Function: allows for removing duplicates in the Array function. + - Enhanced SQL Validation: Improved validation around structure of SQL, validating the schema, etc.. + - 10x performance improvement on SQL statements. - * Limit/Assign access to schemas, tables & attributes +- Export Function: can now call a NoSQL/SQL search and have it export to CSV or JSON. - * Limit/Assign access to specific SQL operations (`INSERT`, `UPDATE`, `DELETE`, `SELECT`) - -* Enhanced SQL parser - - * Added extensive ANSI SQL Support. - - * Added Array function, which allows for converting relational data into Object/Hierarchical data - - * `Distinct_Array` Function: allows for removing duplicates in the Array function. - - * Enhanced SQL Validation: Improved validation around structure of SQL, validating the schema, etc.. - - * 10x performance improvement on SQL statements. - -* Export Function: can now call a NoSQL/SQL search and have it export to CSV or JSON. +- Added upgrade function to CLI -* Added upgrade function to CLI +- Added ability to perform bulk update from CSV -* Added ability to perform bulk update from CSV +- Created landing page for HarperDB. -* Created landing page for HarperDB. +- Added CORS support to HarperDB -* Added CORS support to HarperDB - **Fixes** -* Fixed memory leak in CSV bulk loads +- Fixed memory leak in CSV bulk loads -* Corrected error when attempting to perform a `SQL DELETE` +- Corrected error when attempting to perform a `SQL DELETE` -* Added further validation to NoSQL `UPDATE` to validate schema & table exist +- Added further validation to NoSQL `UPDATE` to validate schema & table exist -* Fixed install issue occurring when part of the install path does not exist, the install would silently fail. +- Fixed install issue occurring when part of the install path does not exist, the install would silently fail. -* Fixed issues with replicated data when one of the replicas is down +- Fixed issues with replicated data when one of the replicas is down -* Removed logging of initial user’s credentials during install +- Removed logging of initial user’s credentials during install -* Can now use reserved words as aliases in SQL +- Can now use reserved words as aliases in SQL -* Removed user(s) password in results when calling `list_users` +- Removed user(s) password in results when calling `list_users` -* Corrected forwarding of operations to other nodes in a cluster +- Corrected forwarding of operations to other nodes in a cluster -* Corrected lag in schema meta-data passing to other nodes in a cluster +- Corrected lag in schema meta-data passing to other nodes in a cluster -* Drop table & schema now move the table & schema or table to the trash folder under the Database folder for later permanent deletion. +- Drop table & schema now move the table & schema or table to the trash folder under the Database folder for later permanent deletion. -* Bulk inserts no longer halt the entire operation if n records already exist, instead the return includes the hashes of records that have been skipped. +- Bulk inserts no longer halt the entire operation if n records already exist, instead the return includes the hashes of records that have been skipped. -* Added ability to accept EULA from command line +- Added ability to accept EULA from command line -* Corrected `search_by_value` not searching on the correct attribute +- Corrected `search_by_value` not searching on the correct attribute -* Added ability to increase the timeout of a request by adding `SERVER_TIMEOUT_MS` to config/settings.js +- Added ability to increase the timeout of a request by adding `SERVER_TIMEOUT_MS` to config/settings.js -* Add error handling resulting from SQL calculations. +- Add error handling resulting from SQL calculations. -* Standardized error responses as JSON. +- Standardized error responses as JSON. -* Corrected internal process generation to not allow more processes than machine has cores. \ No newline at end of file +- Corrected internal process generation to not allow more processes than machine has cores. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.2.0.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.2.0.md index 095bf239..a504a7ad 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.2.0.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.2.0.md @@ -4,39 +4,39 @@ sidebar_position: 89799 --- ### HarperDB 1.2.0, Alby Release + 7/10/2018 **Features** -* Time to Live: Conserve the resources of your edge device by setting data on devices to live for a specific period of time. -* Geo: HarperDB has implemented turf.js into its SQL parser to enable geo based analytics. -* Jobs: CSV Data loads, Exports & Time to Live now all run as back ground jobs. -* Exports: Perform queries that export into JSON or CSV and save to disk or S3. - +- Time to Live: Conserve the resources of your edge device by setting data on devices to live for a specific period of time. +- Geo: HarperDB has implemented turf.js into its SQL parser to enable geo based analytics. +- Jobs: CSV Data loads, Exports & Time to Live now all run as back ground jobs. +- Exports: Perform queries that export into JSON or CSV and save to disk or S3. **Fixes** -* Fixed issue where CSV data loads incorrectly report number of records loaded. -* Added validation to stop `BETWEEN` operations in SQL. -* Updated logging to not include internal variables in the logs. -* Cleaned up `add_role` response to not include internal variables. -* Removed old and unused dependencies. -* Build out further unit tests and integration tests. -* Fixed https to handle certificates properly. -* Improved stability of clustering & replication. -* Corrected issue where Objects and Arrays were not casting properly in `SQL SELECT` response. -* Fixed issue where Blob text was not being returned from `SQL SELECT`s. -* Fixed error being returned when querying on table with no data, now correctly returns empty array. -* Improved performance in SQL when searching on exact values. -* Fixed error when ./harperdb stop is called. -* Fixed logging issue causing instability in installer. -* Fixed `read_log` operation to accept date time. -* Added permissions checking to `export_to_s3`. -* Added ability to run SQL on `SELECT` without a `FROM`. -* Fixed issue where updating a user’s password was not encrypting properly. -* Fixed `user_guide.html` to point to readme on git repo. -* Created option to have HarperDB run as a foreground process. -* Updated `user_info` to return the correct role for a user. -* Fixed issue where HarperDB would not stop if the database root was deleted. -* Corrected error message on insert if an invalid schema is provided. -* Added permissions checks for user & role operations. \ No newline at end of file +- Fixed issue where CSV data loads incorrectly report number of records loaded. +- Added validation to stop `BETWEEN` operations in SQL. +- Updated logging to not include internal variables in the logs. +- Cleaned up `add_role` response to not include internal variables. +- Removed old and unused dependencies. +- Build out further unit tests and integration tests. +- Fixed https to handle certificates properly. +- Improved stability of clustering & replication. +- Corrected issue where Objects and Arrays were not casting properly in `SQL SELECT` response. +- Fixed issue where Blob text was not being returned from `SQL SELECT`s. +- Fixed error being returned when querying on table with no data, now correctly returns empty array. +- Improved performance in SQL when searching on exact values. +- Fixed error when ./harperdb stop is called. +- Fixed logging issue causing instability in installer. +- Fixed `read_log` operation to accept date time. +- Added permissions checking to `export_to_s3`. +- Added ability to run SQL on `SELECT` without a `FROM`. +- Fixed issue where updating a user’s password was not encrypting properly. +- Fixed `user_guide.html` to point to readme on git repo. +- Created option to have HarperDB run as a foreground process. +- Updated `user_info` to return the correct role for a user. +- Fixed issue where HarperDB would not stop if the database root was deleted. +- Corrected error message on insert if an invalid schema is provided. +- Added permissions checks for user & role operations. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.3.0.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.3.0.md index ad196159..e3a5215f 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.3.0.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.3.0.md @@ -4,24 +4,24 @@ sidebar_position: 89699 --- ### HarperDB 1.3.0, Alby Release + 11/2/2018 **Features** -* Upgrade: Upgrade to newest version via command line. -* SQL Support: Added `IS NULL` for SQL parser. -* Added attribute validation to search operations. - +- Upgrade: Upgrade to newest version via command line. +- SQL Support: Added `IS NULL` for SQL parser. +- Added attribute validation to search operations. **Fixes** -* Fixed `SELECT` calculations, i.e. `SELECT` 2+2. -* Fixed select OR not returning expected results. -* No longer allowing reserved words for schema and table names. -* Corrected process interruptions from improper SQL statements. -* Improved message handling between spawned processes that replace killed processes. -* Enhanced error handling for updates to tables that do not exist. -* Fixed error handling for NoSQL responses when `get_attributes` is provided with invalid attributes. -* Fixed issue with new columns not being updated properly in update statements. -* Now validating roles, tables and attributes when creating or updating roles. -* Fixed an issue where in some cases `undefined` was being returned after dropping a role +- Fixed `SELECT` calculations, i.e. `SELECT` 2+2. +- Fixed select OR not returning expected results. +- No longer allowing reserved words for schema and table names. +- Corrected process interruptions from improper SQL statements. +- Improved message handling between spawned processes that replace killed processes. +- Enhanced error handling for updates to tables that do not exist. +- Fixed error handling for NoSQL responses when `get_attributes` is provided with invalid attributes. +- Fixed issue with new columns not being updated properly in update statements. +- Now validating roles, tables and attributes when creating or updating roles. +- Fixed an issue where in some cases `undefined` was being returned after dropping a role diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.3.1.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.3.1.md index 77e3ffe4..56927389 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.3.1.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/1.3.1.md @@ -4,26 +4,26 @@ sidebar_position: 89698 --- ### HarperDB 1.3.1, Alby Release + 2/26/2019 **Features** -* Clustering connection direction appointment -* Foundations for threading/multi processing -* UUID autogen for hash attributes that were not provided -* Added cluster status operation - +- Clustering connection direction appointment +- Foundations for threading/multi processing +- UUID autogen for hash attributes that were not provided +- Added cluster status operation **Bug Fixes and Enhancements** -* More logging -* Clustering communication enhancements -* Clustering queue ordering by timestamps -* Cluster re connection enhancements -* Number of system core(s) detection -* Node LTS (10.15) compatibility -* Update/Alter users enhancements -* General performance enhancements -* Warning is logged if different versions of harperdb are connected via clustering -* Fixed need to restart after user creation/alteration -* Fixed SQL error that occurred on selecting from an empty table \ No newline at end of file +- More logging +- Clustering communication enhancements +- Clustering queue ordering by timestamps +- Cluster re connection enhancements +- Number of system core(s) detection +- Node LTS (10.15) compatibility +- Update/Alter users enhancements +- General performance enhancements +- Warning is logged if different versions of harperdb are connected via clustering +- Fixed need to restart after user creation/alteration +- Fixed SQL error that occurred on selecting from an empty table diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/_category_.json b/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/_category_.json index e33195ec..9eded684 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/_category_.json +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v1-alby/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Alby (Version 1)", - "position": -1 -} \ No newline at end of file + "label": "HarperDB Alby (Version 1)", + "position": -1 +} diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.1.1.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.1.1.md index e1314a5f..c59337d7 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.1.1.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.1.1.md @@ -4,24 +4,25 @@ sidebar_position: 79898 --- ### HarperDB 2.1.1, Penny Release + 05/22/2020 **Highlights** -* CORE-1007 Added the ability to perform `SQL INSERT` & `UPDATE` with function calls & expressions on values. -* CORE-1023 Fixed minor bug in final SQL step incorrectly trying to translate ordinals to alias in `ORDER BY` statement. -* CORE-1020 Fixed bug allowing 'null' and 'undefined' string values to be passed in as valid hash values. -* CORE-1006 Added SQL functionality that enables `JOIN` statements across different schemas. -* CORE-1005 Implemented JSONata library to handle our JSON document search functionality in SQL, creating the `SEARCH_JSON` function. -* CORE-1009 Updated schema validation to allow all printable ASCII characters to be used in schema/table/attribute names, except, forward slashes and backticks. Same rules apply now for hash attribute values. -* CORE-1003 Fixed handling of ORDER BY statements with function aliases. -* CORE-1004 Fixed bug related to `SELECT*` on `JOIN` queries with table columns with the same name. -* CORE-996 Fixed an issue where the `transact_to_cluster` flag is lost for CSV URL loads, fixed an issue where new attributes created in CSV bulk load do not sync to the cluster. -* CORE-994 Added new operation `system_information`. This operation returns info & metrics for the OS, time, memory, cpu, disk, network. -* CORE-993 Added new custom date functions for AlaSQL & UTC updates. -* CORE-991 Changed jobs to spawn a new process which will run the intended job without impacting a main HarperDB process. -* CORE-992 HTTPS enabled by default. -* CORE-990 Updated `describe_table` to add the record count for the table for LMDB data storage. -* CORE-989 Killed the socket cluster processes prior to HarperDB processes to eliminate a false uptime. -* CORE-975 Updated time values set by SQL Date Functions to be in epoch format. -* CORE-974 Added date functions to `SQL SELECT` column alias functionality. \ No newline at end of file +- CORE-1007 Added the ability to perform `SQL INSERT` & `UPDATE` with function calls & expressions on values. +- CORE-1023 Fixed minor bug in final SQL step incorrectly trying to translate ordinals to alias in `ORDER BY` statement. +- CORE-1020 Fixed bug allowing 'null' and 'undefined' string values to be passed in as valid hash values. +- CORE-1006 Added SQL functionality that enables `JOIN` statements across different schemas. +- CORE-1005 Implemented JSONata library to handle our JSON document search functionality in SQL, creating the `SEARCH_JSON` function. +- CORE-1009 Updated schema validation to allow all printable ASCII characters to be used in schema/table/attribute names, except, forward slashes and backticks. Same rules apply now for hash attribute values. +- CORE-1003 Fixed handling of ORDER BY statements with function aliases. +- CORE-1004 Fixed bug related to `SELECT*` on `JOIN` queries with table columns with the same name. +- CORE-996 Fixed an issue where the `transact_to_cluster` flag is lost for CSV URL loads, fixed an issue where new attributes created in CSV bulk load do not sync to the cluster. +- CORE-994 Added new operation `system_information`. This operation returns info & metrics for the OS, time, memory, cpu, disk, network. +- CORE-993 Added new custom date functions for AlaSQL & UTC updates. +- CORE-991 Changed jobs to spawn a new process which will run the intended job without impacting a main HarperDB process. +- CORE-992 HTTPS enabled by default. +- CORE-990 Updated `describe_table` to add the record count for the table for LMDB data storage. +- CORE-989 Killed the socket cluster processes prior to HarperDB processes to eliminate a false uptime. +- CORE-975 Updated time values set by SQL Date Functions to be in epoch format. +- CORE-974 Added date functions to `SQL SELECT` column alias functionality. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.2.0.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.2.0.md index 267168cd..a669ca8b 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.2.0.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.2.0.md @@ -4,40 +4,41 @@ sidebar_position: 79799 --- ### HarperDB 2.2.0, Penny Release + 08/24/2020 **Features/Updates** -* CORE-997 Updated the data format for CSV data loads being sync'd across a cluster to take up less resources -* CORE-1018 Adds SQL functionality for `BETWEEN` statements -* CORE-1032 Updates permissions to allow regular users (i.e. non-super users) to call the `get_job` operation -* CORE-1036 On create/drop table we auto create/drop the related transactions environments for the schema.table -* CORE-1042 Built raw functions to write to a tables transaction log for insert/update/delete operations -* CORE-1057 Implemented write transaction into lmdb create/update/delete functions -* CORE-1048 Adds `SEARCH` wildcard handling for role permissions standards -* CORE-1059 Added config setting to disable transaction logging for an instance -* CORE-1076 Adds permissions filter to describe operations -* CORE-1043 Change clustering catchup to use the new transaction log -* CORE-1052 Removed word "master" from source -* CORE-1061 Added new operation called `delete_transactions_before` this will tail a transaction log for a specific schema / table -* CORE-1040 On HarperDB startup make sure all tables have a transaction environment -* CORE-1055 Added 2 new setting to change the server headersTimeout & keepAliveTimeout from the config file -* CORE-1044 Created new operation `read_transaction_log` which will allow a user to get transactions for a table by `timestamp`, `username`, or `hash_value` -* CORE-1043 Change clustering catchup to use the new transaction log -* CORE-1089 Added new attribute to `system_information` for table/transaction log data size in bytes & transaction log record count -* CORE-1101 Fix to store empty strings rather than considering them null & fix to be able to search on empty strings in SQL/NoSQL. -* CORE-1054 Updates permissions object to remove delete attribute permission and update table attribute permission key to `attribute_permissions` -* CORE-1092 Do not allow the `__createdtime__` to be updated -* CORE-1085 Updates create schema/table & drop schema/table/attribute operations permissions to require super user role and adds integration tests to validate -* CORE-1071 Updates response messages and status codes from `describe_schema` and `describe_table` operations to provide standard language/status code when a schema item is not found -* CORE-1049 Updates response message for SQL update op with no matching rows -* CORE-1096 Added tracking of the origin in the transaction log. This origin object stores the node name, timestamp of the transaction from the originating node & the user. +- CORE-997 Updated the data format for CSV data loads being sync'd across a cluster to take up less resources +- CORE-1018 Adds SQL functionality for `BETWEEN` statements +- CORE-1032 Updates permissions to allow regular users (i.e. non-super users) to call the `get_job` operation +- CORE-1036 On create/drop table we auto create/drop the related transactions environments for the schema.table +- CORE-1042 Built raw functions to write to a tables transaction log for insert/update/delete operations +- CORE-1057 Implemented write transaction into lmdb create/update/delete functions +- CORE-1048 Adds `SEARCH` wildcard handling for role permissions standards +- CORE-1059 Added config setting to disable transaction logging for an instance +- CORE-1076 Adds permissions filter to describe operations +- CORE-1043 Change clustering catchup to use the new transaction log +- CORE-1052 Removed word "master" from source +- CORE-1061 Added new operation called `delete_transactions_before` this will tail a transaction log for a specific schema / table +- CORE-1040 On HarperDB startup make sure all tables have a transaction environment +- CORE-1055 Added 2 new setting to change the server headersTimeout & keepAliveTimeout from the config file +- CORE-1044 Created new operation `read_transaction_log` which will allow a user to get transactions for a table by `timestamp`, `username`, or `hash_value` +- CORE-1043 Change clustering catchup to use the new transaction log +- CORE-1089 Added new attribute to `system_information` for table/transaction log data size in bytes & transaction log record count +- CORE-1101 Fix to store empty strings rather than considering them null & fix to be able to search on empty strings in SQL/NoSQL. +- CORE-1054 Updates permissions object to remove delete attribute permission and update table attribute permission key to `attribute_permissions` +- CORE-1092 Do not allow the `__createdtime__` to be updated +- CORE-1085 Updates create schema/table & drop schema/table/attribute operations permissions to require super user role and adds integration tests to validate +- CORE-1071 Updates response messages and status codes from `describe_schema` and `describe_table` operations to provide standard language/status code when a schema item is not found +- CORE-1049 Updates response message for SQL update op with no matching rows +- CORE-1096 Added tracking of the origin in the transaction log. This origin object stores the node name, timestamp of the transaction from the originating node & the user. **Bug Fixes** -* CORE-1028 Fixes bug for simple `SQL SELECT` queries not returning aliases and incorrectly returning hash values when not requested in query -* CORE-1037 Fixed an issue where numbers with leading zero i.e. 00123 are converted to numbers rather than being honored as strings. -* CORE-1063 Updates permission error response shape to consolidate issues into individual objects per schema/table combo -* CORE-1098 Fixed an issue where transaction environments were remaining in the global cache after being dropped. -* CORE-1086 Fixed issue where responses from insert/update were incorrect with skipped records. -* CORE-1079 Fixes SQL bugs around invalid schema/table and special characters in `WHERE` clause \ No newline at end of file +- CORE-1028 Fixes bug for simple `SQL SELECT` queries not returning aliases and incorrectly returning hash values when not requested in query +- CORE-1037 Fixed an issue where numbers with leading zero i.e. 00123 are converted to numbers rather than being honored as strings. +- CORE-1063 Updates permission error response shape to consolidate issues into individual objects per schema/table combo +- CORE-1098 Fixed an issue where transaction environments were remaining in the global cache after being dropped. +- CORE-1086 Fixed issue where responses from insert/update were incorrect with skipped records. +- CORE-1079 Fixes SQL bugs around invalid schema/table and special characters in `WHERE` clause diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.2.2.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.2.2.md index 827c63db..fca00967 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.2.2.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.2.2.md @@ -4,13 +4,14 @@ sidebar_position: 79797 --- ### HarperDB 2.2.2, Penny Release + 10/27/2020 -* CORE-1154 Allowed transaction logging to be disabled even if clustering is enabled. -* CORE-1153 Fixed issue where `delete_files_before` was writing to transaction log. -* CORE-1152 Fixed issue where no more than 4 HarperDB forks would be created. -* CORE-1112 Adds handling for system timestamp attributes in permissions. -* CORE-1131 Adds better handling for checking perms on operations with action value in JSON. -* CORE-1113 Fixes validation bug checking for super user/cluster user permissions and other permissions. -* CORE-1135 Adds validation for valid keys in role API operations. -* CORE-1073 Adds new `import_from_s3` operation to API. +- CORE-1154 Allowed transaction logging to be disabled even if clustering is enabled. +- CORE-1153 Fixed issue where `delete_files_before` was writing to transaction log. +- CORE-1152 Fixed issue where no more than 4 HarperDB forks would be created. +- CORE-1112 Adds handling for system timestamp attributes in permissions. +- CORE-1131 Adds better handling for checking perms on operations with action value in JSON. +- CORE-1113 Fixes validation bug checking for super user/cluster user permissions and other permissions. +- CORE-1135 Adds validation for valid keys in role API operations. +- CORE-1073 Adds new `import_from_s3` operation to API. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.2.3.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.2.3.md index eca953e2..06b89d4e 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.2.3.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.2.3.md @@ -4,6 +4,7 @@ sidebar_position: 79796 --- ### HarperDB 2.2.3, Penny Release + 11/16/2020 -* CORE-1158 Performance improvements to core delete function and configuration of `delete_files_before` to run in batches with a pause into between. \ No newline at end of file +- CORE-1158 Performance improvements to core delete function and configuration of `delete_files_before` to run in batches with a pause into between. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.3.0.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.3.0.md index 2b248490..a027eedb 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.3.0.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.3.0.md @@ -4,19 +4,20 @@ sidebar_position: 79699 --- ### HarperDB 2.3.0, Penny Release + 12/03/2020 **Features/Updates** -* CORE-1191, CORE-1190, CORE-1125, CORE-1157, CORE-1126, CORE-1140, CORE-1134, CORE-1123, CORE-1124, CORE-1122 Added JWT Authentication option (See documentation for more information) -* CORE-1128, CORE-1143, CORE-1140, CORE-1129 Added `upsert` operation -* CORE-1187 Added `get_configuration` operation which allows admins to view their configuration settings. -* CORE-1175 Added new internal LMDB function to copy an environment for use in future features. -* CORE-1166 Updated packages to address security vulnerabilities. +- CORE-1191, CORE-1190, CORE-1125, CORE-1157, CORE-1126, CORE-1140, CORE-1134, CORE-1123, CORE-1124, CORE-1122 Added JWT Authentication option (See documentation for more information) +- CORE-1128, CORE-1143, CORE-1140, CORE-1129 Added `upsert` operation +- CORE-1187 Added `get_configuration` operation which allows admins to view their configuration settings. +- CORE-1175 Added new internal LMDB function to copy an environment for use in future features. +- CORE-1166 Updated packages to address security vulnerabilities. **Bug Fixes** -* CORE-1195 Modified `drop_attribute` to drop after data cleanse completes. -* CORE-1149 Fix SQL bug regarding self joins and updates alasql to 0.6.5 release. -* CORE-1168 Fix inconsistent invalid schema/table errors. -* CORE-1162 Fix bug which caused `delete_files_before` to cause tables to grow in size due to an open cursor issue. \ No newline at end of file +- CORE-1195 Modified `drop_attribute` to drop after data cleanse completes. +- CORE-1149 Fix SQL bug regarding self joins and updates alasql to 0.6.5 release. +- CORE-1168 Fix inconsistent invalid schema/table errors. +- CORE-1162 Fix bug which caused `delete_files_before` to cause tables to grow in size due to an open cursor issue. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.3.1.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.3.1.md index 51291a01..03df0186 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.3.1.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/2.3.1.md @@ -4,9 +4,10 @@ sidebar_position: 79698 --- ### HarperDB 2.3.1, Penny Release + 1/29/2021 **Bug Fixes** -* CORE-1218 A bug in HarperDB 2.3.0 was identified related to manually calling the `create_attribute` operation. This bug caused secondary indexes to be overwritten by the most recently inserted or updated value for the index, thereby causing a search operation filtered with that index to only return the most recently inserted/updated row. Note, this issue does not affect attributes that are reflexively/automatically created. It only affects attributes created using `create_attribute`. To resolve this issue in 2.3.0 or earlier, drop and recreate your table using reflexive attribute creation. In 2.3.1, drop and recreate your table and use either reflexive attribute creation or `create_attribute`. -* CORE-1219 Increased maximum table attributes from 1000 to 10000 \ No newline at end of file +- CORE-1218 A bug in HarperDB 2.3.0 was identified related to manually calling the `create_attribute` operation. This bug caused secondary indexes to be overwritten by the most recently inserted or updated value for the index, thereby causing a search operation filtered with that index to only return the most recently inserted/updated row. Note, this issue does not affect attributes that are reflexively/automatically created. It only affects attributes created using `create_attribute`. To resolve this issue in 2.3.0 or earlier, drop and recreate your table using reflexive attribute creation. In 2.3.1, drop and recreate your table and use either reflexive attribute creation or `create_attribute`. +- CORE-1219 Increased maximum table attributes from 1000 to 10000 diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/_category_.json b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/_category_.json index 285eecf7..28f86bc1 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/_category_.json +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v2-penny/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Penny (Version 2)", - "position": -2 -} \ No newline at end of file + "label": "HarperDB Penny (Version 2)", + "position": -2 +} diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.0.0.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.0.0.md index 2907ee6c..10319747 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.0.0.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.0.0.md @@ -4,28 +4,29 @@ sidebar_position: 69999 --- ### HarperDB 3.0, Monkey Release + 5/18/2021 **Features/Updates** -* CORE-1217, CORE-1226, CORE-1232 Create new `search_by_conditions` operation. -* CORE-1304 Upgrade to Node 12.22.1. -* CORE-1235 Adds new upgrade/install functionality. -* CORE-1206, CORE-1248, CORE-1252 Implement `lmdb-store` library for optimized performance. -* CORE-1062 Added alias operation for `delete_files_before`, named `delete_records_before`. -* CORE-1243 Change `HTTPS_ON` settings value to false by default. -* CORE-1189 Implement fastify web server, resulting in improved performance. -* CORE-1221 Update user API to use role name instead of role id. -* CORE-1225 Updated dependencies to eliminate npm security warnings. -* CORE-1241 Adds 3.0 update directive and refactors/fixes update functionality. +- CORE-1217, CORE-1226, CORE-1232 Create new `search_by_conditions` operation. +- CORE-1304 Upgrade to Node 12.22.1. +- CORE-1235 Adds new upgrade/install functionality. +- CORE-1206, CORE-1248, CORE-1252 Implement `lmdb-store` library for optimized performance. +- CORE-1062 Added alias operation for `delete_files_before`, named `delete_records_before`. +- CORE-1243 Change `HTTPS_ON` settings value to false by default. +- CORE-1189 Implement fastify web server, resulting in improved performance. +- CORE-1221 Update user API to use role name instead of role id. +- CORE-1225 Updated dependencies to eliminate npm security warnings. +- CORE-1241 Adds 3.0 update directive and refactors/fixes update functionality. **Bug Fixes** -* CORE-1299 Remove all references to the `PROJECT_DIR` setting. This setting is problematic when using node version managers and upgrading the version of node and then installing a new instance of HarperDB. -* CORE-1288 Fix bug with drop table/schema that was causing 'env required' error log. -* CORE-1285 Update warning log when trying to create an attribute that already exists. -* CORE-1254 Added logic to manage data collisions in clustering. -* CORE-1212 Add pre-check to `drop_user` that returns error if user doesn't exist. -* CORE-1114 Update response code and message from `add_user` when user already exists. -* CORE-1111 Update response from `create_attribute` to match the create schema/table response. -* CORE-1205 Fixed bug that prevented schema/table from being dropped if name was a number or had a wildcard value in it. Updated validation for insert, upsert and update. \ No newline at end of file +- CORE-1299 Remove all references to the `PROJECT_DIR` setting. This setting is problematic when using node version managers and upgrading the version of node and then installing a new instance of HarperDB. +- CORE-1288 Fix bug with drop table/schema that was causing 'env required' error log. +- CORE-1285 Update warning log when trying to create an attribute that already exists. +- CORE-1254 Added logic to manage data collisions in clustering. +- CORE-1212 Add pre-check to `drop_user` that returns error if user doesn't exist. +- CORE-1114 Update response code and message from `add_user` when user already exists. +- CORE-1111 Update response from `create_attribute` to match the create schema/table response. +- CORE-1205 Fixed bug that prevented schema/table from being dropped if name was a number or had a wildcard value in it. Updated validation for insert, upsert and update. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.0.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.0.md index 148690f6..f14acb8e 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.0.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.0.md @@ -4,20 +4,21 @@ sidebar_position: 69899 --- ### HarperDB 3.1.0, Monkey Release + 8/24/2021 **Features/Updates** -* CORE-1320, CORE-1321, CORE-1323, CORE-1324 Version 1.0 of HarperDB Custom Functions -* CORE-1275, CORE-1276, CORE-1278, CORE-1279, CORE-1280, CORE-1282, CORE-1283, CORE-1305, CORE-1314 IPC server for communication between HarperDB processes, including HarperDB, HarperDB Clustering, and HarperDB Functions -* CORE-1352, CORE-1355, CORE-1356, CORE-1358 Implement pm2 for HarperDB process management -* CORE-1292, CORE-1308, CORE-1312, CORE-1334, CORE-1338 Updated installation process to start HarperDB immediately on install and to accept all config settings via environment variable or command line arguments -* CORE-1310 Updated licensing functionality -* CORE-1301 Updated validation for performance improvement -* CORE-1359 Add `hdb-response-time` header which returns the HarperDB response time in milliseconds -* CORE-1330, CORE-1309 New config settings: `LOG_TO_FILE`, `LOG_TO_STDSTREAMS`, `IPC_SERVER_PORT`, `RUN_IN_FOREGROUND`, `CUSTOM_FUNCTIONS`, `CUSTOM_FUNCTIONS_PORT`, `CUSTOM_FUNCTIONS_DIRECTORY`, `MAX_CUSTOM_FUNCTION_PROCESSES` +- CORE-1320, CORE-1321, CORE-1323, CORE-1324 Version 1.0 of HarperDB Custom Functions +- CORE-1275, CORE-1276, CORE-1278, CORE-1279, CORE-1280, CORE-1282, CORE-1283, CORE-1305, CORE-1314 IPC server for communication between HarperDB processes, including HarperDB, HarperDB Clustering, and HarperDB Functions +- CORE-1352, CORE-1355, CORE-1356, CORE-1358 Implement pm2 for HarperDB process management +- CORE-1292, CORE-1308, CORE-1312, CORE-1334, CORE-1338 Updated installation process to start HarperDB immediately on install and to accept all config settings via environment variable or command line arguments +- CORE-1310 Updated licensing functionality +- CORE-1301 Updated validation for performance improvement +- CORE-1359 Add `hdb-response-time` header which returns the HarperDB response time in milliseconds +- CORE-1330, CORE-1309 New config settings: `LOG_TO_FILE`, `LOG_TO_STDSTREAMS`, `IPC_SERVER_PORT`, `RUN_IN_FOREGROUND`, `CUSTOM_FUNCTIONS`, `CUSTOM_FUNCTIONS_PORT`, `CUSTOM_FUNCTIONS_DIRECTORY`, `MAX_CUSTOM_FUNCTION_PROCESSES` **Bug Fixes** -* CORE-1315 Corrected issue in HarperDB restart scenario -* CORE-1370 Update some of the validation error handlers so that they don't log full stack \ No newline at end of file +- CORE-1315 Corrected issue in HarperDB restart scenario +- CORE-1370 Update some of the validation error handlers so that they don't log full stack diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.1.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.1.md index 0adbeb21..8f90dc10 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.1.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.1.md @@ -4,15 +4,16 @@ sidebar_position: 69898 --- ### HarperDB 3.1.1, Monkey Release + 9/23/2021 **Features/Updates** -* CORE-1393 Added utility function to add settings from env/cmd vars to the settings file on every run/restart -* CORE-1395 Create a setting which will allow to enable the local Studio to be served from an instance of HarperDB -* CORE-1397 Update the stock 404 response to not return the request URL -* General updates to optimize Docker container +- CORE-1393 Added utility function to add settings from env/cmd vars to the settings file on every run/restart +- CORE-1395 Create a setting which will allow to enable the local Studio to be served from an instance of HarperDB +- CORE-1397 Update the stock 404 response to not return the request URL +- General updates to optimize Docker container **Bug Fixes** -* CORE-1399 Added fixes for complex SQL alias issues \ No newline at end of file +- CORE-1399 Added fixes for complex SQL alias issues diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.2.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.2.md index f1c192b6..706e5956 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.2.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.2.md @@ -4,12 +4,13 @@ sidebar_position: 69897 --- ### HarperDB 3.1.2, Monkey Release + 10/21/2021 **Features/Updates** -* Updated the installation ASCII art to reflect the new HarperDB logo +- Updated the installation ASCII art to reflect the new HarperDB logo **Bug Fixes** -* CORE-1408 Corrects issue where `drop_attribute` was not properly setting the LMDB version number causing tables to behave unexpectedly \ No newline at end of file +- CORE-1408 Corrects issue where `drop_attribute` was not properly setting the LMDB version number causing tables to behave unexpectedly diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.3.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.3.md index 2d484f8d..1a7d3301 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.3.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.3.md @@ -4,8 +4,9 @@ sidebar_position: 69896 --- ### HarperDB 3.1.3, Monkey Release + 1/14/2022 **Bug Fixes** -* CORE-1446 Fix for scans on indexes larger than 1 million entries causing queries to never return \ No newline at end of file +- CORE-1446 Fix for scans on indexes larger than 1 million entries causing queries to never return diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.4.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.4.md index ae0074fd..3fa86ead 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.4.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.4.md @@ -4,8 +4,9 @@ sidebar_position: 69895 --- ### HarperDB 3.1.4, Monkey Release + 2/24/2022 **Features/Updates** -* CORE-1460 Added new setting `STORAGE_WRITE_ASYNC`. If this setting is true, LMDB will have faster write performance at the expense of not being crash safe. The default for this setting is false, which results in HarperDB being crash safe. \ No newline at end of file +- CORE-1460 Added new setting `STORAGE_WRITE_ASYNC`. If this setting is true, LMDB will have faster write performance at the expense of not being crash safe. The default for this setting is false, which results in HarperDB being crash safe. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.5.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.5.md index eff4b5b0..23661928 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.5.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.1.5.md @@ -4,8 +4,9 @@ sidebar_position: 69894 --- ### HarperDB 3.1.5, Monkey Release + 3/4/2022 **Features/Updates** -* CORE-1498 Fixed incorrect autocasting of string that start with "0." that tries to convert to number but instead returns NaN. \ No newline at end of file +- CORE-1498 Fixed incorrect autocasting of string that start with "0." that tries to convert to number but instead returns NaN. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.2.0.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.2.0.md index 003575d8..fa215082 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.2.0.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.2.0.md @@ -4,10 +4,11 @@ sidebar_position: 69799 --- ### HarperDB 3.2.0, Monkey Release + 3/25/2022 **Features/Updates** -* CORE-1391 Bug fix related to orphaned HarperDB background processes. -* CORE-1509 Updated node version check, updated Node.js version, updated project dependencies. -* CORE-1518 Remove final call from logger. \ No newline at end of file +- CORE-1391 Bug fix related to orphaned HarperDB background processes. +- CORE-1509 Updated node version check, updated Node.js version, updated project dependencies. +- CORE-1518 Remove final call from logger. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.2.1.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.2.1.md index dc511a70..4cc983a4 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.2.1.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.2.1.md @@ -4,8 +4,9 @@ sidebar_position: 69798 --- ### HarperDB 3.2.1, Monkey Release + 6/1/2022 **Features/Updates** -* CORE-1573 Added logic to track the pid of the foreground process if running in foreground. Then on stop, use that pid to kill the process. Logic was also added to kill the pm2 daemon when stop is called. \ No newline at end of file +- CORE-1573 Added logic to track the pid of the foreground process if running in foreground. Then on stop, use that pid to kill the process. Logic was also added to kill the pm2 daemon when stop is called. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.3.0.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.3.0.md index 3e3ca784..236704dd 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.3.0.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/3.3.0.md @@ -5,8 +5,8 @@ sidebar_position: 69699 ### HarperDB 3.3.0 - Monkey -* CORE-1595 Added new role type `structure_user`, this enables non-superusers to be able to create/drop schema/table/attribute. -* CORE-1501 Improved performance for drop_table. -* CORE-1599 Added two new operations for custom functions `install_node_modules` & `audit_node_modules`. -* CORE-1598 Added `skip_node_modules` flag to `package_custom_function_project` operation. This flag allows for not bundling project dependencies and deploying a smaller project to other nodes. Use this flag in tandem with `install_node_modules`. -* CORE-1707 Binaries are now included for Linux on AMD64, Linux on ARM64, and macOS. GCC, Make, Python are no longer required when installing on these platforms. +- CORE-1595 Added new role type `structure_user`, this enables non-superusers to be able to create/drop schema/table/attribute. +- CORE-1501 Improved performance for drop_table. +- CORE-1599 Added two new operations for custom functions `install_node_modules` & `audit_node_modules`. +- CORE-1598 Added `skip_node_modules` flag to `package_custom_function_project` operation. This flag allows for not bundling project dependencies and deploying a smaller project to other nodes. Use this flag in tandem with `install_node_modules`. +- CORE-1707 Binaries are now included for Linux on AMD64, Linux on ARM64, and macOS. GCC, Make, Python are no longer required when installing on these platforms. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/_category_.json b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/_category_.json index 0103ac36..71bea62a 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/_category_.json +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v3-monkey/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Monkey (Version 3)", - "position": -3 -} \ No newline at end of file + "label": "HarperDB Monkey (Version 3)", + "position": -3 +} diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.0.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.0.md index d2aa32b2..b94ea2f8 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.0.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.0.md @@ -4,121 +4,128 @@ sidebar_position: 59999 --- ### HarperDB 4.0.0, Tucker Release + 11/2/2022 **Networking & Data Replication (Clustering)** -The HarperDB clustering internals have been rewritten and the underlying technology for Clustering has been completely replaced with [NATS](https://nats.io/), an enterprise grade connective technology responsible for addressing, discovery and exchanging of messages that drive the common patterns in distributed systems. -* CORE-1464, CORE-1470, : Remove SocketCluster dependencies and all code related to them. -* CORE-1465, CORE-1485, CORE-1537, CORE-1538, CORE-1558, CORE-1583, CORE_1665, CORE-1710, CORE-1801, CORE-1865 :Add nats-`server` code as dependency, on install of HarperDB download nats-`server` is possible else fallback to building from source code. -* CORE-1593, CORE-1761: Add `nats.js` as project dependency. -* CORE-1466: Build NATS configs on `harperdb run` based on HarperDB YAML configuration. -* CORE-1467, CORE-1508: Launch and manage NATS servers with PM2. -* CORE-1468, CORE-1507: Create a process which reads the work queue stream and processes transactions. -* CORE-1481, CORE-1529, CORE-1698, CORE-1502, CORE-1696: On upgrade to 4.0, update pre-existing clustering configurations, create table transaction streams, create work queue stream, update `hdb_nodes` table, create clustering folder structure, and rebuild self-signed certs. -* CORE-1494, CORE-1521, CORE-1755: Build out internals to interface with NATS. -* CORE-1504: Update existing hooks to save transactions to work with NATS. -* CORE-1514, CORE-1515, CORE-1516, CORE-1527, CORE-1532: Update `add_node`, `update_node`, and `remove_node` operations to no longer need host and port in payload. These operations now manage dynamically sourcing of table level transaction streams between nodes and work queues. -* CORE-1522: Create `NATSReplyService` process which handles the receiving NATS based requests from remote instances and sending back appropriate responses. -* CORE-1471, CORE-1568, CORE-1563, CORE-1534, CORE-1569: Update `cluster_status` operation. -* CORE-1611: Update pre-existing transaction log operations to be audit log operations. -* CORE-1541, CORE-1612, CORE-1613: Create translation log operations which interface with streams. -* CORE-1668: Update NATS serialization / deserialization to use MessagePack. -* CORE-1673: Add `system_info` param to `hdb_nodes` table and update on `add_node` and `cluster_status`. -* CORE-1477, CORE-1493, CORE-1557, CORE-1596, CORE-1577: Both a full HarperDB restart & just clustering restart call the NATS server with a reload directive to maintain full uptime while servers refresh. -* CORE-1474:HarperDB install adds clustering folder structure. -* CORE-1530: Post `drop_table` HarperDB purges the related transaction stream. -* CORE-1567: Set NATS config to always use TLS. -* CORE-1543: Removed the `transact_to_cluster` attribute from the bulk load operations. Now bulk loads always replicate. -* CORE-1533, CORE-1556, CORE-1561, CORE-1562, CORE-1564: New operation `configure_cluster`, this operation enables bulk publishing and subscription of multiple tables to multiple instances of HarperDB. -* CORE-1535: Create work queue stream on install of HarperDB. This stream receives transactions from remote instances of HarperDB which are then ingested in order. -* CORE-1551: Create transaction streams on the remote node if they do not exist when performing `add_node` or `update_node`. -* CORE-1594, CORE-1605, CORE-1749, CORE-1767, CORE-1770: Optimize the work queue stream and its consumer to be more performant and validate exact once delivery. -* CORE-1621, CORE-1692, CORE-1570, CORE-1693: NATS stream names are MD5 hashed to avoid characters that HarperDB allows, but NATS may not. -* CORE-1762: Add a new optional attribute to `add_node` and `update_node` named `opt_start_time`. This attribute sets a starting time to start synchronizing transactions. -* CORE-1785: Optimizations and bug fixes in regards to sourcing data from remote instances on HarperDB. -* CORE-1588: Created new operation `set_cluster_routes` to enable setting routes for instances of HarperDB to mesh together. -* CORE-1589: Created new operation `get_cluster_routes` to allow for retrieval of routes used to connect the instance of HarperDB to the mesh. -* CORE-1590: Created new operation `delete_cluster_routes` to allow for removal of routes used to connect the instance of HarperDB to the mesh. -* CORE-1667: Fix old environment variable `CLUSTERING_PORT` not mapping to new hub server port. -* CORE-1609: Allow `remove_node` to be called when the other node cannot be reached. -* CORE-1815: Add transaction lock to `add_node` and `update_node` to avoid concurrent nats source update bug. -* CORE-1848: Update stream configs if the node name has been changed in the YAML configuration. -* CORE-1873: Update `add_node` and `update_node` so that it auto-creates schema/table on both local and remote node respectively +The HarperDB clustering internals have been rewritten and the underlying technology for Clustering has been completely replaced with [NATS](https://nats.io/), an enterprise grade connective technology responsible for addressing, discovery and exchanging of messages that drive the common patterns in distributed systems. +- CORE-1464, CORE-1470, : Remove SocketCluster dependencies and all code related to them. +- CORE-1465, CORE-1485, CORE-1537, CORE-1538, CORE-1558, CORE-1583, CORE_1665, CORE-1710, CORE-1801, CORE-1865 :Add nats-`server` code as dependency, on install of HarperDB download nats-`server` is possible else fallback to building from source code. +- CORE-1593, CORE-1761: Add `nats.js` as project dependency. +- CORE-1466: Build NATS configs on `harperdb run` based on HarperDB YAML configuration. +- CORE-1467, CORE-1508: Launch and manage NATS servers with PM2. +- CORE-1468, CORE-1507: Create a process which reads the work queue stream and processes transactions. +- CORE-1481, CORE-1529, CORE-1698, CORE-1502, CORE-1696: On upgrade to 4.0, update pre-existing clustering configurations, create table transaction streams, create work queue stream, update `hdb_nodes` table, create clustering folder structure, and rebuild self-signed certs. +- CORE-1494, CORE-1521, CORE-1755: Build out internals to interface with NATS. +- CORE-1504: Update existing hooks to save transactions to work with NATS. +- CORE-1514, CORE-1515, CORE-1516, CORE-1527, CORE-1532: Update `add_node`, `update_node`, and `remove_node` operations to no longer need host and port in payload. These operations now manage dynamically sourcing of table level transaction streams between nodes and work queues. +- CORE-1522: Create `NATSReplyService` process which handles the receiving NATS based requests from remote instances and sending back appropriate responses. +- CORE-1471, CORE-1568, CORE-1563, CORE-1534, CORE-1569: Update `cluster_status` operation. +- CORE-1611: Update pre-existing transaction log operations to be audit log operations. +- CORE-1541, CORE-1612, CORE-1613: Create translation log operations which interface with streams. +- CORE-1668: Update NATS serialization / deserialization to use MessagePack. +- CORE-1673: Add `system_info` param to `hdb_nodes` table and update on `add_node` and `cluster_status`. +- CORE-1477, CORE-1493, CORE-1557, CORE-1596, CORE-1577: Both a full HarperDB restart & just clustering restart call the NATS server with a reload directive to maintain full uptime while servers refresh. +- CORE-1474:HarperDB install adds clustering folder structure. +- CORE-1530: Post `drop_table` HarperDB purges the related transaction stream. +- CORE-1567: Set NATS config to always use TLS. +- CORE-1543: Removed the `transact_to_cluster` attribute from the bulk load operations. Now bulk loads always replicate. +- CORE-1533, CORE-1556, CORE-1561, CORE-1562, CORE-1564: New operation `configure_cluster`, this operation enables bulk publishing and subscription of multiple tables to multiple instances of HarperDB. +- CORE-1535: Create work queue stream on install of HarperDB. This stream receives transactions from remote instances of HarperDB which are then ingested in order. +- CORE-1551: Create transaction streams on the remote node if they do not exist when performing `add_node` or `update_node`. +- CORE-1594, CORE-1605, CORE-1749, CORE-1767, CORE-1770: Optimize the work queue stream and its consumer to be more performant and validate exact once delivery. +- CORE-1621, CORE-1692, CORE-1570, CORE-1693: NATS stream names are MD5 hashed to avoid characters that HarperDB allows, but NATS may not. +- CORE-1762: Add a new optional attribute to `add_node` and `update_node` named `opt_start_time`. This attribute sets a starting time to start synchronizing transactions. +- CORE-1785: Optimizations and bug fixes in regards to sourcing data from remote instances on HarperDB. +- CORE-1588: Created new operation `set_cluster_routes` to enable setting routes for instances of HarperDB to mesh together. +- CORE-1589: Created new operation `get_cluster_routes` to allow for retrieval of routes used to connect the instance of HarperDB to the mesh. +- CORE-1590: Created new operation `delete_cluster_routes` to allow for removal of routes used to connect the instance of HarperDB to the mesh. +- CORE-1667: Fix old environment variable `CLUSTERING_PORT` not mapping to new hub server port. +- CORE-1609: Allow `remove_node` to be called when the other node cannot be reached. +- CORE-1815: Add transaction lock to `add_node` and `update_node` to avoid concurrent nats source update bug. +- CORE-1848: Update stream configs if the node name has been changed in the YAML configuration. +- CORE-1873: Update `add_node` and `update_node` so that it auto-creates schema/table on both local and remote node respectively **Data Storage** We have made improvements to how we store, index, and retrieve data. -* CORE-1619: Enabled new concurrent flushing technology for improved write performance. -* CORE-1701: Optimize search performance for `search_by_conditions` when executing multiple AND conditions. -* CORE-1652: Encode the values of secondary indices more efficiently for faster access. -* CORE-1670: Store updated timestamp in `lmdb.js`' version property. -* CORE-1651: Enabled multiple value indexing of array values which allows for the ability to search on specific elements in an array more efficiently. -* CORE-1649, CORE-1659: Large text values (larger than 255 bytes) are no longer stored in separate blob index. Now they are segmented and delimited in the same index to increase search performance. -* Complex objects and object arrays are no longer stored in a separate index to preserve storage and increase write throughput. -* CORE-1650, CORE-1724, CORE-1738: Improved internals around interpreting attribute values. -* CORE-1657: Deferred property decoding allows large objects to be stored, but individual attributes can be accessed (like with get_attributes) without incurring the cost of decoding the entire object. -* CORE-1658: Enable in-memory caching of records for even faster access to frequently accessed data. -* CORE-1693: Wrap updates in async transactions to ensure ACID-compliant updates. -* CORE-1653: Upgrade to 4.0 rebuilds tables to reflect changes made to index improvements. -* CORE-1753: Removed old `node-lmdb` dependency. -* CORE-1787: Freeze objects returned from queries. -* CORE-1821: Read the `WRITE_ASYNC` setting which enables LMDB nosync. + +- CORE-1619: Enabled new concurrent flushing technology for improved write performance. +- CORE-1701: Optimize search performance for `search_by_conditions` when executing multiple AND conditions. +- CORE-1652: Encode the values of secondary indices more efficiently for faster access. +- CORE-1670: Store updated timestamp in `lmdb.js`' version property. +- CORE-1651: Enabled multiple value indexing of array values which allows for the ability to search on specific elements in an array more efficiently. +- CORE-1649, CORE-1659: Large text values (larger than 255 bytes) are no longer stored in separate blob index. Now they are segmented and delimited in the same index to increase search performance. +- Complex objects and object arrays are no longer stored in a separate index to preserve storage and increase write throughput. +- CORE-1650, CORE-1724, CORE-1738: Improved internals around interpreting attribute values. +- CORE-1657: Deferred property decoding allows large objects to be stored, but individual attributes can be accessed (like with get_attributes) without incurring the cost of decoding the entire object. +- CORE-1658: Enable in-memory caching of records for even faster access to frequently accessed data. +- CORE-1693: Wrap updates in async transactions to ensure ACID-compliant updates. +- CORE-1653: Upgrade to 4.0 rebuilds tables to reflect changes made to index improvements. +- CORE-1753: Removed old `node-lmdb` dependency. +- CORE-1787: Freeze objects returned from queries. +- CORE-1821: Read the `WRITE_ASYNC` setting which enables LMDB nosync. **Logging** HarperDB has increased logging specificity by breaking out logs based on components logging. There are specific log files each for HarperDB Core, Custom Functions, Hub Server, Leaf Server, and more. -* CORE-1497: Remove `pino` and `winston` dependencies. -* CORE-1426: All logging is output via `stdout` and `stderr`, our default logging is then picked up by PM2 which handles writing out to file. -* CORE-1431: Improved `read_log` operation validation. -* CORE-1433, CORE-1463: Added log rotation. -* CORE-1553, CORE-1555, CORE-1552, CORE-1554, CORE-1704: Performance gain by only serializing objects and arrays if the log is for the level defined in configuration. -* CORE-1436: Upgrade to 4.0 updates internals for logging changes. -* CORE-1428, CORE-1440, CORE-1442, CORE-1434, CORE-1435, CORE-1439, CORE-1482, CORE-1751, CORE-1752: Bug fixes, performance improvements and improved unit tests. -* CORE-1691: Convert non-PM2 managed log file writes to use Node.js `fs.appendFileSync` function. + +- CORE-1497: Remove `pino` and `winston` dependencies. +- CORE-1426: All logging is output via `stdout` and `stderr`, our default logging is then picked up by PM2 which handles writing out to file. +- CORE-1431: Improved `read_log` operation validation. +- CORE-1433, CORE-1463: Added log rotation. +- CORE-1553, CORE-1555, CORE-1552, CORE-1554, CORE-1704: Performance gain by only serializing objects and arrays if the log is for the level defined in configuration. +- CORE-1436: Upgrade to 4.0 updates internals for logging changes. +- CORE-1428, CORE-1440, CORE-1442, CORE-1434, CORE-1435, CORE-1439, CORE-1482, CORE-1751, CORE-1752: Bug fixes, performance improvements and improved unit tests. +- CORE-1691: Convert non-PM2 managed log file writes to use Node.js `fs.appendFileSync` function. **Configuration** HarperDB has updated its configuration from a properties file to YAML. -* CORE-1448, CORE-1449, CORE-1519, CORE-1587: Upgrade automatically converts the pre-existing settings file to YAML. -* CORE-1445, CORE-1534, CORE-1444, CORE-1858: Build out new logic to create, update, and interpret the YAML configuration file. -* Installer has updated prompts to reflect YAML settings. -* CORE-1447: Create an alias for the `configure_cluster` operation as `set_configuration`. -* CORE-1461, CORE-1462, CORE-1483: Unit test improvements. -* CORE-1492: Improvements to get_configuration and set_configuration operations. -* CORE-1503: Modify HarperDB configuration for more granular certificate definition. -* CORE-1591: Update `routes` IP param to `host` and to `leaf` config in `harperdb.conf` -* CORE-1519: Fix issue when switching between old and new versions of HarperDB we are getting the config parameter is undefined error on npm install. + +- CORE-1448, CORE-1449, CORE-1519, CORE-1587: Upgrade automatically converts the pre-existing settings file to YAML. +- CORE-1445, CORE-1534, CORE-1444, CORE-1858: Build out new logic to create, update, and interpret the YAML configuration file. +- Installer has updated prompts to reflect YAML settings. +- CORE-1447: Create an alias for the `configure_cluster` operation as `set_configuration`. +- CORE-1461, CORE-1462, CORE-1483: Unit test improvements. +- CORE-1492: Improvements to get_configuration and set_configuration operations. +- CORE-1503: Modify HarperDB configuration for more granular certificate definition. +- CORE-1591: Update `routes` IP param to `host` and to `leaf` config in `harperdb.conf` +- CORE-1519: Fix issue when switching between old and new versions of HarperDB we are getting the config parameter is undefined error on npm install. **Broad NodeJS and Platform Support** -* CORE-1624: HarperDB can now run on multiple versions of NodeJS, from v14 to v19. We primarily test on v18, so that is the preferred version. + +- CORE-1624: HarperDB can now run on multiple versions of NodeJS, from v14 to v19. We primarily test on v18, so that is the preferred version. **Windows 10 and 11** -* CORE-1088: HarperDB now runs natively on Windows 10 and 11 without the need to run in a container or installed in WSL. Windows is only intended for evaluation and development purposes, not for production work loads. + +- CORE-1088: HarperDB now runs natively on Windows 10 and 11 without the need to run in a container or installed in WSL. Windows is only intended for evaluation and development purposes, not for production work loads. **Extra Changes and Bug Fixes** -* CORE-1520: Refactor installer to remove all waterfall code and update to use Promises. -* CORE-1573: Stop the PM2 daemon and any logging processes when stopping hdb. -* CORE-1586: When HarperDB is running in foreground stop any additional logging processes from being spawned. -* CORE-1626: Update docker file to accommodate new `harperdb.conf` file. -* CORE-1592, CORE-1526, CORE-1660, CORE-1646, CORE-1640, CORE-1689, CORE-1711, CORE-1601, CORE-1726, CORE-1728, CORE-1736, CORE-1735, CORE-1745, CORE-1729, CORE-1748, CORE-1644, CORE-1750, CORE-1757, CORE-1727, CORE-1740, CORE-1730, CORE-1777, CORE-1778, CORE-1782, CORE-1775, CORE-1771, CORE-1774, CORE-1759, CORE-1772, CORE-1861, CORE-1862, CORE-1863, CORE-1870, CORE-1869:Changes for CI/CD pipeline and integration tests. -* CORE-1661: Fixed issue where old boot properties file caused an error when attempting to install 4.0.0. -* CORE-1697, CORE-1814, CORE-1855: Upgrade fastify dependency to new major version 4. -* CORE-1629: Jobs are now running as processes managed by the PM2 daemon. -* CORE-1733: Update LICENSE to reflect our EULA on our site. -* CORE-1606: Enable Custom Functions by default. -* CORE-1714: Include pre-built binaries for most common platforms (darwin-arm64, darwin-x64, linux-arm64, linux-x64, win32-x64). -* CORE-1628: Fix issue where setting license through environment variable not working. -* CORE-1602, CORE-1760, CORE-1838, CORE-1839, CORE-1847, CORE-1773: HarperDB Docker container improvements. -* CORE-1706: Add support for encoding HTTP responses with MessagePack. -* CORE-1709: Improve the way lmdb.js dependencies are installed. -* CORE-1758: Remove/update unnecessary HTTP headers. -* CORE-1756: On `npm install` and `harperdb install` change the node version check from an error to a warning if the installed Node.js version does not match our preferred version. -* CORE-1791: Optimizations to authenticated user caching. -* CORE-1794: Update README to discuss Windows support & Node.js versions -* CORE-1837: Fix issue where Custom Function directory was not being created on install. -* CORE-1742: Add more validation to audit log - check schema/table exists and log is enabled. -* CORE-1768: Fix issue where when running in foreground HarperDB process is not stopping on `harperdb stop`. -* CORE-1864: Fix to semver checks on upgrade. -* CORE-1850: Fix issue where a `cluster_user` type role could not be altered. + +- CORE-1520: Refactor installer to remove all waterfall code and update to use Promises. +- CORE-1573: Stop the PM2 daemon and any logging processes when stopping hdb. +- CORE-1586: When HarperDB is running in foreground stop any additional logging processes from being spawned. +- CORE-1626: Update docker file to accommodate new `harperdb.conf` file. +- CORE-1592, CORE-1526, CORE-1660, CORE-1646, CORE-1640, CORE-1689, CORE-1711, CORE-1601, CORE-1726, CORE-1728, CORE-1736, CORE-1735, CORE-1745, CORE-1729, CORE-1748, CORE-1644, CORE-1750, CORE-1757, CORE-1727, CORE-1740, CORE-1730, CORE-1777, CORE-1778, CORE-1782, CORE-1775, CORE-1771, CORE-1774, CORE-1759, CORE-1772, CORE-1861, CORE-1862, CORE-1863, CORE-1870, CORE-1869:Changes for CI/CD pipeline and integration tests. +- CORE-1661: Fixed issue where old boot properties file caused an error when attempting to install 4.0.0. +- CORE-1697, CORE-1814, CORE-1855: Upgrade fastify dependency to new major version 4. +- CORE-1629: Jobs are now running as processes managed by the PM2 daemon. +- CORE-1733: Update LICENSE to reflect our EULA on our site. +- CORE-1606: Enable Custom Functions by default. +- CORE-1714: Include pre-built binaries for most common platforms (darwin-arm64, darwin-x64, linux-arm64, linux-x64, win32-x64). +- CORE-1628: Fix issue where setting license through environment variable not working. +- CORE-1602, CORE-1760, CORE-1838, CORE-1839, CORE-1847, CORE-1773: HarperDB Docker container improvements. +- CORE-1706: Add support for encoding HTTP responses with MessagePack. +- CORE-1709: Improve the way lmdb.js dependencies are installed. +- CORE-1758: Remove/update unnecessary HTTP headers. +- CORE-1756: On `npm install` and `harperdb install` change the node version check from an error to a warning if the installed Node.js version does not match our preferred version. +- CORE-1791: Optimizations to authenticated user caching. +- CORE-1794: Update README to discuss Windows support & Node.js versions +- CORE-1837: Fix issue where Custom Function directory was not being created on install. +- CORE-1742: Add more validation to audit log - check schema/table exists and log is enabled. +- CORE-1768: Fix issue where when running in foreground HarperDB process is not stopping on `harperdb stop`. +- CORE-1864: Fix to semver checks on upgrade. +- CORE-1850: Fix issue where a `cluster_user` type role could not be altered. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.1.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.1.md index 9e148e63..2a85f511 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.1.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.1.md @@ -4,9 +4,10 @@ sidebar_position: 59998 --- ### HarperDB 4.0.1, Tucker Release + 01/20/2023 **Bug Fixes** -* CORE-1992 Local studio was not loading because the path got mangled in the build. -* CORE-2001 Fixed deploy_custom_function_project after node update broke it. +- CORE-1992 Local studio was not loading because the path got mangled in the build. +- CORE-2001 Fixed deploy_custom_function_project after node update broke it. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.2.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.2.md index b65d1427..bedbd970 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.2.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.2.md @@ -4,9 +4,10 @@ sidebar_position: 59997 --- ### HarperDB 4.0.2, Tucker Release + 01/24/2023 **Bug Fixes** -* CORE-2003 Fix bug where if machine had one core thread config would default to zero. -* Update to lmdb 2.7.3 and msgpackr 1.7.0 +- CORE-2003 Fix bug where if machine had one core thread config would default to zero. +- Update to lmdb 2.7.3 and msgpackr 1.7.0 diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.3.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.3.md index 67aaae56..ad1cbf8a 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.3.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.3.md @@ -4,8 +4,9 @@ sidebar_position: 59996 --- ### HarperDB 4.0.3, Tucker Release + 01/26/2023 **Bug Fixes** -* CORE-2007 Add update nodes 4.0.0 launch script to build script to fix clustering upgrade. +- CORE-2007 Add update nodes 4.0.0 launch script to build script to fix clustering upgrade. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.4.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.4.md index 2a30c9d1..3f052465 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.4.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.4.md @@ -4,8 +4,9 @@ sidebar_position: 59995 --- ### HarperDB 4.0.4, Tucker Release + 01/27/2023 **Bug Fixes** -* CORE-2009 Fixed bug where add node was not being called when upgrading clustering. \ No newline at end of file +- CORE-2009 Fixed bug where add node was not being called when upgrading clustering. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.5.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.5.md index dc66721f..1696d6d4 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.5.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.5.md @@ -4,11 +4,11 @@ sidebar_position: 59994 --- ### HarperDB 4.0.5, Tucker Release + 02/15/2023 **Bug Fixes** -* CORE-2029 Improved the upgrade process for handling existing user TLS certificates and correctly configuring TLS settings. Added a prompt to upgrade to determine if new certificates should be created or existing certificates should be kept/used. -* Fix the way NATS connections are honored in a local environment. -* Do not define the certificate authority path to NATS if it is not defined in the HarperDB config. - +- CORE-2029 Improved the upgrade process for handling existing user TLS certificates and correctly configuring TLS settings. Added a prompt to upgrade to determine if new certificates should be created or existing certificates should be kept/used. +- Fix the way NATS connections are honored in a local environment. +- Do not define the certificate authority path to NATS if it is not defined in the HarperDB config. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.6.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.6.md index bf97d148..1cdc1bd7 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.6.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.6.md @@ -4,8 +4,9 @@ sidebar_position: 59993 --- ### HarperDB 4.0.6, Tucker Release + 03/09/2023 **Bug Fixes** -* Fixed a data serialization error that occurs when a large number of different record structures are persisted in a single table. +- Fixed a data serialization error that occurs when a large number of different record structures are persisted in a single table. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.7.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.7.md index 7d48666a..c4d1fbbf 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.7.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.0.7.md @@ -4,8 +4,9 @@ sidebar_position: 59992 --- ### HarperDB 4.0.7, Tucker Release + 03/10/2023 **Bug Fixes** -* Update lmdb.js dependency \ No newline at end of file +- Update lmdb.js dependency diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.1.0.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.1.0.md index 16b6aa3a..d8b1d8b4 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.1.0.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.1.0.md @@ -25,39 +25,39 @@ Updates to S3 import and export mean that these operations now require the bucke Due to the AWS SDK v2 reaching end of life support we have updated to v3. This has caused some breaking changes in our operations `import_from_s3` and `export_to_s3`: -* A new attribute `region` will need to be supplied -* The `bucket` attribute can no longer have trailing slashes. Slashes will now need to be in the `key`. +- A new attribute `region` will need to be supplied +- The `bucket` attribute can no longer have trailing slashes. Slashes will now need to be in the `key`. Starting HarperDB without any command (just `harperdb`) now runs HarperDB like a standard process, in the foreground. This means you can use standard unix tooling for interacting with the process and is conducive for running HarperDB with systemd or any other process management tool. If you wish to have HarperDB launch itself in separate background process (and immediately terminate the shell process), you can do so by running `harperdb start`. Internal Tickets completed: -* CORE-609 - Ensure that attribute names are always added to global schema as Strings -* CORE-1549 - Remove fastify-static code from Custom Functions server which auto serves content from "static" folder -* CORE-1655 - Iterator based queries -* CORE-1764 - Fix issue where describe\_all operation returns an empty object for non super-users if schema(s) do not yet have table(s) -* CORE-1854 - Switch to using worker threads instead of processes for handling concurrency -* CORE-1877 - Extend the csv\_url\_load operation to allow for additional headers to be passed to the remote server when the csv is being downloaded -* CORE-1893 - Add last updated timestamp to describe operations -* CORE-1896 - Fix issue where Select \* from system.hdb\_info returns wrong HDB version number after Instance Upgrade -* CORE-1904 - Fix issue when executing GEOJSON query in SQL -* CORE-1905 - Add HarperDB YAML configuration setting which defines the storage location of NATS streams -* CORE-1906 - Add HarperDB YAML configuration setting defining the storage location of tables. -* CORE-1655 - Streaming binary format serialization -* CORE-1943 - Add configuration option to set mount point for audit tables -* CORE-1921 - Update NATS transaction lifecycle to handle message deduplication in work queue streams. -* CORE-1963 - Update logging for better readability, reduced duplication, and request context information. -* CORE-1968 - In server\nats\natsIngestService.js remove the js\_msg.working(); line to improve performance. -* CORE-1976 - Fix error when calling describe\_table operation with no schema or table defined in payload. -* CORE-1983 - Fix issue where create\_attribute operation does not validate request for required attributes -* CORE-2015 - Remove PM2 logs that get logged in console when starting HDB -* CORE-2048 - systemd script for 4.1 -* CORE-2052 - Include thread information in system\_information for visibility of threads -* CORE-2061 - Add a better error msg when clustering is enabled without a cluster user set -* CORE-2068 - Create new log rotate logic since pm2 log-rotate no longer used -* CORE-2072 - Update to Node 18.15.0 -* CORE-2090 - Upgrade Testing from v4.0.x and v3.x to v4.1. -* CORE-2091 - Run the performance tests -* CORE-2092 - Allow for automatic patch version updates of certain packages -* CORE-2109 - Add verify option to clustering TLS configuration -* CORE-2111 - Update AWS SDK to v3 +- CORE-609 - Ensure that attribute names are always added to global schema as Strings +- CORE-1549 - Remove fastify-static code from Custom Functions server which auto serves content from "static" folder +- CORE-1655 - Iterator based queries +- CORE-1764 - Fix issue where describe_all operation returns an empty object for non super-users if schema(s) do not yet have table(s) +- CORE-1854 - Switch to using worker threads instead of processes for handling concurrency +- CORE-1877 - Extend the csv_url_load operation to allow for additional headers to be passed to the remote server when the csv is being downloaded +- CORE-1893 - Add last updated timestamp to describe operations +- CORE-1896 - Fix issue where Select \* from system.hdb_info returns wrong HDB version number after Instance Upgrade +- CORE-1904 - Fix issue when executing GEOJSON query in SQL +- CORE-1905 - Add HarperDB YAML configuration setting which defines the storage location of NATS streams +- CORE-1906 - Add HarperDB YAML configuration setting defining the storage location of tables. +- CORE-1655 - Streaming binary format serialization +- CORE-1943 - Add configuration option to set mount point for audit tables +- CORE-1921 - Update NATS transaction lifecycle to handle message deduplication in work queue streams. +- CORE-1963 - Update logging for better readability, reduced duplication, and request context information. +- CORE-1968 - In server\nats\natsIngestService.js remove the js_msg.working(); line to improve performance. +- CORE-1976 - Fix error when calling describe_table operation with no schema or table defined in payload. +- CORE-1983 - Fix issue where create_attribute operation does not validate request for required attributes +- CORE-2015 - Remove PM2 logs that get logged in console when starting HDB +- CORE-2048 - systemd script for 4.1 +- CORE-2052 - Include thread information in system_information for visibility of threads +- CORE-2061 - Add a better error msg when clustering is enabled without a cluster user set +- CORE-2068 - Create new log rotate logic since pm2 log-rotate no longer used +- CORE-2072 - Update to Node 18.15.0 +- CORE-2090 - Upgrade Testing from v4.0.x and v3.x to v4.1. +- CORE-2091 - Run the performance tests +- CORE-2092 - Allow for automatic patch version updates of certain packages +- CORE-2109 - Add verify option to clustering TLS configuration +- CORE-2111 - Update AWS SDK to v3 diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.1.1.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.1.1.md index 537ef71c..54163b63 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.1.1.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.1.1.md @@ -7,9 +7,9 @@ sidebar_position: 59898 06/16/2023 -* HarperDB uses improved logic for determining default heap limits and thread counts. When running in a restricted container and on NodeJS 18.15+, HarperDB will use the constrained memory limit to determine heap limits for each thread. In more memory constrained servers with many CPU cores, a reduced default thread count will be used to ensure that excessive memory is not used by many workers. You may still define your own thread count (with `http`/`threads`) in the [configuration](../../../deployments/configuration). -* An option has been added for [disabling the republishing NATS messages](../../../deployments/configuration), which can provide improved replication performance in a fully connected network. -* Improvements to our OpenShift container. -* Dependency security updates. -* **Bug Fixes** -* Fixed a bug in reporting database metrics in the `system_information` operation. +- HarperDB uses improved logic for determining default heap limits and thread counts. When running in a restricted container and on NodeJS 18.15+, HarperDB will use the constrained memory limit to determine heap limits for each thread. In more memory constrained servers with many CPU cores, a reduced default thread count will be used to ensure that excessive memory is not used by many workers. You may still define your own thread count (with `http`/`threads`) in the [configuration](../../../deployments/configuration). +- An option has been added for [disabling the republishing NATS messages](../../../deployments/configuration), which can provide improved replication performance in a fully connected network. +- Improvements to our OpenShift container. +- Dependency security updates. +- **Bug Fixes** +- Fixed a bug in reporting database metrics in the `system_information` operation. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.1.2.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.1.2.md index 2a62db64..fc5e16f4 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.1.2.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.1.2.md @@ -4,10 +4,10 @@ sidebar_position: 59897 --- ### HarperDB 4.1.2, Tucker Release -06/16/2023 -* HarperDB has updated binary dependencies to support older glibc versions back 2.17. -* A new CLI command was added to get the current status of whether HarperDB is running and the cluster status. This is available with `harperdb status`. -* Improvements to our OpenShift container. -* Dependency security updates. +06/16/2023 +- HarperDB has updated binary dependencies to support older glibc versions back 2.17. +- A new CLI command was added to get the current status of whether HarperDB is running and the cluster status. This is available with `harperdb status`. +- Improvements to our OpenShift container. +- Dependency security updates. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.0.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.0.md index 55bfe220..265ad57d 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.0.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.0.md @@ -65,24 +65,24 @@ There have been significant changes to `harperdb-config.yaml`, however none of t `harperdb-config.yaml` has had some configuration values added, removed, renamed and defaults changed. Please refer to [harperdb-config.yaml](../../../deployments/configuration) for the most current configuration parameters. -* The `http` element has been expanded. - * `compressionThreshold` was added. - * All `customFunction` configuration now lives here, except for the `tls` section. -* `threads` has moved out of the `http` element and now is its own top level element. -* `authentication` section was moved out of the `operationsApi` section and is now its own top level element/section. -* `analytics.aggregatePeriod` was added. -* Default logging level was changed to `warn`. -* Default clustering log level was changed to `info`. -* `clustering.republishMessages` now defaults to `false`. -* `operationsApi.foreground` was removed. To start HarperDB in the foreground, from the CLI run `harperdb`. -* Made `operationsApi` configuration optional. Any config not defined here will default to the `http` section. -* Added a `securePort` parameter to `operationsApi` and `http` used for setting the https port. -* Added a new top level `tls` section. -* Removed `customFunctions.enabled`, `customFunctions.network.https`, `operationsApi.network.https` and `operationsApi.nodeEnv`. -* Added an element called `componentRoot` which replaces `customFunctions.root`. -* Updated custom pathing to use `databases` instead of `schemas`. -* Added `logging.auditAuthEvents.logFailed` and `logging.auditAuthEvents.logSuccessful` for enabling logging of auth events. -* A new `mqtt` section was added. +- The `http` element has been expanded. + - `compressionThreshold` was added. + - All `customFunction` configuration now lives here, except for the `tls` section. +- `threads` has moved out of the `http` element and now is its own top level element. +- `authentication` section was moved out of the `operationsApi` section and is now its own top level element/section. +- `analytics.aggregatePeriod` was added. +- Default logging level was changed to `warn`. +- Default clustering log level was changed to `info`. +- `clustering.republishMessages` now defaults to `false`. +- `operationsApi.foreground` was removed. To start HarperDB in the foreground, from the CLI run `harperdb`. +- Made `operationsApi` configuration optional. Any config not defined here will default to the `http` section. +- Added a `securePort` parameter to `operationsApi` and `http` used for setting the https port. +- Added a new top level `tls` section. +- Removed `customFunctions.enabled`, `customFunctions.network.https`, `operationsApi.network.https` and `operationsApi.nodeEnv`. +- Added an element called `componentRoot` which replaces `customFunctions.root`. +- Updated custom pathing to use `databases` instead of `schemas`. +- Added `logging.auditAuthEvents.logFailed` and `logging.auditAuthEvents.logSuccessful` for enabling logging of auth events. +- A new `mqtt` section was added. ### Socket Management diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.1.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.1.md index 38617ca9..c792a637 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.1.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.1.md @@ -4,10 +4,11 @@ sidebar_position: 59798 --- ### HarperDB 4.2.1, Tucker Release + 11/3/2023 -* Downgrade NATS 2.10.3 back to 2.10.1 due to regression in connection handling. -* Handle package names with underscores. -* Improved validation of queries and comparators -* Avoid double replication on transactions with multiple commits -* Added file metadata on get_component_file +- Downgrade NATS 2.10.3 back to 2.10.1 due to regression in connection handling. +- Handle package names with underscores. +- Improved validation of queries and comparators +- Avoid double replication on transactions with multiple commits +- Added file metadata on get_component_file diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.2.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.2.md index 15768374..9cfa957e 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.2.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.2.md @@ -4,12 +4,13 @@ sidebar_position: 59797 --- ### HarperDB 4.2.2, Tucker Release + 11/8/2023 -* Increase timeouts for NATS connections. -* Fix for database snapshots for backups (and for clone node). -* Fix application of permissions for default tables exposed through REST. -* Log replication failures with record information. -* Fix application of authorization/permissions for MQTT commands. -* Fix copying of local components in clone node. -* Fix calculation of overlapping start time in clone node. \ No newline at end of file +- Increase timeouts for NATS connections. +- Fix for database snapshots for backups (and for clone node). +- Fix application of permissions for default tables exposed through REST. +- Log replication failures with record information. +- Fix application of authorization/permissions for MQTT commands. +- Fix copying of local components in clone node. +- Fix calculation of overlapping start time in clone node. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.3.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.3.md index dab25c3d..edecd686 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.3.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.3.md @@ -4,10 +4,11 @@ sidebar_position: 59796 --- ### HarperDB 4.2.3, Tucker Release + 11/15/2023 -* When setting setting securePort, disable unsecure port setting on same port -* Fix `harperdb status` when pid file is missing -* Fix/include missing icons/fonts from local studio -* Fix crash that can occur when concurrently accessing records > 16KB -* Apply a lower heap limit to better ensure that memory leaks are quickly caught/mitigated \ No newline at end of file +- When setting setting securePort, disable unsecure port setting on same port +- Fix `harperdb status` when pid file is missing +- Fix/include missing icons/fonts from local studio +- Fix crash that can occur when concurrently accessing records > 16KB +- Apply a lower heap limit to better ensure that memory leaks are quickly caught/mitigated diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.4.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.4.md index 87ee241d..14d268b5 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.4.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.4.md @@ -4,7 +4,8 @@ sidebar_position: 59795 --- ### HarperDB 4.2.4, Tucker Release + 11/16/2023 -* Prevent coercion of strings to numbers in SQL queries (in WHERE clause) -* Address fastify deprecation warning about accessing config \ No newline at end of file +- Prevent coercion of strings to numbers in SQL queries (in WHERE clause) +- Address fastify deprecation warning about accessing config diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.5.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.5.md index 1172c4b3..1b6bf143 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.5.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.5.md @@ -4,9 +4,10 @@ sidebar_position: 59794 --- ### HarperDB 4.2.5, Tucker Release + 11/22/2023 -* Disable compression on server-sent events to ensure messages are immediately sent (not queued for later deliver) -* Update geoNear function to tolerate null values -* lmdb-js fix to ensure prefetched keys are pinned in memory until retrieved -* Add header to indicate start of a new authenticated session (for studio to identify authenticated sessions) +- Disable compression on server-sent events to ensure messages are immediately sent (not queued for later deliver) +- Update geoNear function to tolerate null values +- lmdb-js fix to ensure prefetched keys are pinned in memory until retrieved +- Add header to indicate start of a new authenticated session (for studio to identify authenticated sessions) diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.6.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.6.md index d0a1f177..50abde53 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.6.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.6.md @@ -4,7 +4,8 @@ sidebar_position: 59793 --- ### HarperDB 4.2.6, Tucker Release + 11/29/2023 -* Update various geo SQL functions to tolerate invalid values -* Properly report component installation/load errors in `get_components` (for studio to load components after an installation failure) \ No newline at end of file +- Update various geo SQL functions to tolerate invalid values +- Properly report component installation/load errors in `get_components` (for studio to load components after an installation failure) diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.7.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.7.md index 78bfcaa7..5d75e134 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.7.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.7.md @@ -4,8 +4,9 @@ sidebar_position: 59792 --- ### HarperDB 4.2.7 + 12/6/2023 -* Add support for cloning over the top of an existing HarperDB instance -* Add health checks for NATS consumer with ability to restart consumer loops for better resiliency -* Revert Fastify autoload module due to a regression that had caused EcmaScript modules for Fastify route modules to fail to load on Windows \ No newline at end of file +- Add support for cloning over the top of an existing HarperDB instance +- Add health checks for NATS consumer with ability to restart consumer loops for better resiliency +- Revert Fastify autoload module due to a regression that had caused EcmaScript modules for Fastify route modules to fail to load on Windows diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.8.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.8.md index fbe94b69..21127797 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.8.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.2.8.md @@ -4,11 +4,12 @@ sidebar_position: 59791 --- ### HarperDB 4.2.8 + 12/19/2023 -* Added support CLI command line arguments for clone node -* Added support for cloning a node without enabling clustering -* Clear NATS client cache on closed event -* Fix check for attribute permissions so that an empty attribute permissions array is treated as a table level permission definition -* Improve speed of cross-node health checks -* Fix for using `database` in describe operations +- Added support CLI command line arguments for clone node +- Added support for cloning a node without enabling clustering +- Clear NATS client cache on closed event +- Fix check for attribute permissions so that an empty attribute permissions array is treated as a table level permission definition +- Improve speed of cross-node health checks +- Fix for using `database` in describe operations diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.0.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.0.md index 13adfa8e..6b8db941 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.0.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.0.md @@ -20,7 +20,7 @@ type Product @table { # foreign key used to reference a brand brandId: ID @indexed # many-to-one relationship to brand - brand: Related @relation(from: "brandId") + brand: Related @relation(from: "brandId") } type Brand @table { id: ID @primaryKey diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.1.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.1.md index e583d175..870968bd 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.1.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.1.md @@ -4,8 +4,9 @@ sidebar_position: 59698 --- ### HarperDB 4.3.1 + 3/25/2024 -* Fix Fastify warning about responseTime usage -* Add access to the MQTT topic in the context -* Fix for ensuring local NATS streams are created +- Fix Fastify warning about responseTime usage +- Add access to the MQTT topic in the context +- Fix for ensuring local NATS streams are created diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.10.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.10.md index bd286e90..7badf0cc 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.10.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.10.md @@ -4,9 +4,10 @@ sidebar_position: 59689 --- ### HarperDB 4.3.10 + 5/5/2024 -* Provide a `data` property on the request/context with deserialized data from the request body for any request including methods that don't typically have a request body -* Ensure that CRDTs are not double applied after committing a transaction -* Delete MQTT will after publishing even if it fails to publish -* Improve transaction retry logic to use async non-optimistic transactions after multiple retries \ No newline at end of file +- Provide a `data` property on the request/context with deserialized data from the request body for any request including methods that don't typically have a request body +- Ensure that CRDTs are not double applied after committing a transaction +- Delete MQTT will after publishing even if it fails to publish +- Improve transaction retry logic to use async non-optimistic transactions after multiple retries diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.11.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.11.md index df2cc2fb..82b47381 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.11.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.11.md @@ -4,7 +4,8 @@ sidebar_position: 59688 --- ### HarperDB 4.3.11 + 5/15/2024 -* Add support for multiple certificates with SNI-based selection of certificates for HTTPS/TLS -* Fix warning in Node v22 \ No newline at end of file +- Add support for multiple certificates with SNI-based selection of certificates for HTTPS/TLS +- Fix warning in Node v22 diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.12.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.12.md index c4344da9..3f016e25 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.12.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.12.md @@ -4,7 +4,8 @@ sidebar_position: 59687 --- ### HarperDB 4.3.12 + 5/16/2024 -* Fix for handling ciphers in multiple certificates -* Allow each certificate config to have multiple hostnames \ No newline at end of file +- Fix for handling ciphers in multiple certificates +- Allow each certificate config to have multiple hostnames diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.13.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.13.md index 7152f231..e7833e0a 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.13.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.13.md @@ -4,8 +4,9 @@ sidebar_position: 59686 --- ### HarperDB 4.3.13 + 5/22/2024 -* Fix for handling HTTPS/TLS with IP address targets (no hostname) where SNI is not available -* Fix for memory leak when a node is down and consumers are trying to reconnect -* Faster cross-thread notification mechanism for transaction events \ No newline at end of file +- Fix for handling HTTPS/TLS with IP address targets (no hostname) where SNI is not available +- Fix for memory leak when a node is down and consumers are trying to reconnect +- Faster cross-thread notification mechanism for transaction events diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.14.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.14.md index 8374b138..0bf4e9c8 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.14.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.14.md @@ -4,6 +4,7 @@ sidebar_position: 59685 --- ### HarperDB 4.3.14 + 5/24/2024 -* Fix application of ciphers to multi-certificate TLS configuration \ No newline at end of file +- Fix application of ciphers to multi-certificate TLS configuration diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.15.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.15.md index 5bbb2304..48321fb6 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.15.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.15.md @@ -4,7 +4,8 @@ sidebar_position: 59684 --- ### HarperDB 4.3.15 + 5/29/2024 -* Add support for wildcards in hostnames for SNI -* Properly apply ciphers settings on multiple TLS configurations \ No newline at end of file +- Add support for wildcards in hostnames for SNI +- Properly apply ciphers settings on multiple TLS configurations diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.16.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.16.md index b3b198d8..195e27b7 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.16.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.16.md @@ -4,7 +4,8 @@ sidebar_position: 59683 --- ### HarperDB 4.3.16 + 6/3/2024 -* Properly shim legacy TLS configuration with new multi-certificate support -* Show the changed filenames when an application is reloaded \ No newline at end of file +- Properly shim legacy TLS configuration with new multi-certificate support +- Show the changed filenames when an application is reloaded diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.17.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.17.md index 6cebb30b..27a0f4cb 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.17.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.17.md @@ -4,11 +4,12 @@ sidebar_position: 59682 --- ### HarperDB 4.3.17 + 6/13/2024 -* Add MQTT analytics of incoming messages and separate by QoS level -* Ensure that any installed `harperdb` package in components is relinked to running harperdb. -* Upgrade storage to more efficiently avoid storage increases -* Fix to improve database metrics in system_information -* Fix for pathing on Windows with extension modules -* Add ability to define a range of listening threads \ No newline at end of file +- Add MQTT analytics of incoming messages and separate by QoS level +- Ensure that any installed `harperdb` package in components is relinked to running harperdb. +- Upgrade storage to more efficiently avoid storage increases +- Fix to improve database metrics in system_information +- Fix for pathing on Windows with extension modules +- Add ability to define a range of listening threads diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.18.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.18.md index 7de1ca2d..052b3821 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.18.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.18.md @@ -4,6 +4,7 @@ sidebar_position: 59681 --- ### HarperDB 4.3.18 + 6/18/2024 -* Immediately terminate an MQTT connection when there is a keep-alive timeout. \ No newline at end of file +- Immediately terminate an MQTT connection when there is a keep-alive timeout. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.19.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.19.md index ed2782da..2676c9f6 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.19.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.19.md @@ -4,8 +4,9 @@ sidebar_position: 59680 --- ### HarperDB 4.3.19 + 7/2/2024 -* Properly return records for the existing value for subscriptions used for retained messages, so they are correctly serialized. -* Ensure that deploy components empty the target directory for a clean installation and expansion of a `package` sub-directory. -* Ensure that we do not double load components that are referenced by symlink from node_modules and in components directory. \ No newline at end of file +- Properly return records for the existing value for subscriptions used for retained messages, so they are correctly serialized. +- Ensure that deploy components empty the target directory for a clean installation and expansion of a `package` sub-directory. +- Ensure that we do not double load components that are referenced by symlink from node_modules and in components directory. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.2.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.2.md index 7a967e98..ca273c5e 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.2.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.2.md @@ -4,12 +4,13 @@ sidebar_position: 59697 --- ### HarperDB 4.3.2 + 3/29/2024 -* Clone node updates to individually clone missing parts -* Fixes for publishing OpenShift container -* Increase purge stream timeout -* Fixed declaration of analytics schema so queries work before a restart -* Fix for iterating queries when deleted records exist -* LMDB stability upgrade -* Fix for cleanup of last will in MQTT \ No newline at end of file +- Clone node updates to individually clone missing parts +- Fixes for publishing OpenShift container +- Increase purge stream timeout +- Fixed declaration of analytics schema so queries work before a restart +- Fix for iterating queries when deleted records exist +- LMDB stability upgrade +- Fix for cleanup of last will in MQTT diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.20.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.20.md index 68a18912..d090990b 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.20.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.20.md @@ -4,14 +4,15 @@ sidebar_position: 59679 --- ### HarperDB 4.3.20 + 7/11/2024 -* The restart_service operation is now executed as a job, making it possible to track the progress of a restart (which is performed as a rolling restart of threads) -* Disable Nagle's algorithm for TCP connections to improve performance -* Append Server-Timing header if a fastify route has already added one -* Avoid symlinking the harperdb directory to itself -* Fix for deleting an empty database -* Upgrade ws and pm2 packages for security vulnerabilities -* Improved TypeScript definitions for Resource and Context. -* The context of a source can set `noCacheStore` to avoid caching the results of a retrieval from source -* Better error reporting of MQTT parsing errors and termination of connections for compliance +- The restart_service operation is now executed as a job, making it possible to track the progress of a restart (which is performed as a rolling restart of threads) +- Disable Nagle's algorithm for TCP connections to improve performance +- Append Server-Timing header if a fastify route has already added one +- Avoid symlinking the harperdb directory to itself +- Fix for deleting an empty database +- Upgrade ws and pm2 packages for security vulnerabilities +- Improved TypeScript definitions for Resource and Context. +- The context of a source can set `noCacheStore` to avoid caching the results of a retrieval from source +- Better error reporting of MQTT parsing errors and termination of connections for compliance diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.21.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.21.md index b8c22de5..7afefd12 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.21.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.21.md @@ -4,10 +4,11 @@ sidebar_position: 59678 --- ### HarperDB 4.3.21 + 8/21/2024 -* Fixed an issue with iterating/serializing query results with a `limit`. -* Fixed an issue that was preventing the caching of structured records in memory. -* Fixed and added several TypeScript exported types including `tables`, `databases`, `Query`, and `Context`. -* Fixed logging warnings about license limits after a license is updated. -* Don't register a certificate as the default certificate for non-SNI connections unless it lists an IP address in the SAN field. \ No newline at end of file +- Fixed an issue with iterating/serializing query results with a `limit`. +- Fixed an issue that was preventing the caching of structured records in memory. +- Fixed and added several TypeScript exported types including `tables`, `databases`, `Query`, and `Context`. +- Fixed logging warnings about license limits after a license is updated. +- Don't register a certificate as the default certificate for non-SNI connections unless it lists an IP address in the SAN field. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.22.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.22.md index 92f1da33..a4bc2003 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.22.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.22.md @@ -4,11 +4,12 @@ sidebar_position: 59677 --- ### HarperDB 4.3.22 + 9/6/2024 -* Adding improved back-pressure handling for large subscriptions and backlogs with durable MQTT sessions -* Allow .extension in URL paths to indicate both preferred encoding and decoding -* Added support for multi-part ids in query parameters -* Limit describe calls by time before using statistical sampling -* Proper cleanup of a transaction when it is aborted due to running out of available read transactions -* Updates to release/builds \ No newline at end of file +- Adding improved back-pressure handling for large subscriptions and backlogs with durable MQTT sessions +- Allow .extension in URL paths to indicate both preferred encoding and decoding +- Added support for multi-part ids in query parameters +- Limit describe calls by time before using statistical sampling +- Proper cleanup of a transaction when it is aborted due to running out of available read transactions +- Updates to release/builds diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.23.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.23.md index 8dd47c25..7496c1d1 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.23.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.23.md @@ -4,8 +4,9 @@ sidebar_position: 59676 --- ### HarperDB 4.3.23 + 9/12/2024 -* Avoid long-running read transactions on subscription catch-ups -* Reverted change to setting default certificate for IP address only -* Better handling of last-will messages on startup \ No newline at end of file +- Avoid long-running read transactions on subscription catch-ups +- Reverted change to setting default certificate for IP address only +- Better handling of last-will messages on startup diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.24.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.24.md index ef4933ea..435c15ec 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.24.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.24.md @@ -4,6 +4,7 @@ sidebar_position: 59675 --- ### HarperDB 4.3.24 + 9/12/2024 -* Fix for querying for large strings (over 255 characters) \ No newline at end of file +- Fix for querying for large strings (over 255 characters) diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.25.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.25.md index 387a2588..601d9ec0 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.25.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.25.md @@ -4,9 +4,10 @@ sidebar_position: 59674 --- ### HarperDB 4.3.25 + 9/24/2024 -* Add analytics for replication latency -* Fix iteration issue over asynchronous joined queries -* Local studio fix for loading applications in insecure context (HTTP) -* Local studio fix for loading configuration tab \ No newline at end of file +- Add analytics for replication latency +- Fix iteration issue over asynchronous joined queries +- Local studio fix for loading applications in insecure context (HTTP) +- Local studio fix for loading configuration tab diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.26.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.26.md index d910120c..c0dacf54 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.26.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.26.md @@ -4,7 +4,8 @@ sidebar_position: 59673 --- ### HarperDB 4.3.26 + 9/27/2024 -* Fixed a security issue that allowed users to bypass access controls with the operations API -* Previously expiration handling was limited to tables with a source, but now it can be applied to any table \ No newline at end of file +- Fixed a security issue that allowed users to bypass access controls with the operations API +- Previously expiration handling was limited to tables with a source, but now it can be applied to any table diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.27.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.27.md index ca8352d3..0bbd448a 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.27.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.27.md @@ -4,10 +4,11 @@ sidebar_position: 59672 --- ### HarperDB 4.3.27 + 10/2/2024 -* Fixed handling HTTP upgrade with Connection header that does not use Upgrade as the sole value (for Firefox) -* Added metrics for requests by status code -* Properly remove attributes from the stored metadata when removed from GraphQL schema -* Fixed a regression in clustering retrieval of schema description -* Fix attribute validation/handling to ensure that sequential ids can be assigned with insert/upsert operations \ No newline at end of file +- Fixed handling HTTP upgrade with Connection header that does not use Upgrade as the sole value (for Firefox) +- Added metrics for requests by status code +- Properly remove attributes from the stored metadata when removed from GraphQL schema +- Fixed a regression in clustering retrieval of schema description +- Fix attribute validation/handling to ensure that sequential ids can be assigned with insert/upsert operations diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.28.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.28.md index fdba3828..361d416d 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.28.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.28.md @@ -4,8 +4,9 @@ sidebar_position: 59671 --- ### HarperDB 4.3.28 + 10/3/2024 -* Tolerate user with no role when building NATS config -* Change metrics for requests by status code to be prefixed with "response_" -* Log error `cause`, and other properties, when available. +- Tolerate user with no role when building NATS config +- Change metrics for requests by status code to be prefixed with "response\_" +- Log error `cause`, and other properties, when available. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.29.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.29.md index c1f533fd..5537df8b 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.29.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.29.md @@ -4,13 +4,14 @@ sidebar_position: 59670 --- ### HarperDB 4.3.29 + 10/7/2024 -* Avoid unnecessary cookie session creation without explicit login -* Added support for caching directives in operations API -* Fixed issue with creating metadata for table with no primary key -* Local studio upgrade: - * Added support for "cache only" mode to view table data without origin resolution - * Added partial support for cookie-based authentication - * Added support for browsing tables with no primary key - * Improved performance for sorting tables +- Avoid unnecessary cookie session creation without explicit login +- Added support for caching directives in operations API +- Fixed issue with creating metadata for table with no primary key +- Local studio upgrade: + - Added support for "cache only" mode to view table data without origin resolution + - Added partial support for cookie-based authentication + - Added support for browsing tables with no primary key + - Improved performance for sorting tables diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.3.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.3.md index 52d7ebde..38175dda 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.3.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.3.md @@ -4,6 +4,7 @@ sidebar_position: 59696 --- ### HarperDB 4.3.3 + 4/01/2024 -* Improve MQTT logging by properly logging auth failures, logging disconnections +- Improve MQTT logging by properly logging auth failures, logging disconnections diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.30.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.30.md index 70c10852..e005db97 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.30.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.30.md @@ -4,6 +4,7 @@ sidebar_position: 59669 --- ### HarperDB 4.3.30 + 10/9/2024 -* Properly assign transaction timestamp to writes from cache resolutions (ensuring that latencies can be calculated on replicating nodes) +- Properly assign transaction timestamp to writes from cache resolutions (ensuring that latencies can be calculated on replicating nodes) diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.31.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.31.md index 097726ac..80cab2b9 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.31.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.31.md @@ -4,8 +4,9 @@ sidebar_position: 59668 --- ### HarperDB 4.3.31 + 10/10/2024 -* Reset the restart limit for manual restarts to ensure that NATS process will continue to restart after more than 10 manual restarts -* Only apply caching directives (from headers) to tables/resources that are configured to be caching, sourced from another resource -* Catch/tolerate errors on serializing objects for logging +- Reset the restart limit for manual restarts to ensure that NATS process will continue to restart after more than 10 manual restarts +- Only apply caching directives (from headers) to tables/resources that are configured to be caching, sourced from another resource +- Catch/tolerate errors on serializing objects for logging diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.32.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.32.md index ee5da648..0b5893b4 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.32.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.32.md @@ -4,8 +4,9 @@ sidebar_position: 59667 --- ### HarperDB 4.3.32 + 10/16/2024 -* Fix a memory leak when cluster_network closes a hub connection -* Improved MQTT error handling, with less verbose logging of more common errors, and treat a missing subscription as an invalid/missing topic -* Record analytics and server-timing header even when cache resolution fails +- Fix a memory leak when cluster_network closes a hub connection +- Improved MQTT error handling, with less verbose logging of more common errors, and treat a missing subscription as an invalid/missing topic +- Record analytics and server-timing header even when cache resolution fails diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.33.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.33.md index 271373ef..7707a562 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.33.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.33.md @@ -4,6 +4,7 @@ sidebar_position: 59666 --- ### HarperDB 4.3.33 + 10/24/2024 -* Change the default maximum length for a fastify route parameter from 100 to 1000 characters. +- Change the default maximum length for a fastify route parameter from 100 to 1000 characters. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.34.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.34.md index 1071c273..2bd65833 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.34.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.34.md @@ -4,6 +4,7 @@ sidebar_position: 59665 --- ### HarperDB 4.3.34 + 10/24/2024 -* lmdb-js upgrade +- lmdb-js upgrade diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.35.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.35.md index 1811732b..f8dd7b73 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.35.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.35.md @@ -4,7 +4,8 @@ sidebar_position: 59664 --- ### HarperDB 4.3.35 + 11/12/2024 -* Upgrades for supporting Node.js V23 -* Fix for handling a change in the schema for nested data structures +- Upgrades for supporting Node.js V23 +- Fix for handling a change in the schema for nested data structures diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.36.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.36.md index b2db5bd7..2eb8e636 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.36.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.36.md @@ -4,6 +4,7 @@ sidebar_position: 59663 --- ### HarperDB 4.3.36 + 11/14/2024 -* lmdb-js upgrade for better free-space management +- lmdb-js upgrade for better free-space management diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.37.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.37.md index 57e23f5d..f36e1c32 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.37.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.37.md @@ -4,6 +4,7 @@ sidebar_position: 59662 --- ### HarperDB 4.3.37 + 12/6/2024 -* lmdb-js upgrade for preventing crashes with shared user buffers +- lmdb-js upgrade for preventing crashes with shared user buffers diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.38.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.38.md index 640f3620..d1fce0f8 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.38.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.38.md @@ -4,6 +4,7 @@ sidebar_position: 59661 --- ### HarperDB 4.3.38 + 1/10/2025 -* Fixes for audit log cleanup +- Fixes for audit log cleanup diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.4.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.4.md index f50f1bb6..0c96732f 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.4.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.4.md @@ -4,7 +4,8 @@ sidebar_position: 59695 --- ### HarperDB 4.3.4 + 4/9/2024 -* Fixed a buffer overrun issue with decompressing compressed data -* Better keep-alive of transactions with long running queries \ No newline at end of file +- Fixed a buffer overrun issue with decompressing compressed data +- Better keep-alive of transactions with long running queries diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.5.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.5.md index 40d030e5..60888785 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.5.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.5.md @@ -4,6 +4,7 @@ sidebar_position: 59694 --- ### HarperDB 4.3.5 + 4/10/2024 -* Fixed a buffer overrun issue with decompressing compressed data \ No newline at end of file +- Fixed a buffer overrun issue with decompressing compressed data diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.6.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.6.md index 92b28286..54a4739a 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.6.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.6.md @@ -4,10 +4,11 @@ sidebar_position: 59693 --- ### HarperDB 4.3.6 + 4/12/2024 -* Fixed parsing of dates from epoch millisecond times in queries -* Fixed CRDT incrementation of different data types -* Adjustments to text/plain content type q-value handling -* Fixed parsing of passwords with a colon -* Added MQTT events for connections, authorization, and disconnections \ No newline at end of file +- Fixed parsing of dates from epoch millisecond times in queries +- Fixed CRDT incrementation of different data types +- Adjustments to text/plain content type q-value handling +- Fixed parsing of passwords with a colon +- Added MQTT events for connections, authorization, and disconnections diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.7.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.7.md index 8f45995a..df9fb331 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.7.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.7.md @@ -4,10 +4,11 @@ sidebar_position: 59692 --- ### HarperDB 4.3.7 + 4/16/2024 -* Fixed transaction handling to stay on open on long compaction operations -* Fixed handling of sorting on non-indexed attributes -* Storage stability improvements -* Fixed authentication/authorization of WebSockets connection and use of cookies -* Fixes for clone node operations \ No newline at end of file +- Fixed transaction handling to stay on open on long compaction operations +- Fixed handling of sorting on non-indexed attributes +- Storage stability improvements +- Fixed authentication/authorization of WebSockets connection and use of cookies +- Fixes for clone node operations diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.8.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.8.md index cd0fe88e..0e4c5b6c 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.8.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.8.md @@ -4,10 +4,11 @@ sidebar_position: 59691 --- ### HarperDB 4.3.8 + 4/26/2024 -* Added support for the MQTT keep-alive feature (disconnecting if no control messages are received within keep-alive window) -* Improved handling of write queue timeouts, with configurability -* Fixed a memory leak that can occur with NATS reconnections after heartbeat misses -* Fixed a bug in clone node with a null port -* Add error events to MQTT events system \ No newline at end of file +- Added support for the MQTT keep-alive feature (disconnecting if no control messages are received within keep-alive window) +- Improved handling of write queue timeouts, with configurability +- Fixed a memory leak that can occur with NATS reconnections after heartbeat misses +- Fixed a bug in clone node with a null port +- Add error events to MQTT events system diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.9.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.9.md index dca6a92f..17c95934 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.9.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.3.9.md @@ -4,6 +4,7 @@ sidebar_position: 59690 --- ### HarperDB 4.3.9 + 4/30/2024 -* lmdb-js upgrade \ No newline at end of file +- lmdb-js upgrade diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.1.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.1.md index 80fac940..5c1e2037 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.1.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.1.md @@ -4,9 +4,10 @@ sidebar_position: 59598 --- ### HarperDB 4.4.1 + 10/17/2024 -* Fix issue where non-RSA keys were not being parsed correctly on startup. -* Fix a memory leak when cluster_network closes a hub connection -* Improved MQTT error handling, with less verbose logging of more common errors, and treat a missing subscription as an invalid/missing topic -* Record analytics and server-timing header even when cache resolution fails \ No newline at end of file +- Fix issue where non-RSA keys were not being parsed correctly on startup. +- Fix a memory leak when cluster_network closes a hub connection +- Improved MQTT error handling, with less verbose logging of more common errors, and treat a missing subscription as an invalid/missing topic +- Record analytics and server-timing header even when cache resolution fails diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.10.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.10.md index 328a694a..6d8aad2c 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.10.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.10.md @@ -4,6 +4,7 @@ sidebar_position: 59589 --- ### HarperDB 4.4.10 + 12/17/2024 -* Fix for deploying packages and detecting node_modules directory \ No newline at end of file +- Fix for deploying packages and detecting node_modules directory diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.11.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.11.md index 6f5d7215..5e5b5fc0 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.11.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.11.md @@ -4,7 +4,8 @@ sidebar_position: 59588 --- ### HarperDB 4.4.11 + 12/18/2024 -* Fix for initial certification creation on upgrade -* Docker build fix \ No newline at end of file +- Fix for initial certification creation on upgrade +- Docker build fix diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.12.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.12.md index 82c09692..8efe840e 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.12.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.12.md @@ -4,7 +4,8 @@ sidebar_position: 59587 --- ### HarperDB 4.4.12 + 12/19/2024 -* Move components installed by reference into hdb/components for consistency and compatibility with next.js -* Use npm install --force to ensure modules are installed \ No newline at end of file +- Move components installed by reference into hdb/components for consistency and compatibility with next.js +- Use npm install --force to ensure modules are installed diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.13.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.13.md index 681fc21d..cab28cc0 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.13.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.13.md @@ -4,12 +4,13 @@ sidebar_position: 59586 --- ### HarperDB 4.4.13 + 1/2/2025 -* Fix for not using requestCert if the port doesn't need replication -* Fix for applying timeouts HTTP server for ancient node versions -* Updates for different replication configuration settings, including sharding and replication using stored credentials -* Mitigation crashing due GC'ed shared array buffers -* Fix for error handling with CLI failures -* Updated dependencies -* Fix for allow securePort to be set on authentication \ No newline at end of file +- Fix for not using requestCert if the port doesn't need replication +- Fix for applying timeouts HTTP server for ancient node versions +- Updates for different replication configuration settings, including sharding and replication using stored credentials +- Mitigation crashing due GC'ed shared array buffers +- Fix for error handling with CLI failures +- Updated dependencies +- Fix for allow securePort to be set on authentication diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.14.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.14.md index 48103afe..b44a173d 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.14.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.14.md @@ -4,9 +4,10 @@ sidebar_position: 59585 --- ### HarperDB 4.4.14 + 1/3/2025 -* Fix for starting HTTP server if headersTimeout is omitted in the configuration -* Fix for avoiding ping timeouts for large/long-duration WS messages between nodes -* Don't report errors for component that only uses a directory -* Add flag for disabling WebSocket on REST component \ No newline at end of file +- Fix for starting HTTP server if headersTimeout is omitted in the configuration +- Fix for avoiding ping timeouts for large/long-duration WS messages between nodes +- Don't report errors for component that only uses a directory +- Add flag for disabling WebSocket on REST component diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.15.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.15.md index ec4ac263..b6a8ee2b 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.15.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.15.md @@ -4,8 +4,9 @@ sidebar_position: 59584 --- ### HarperDB 4.4.15 + 1/8/2025 -* Fix for manage the state of replication sequences for node -* Fix for better concurrency with ongoing replication -* Fix for accessing audit log entries \ No newline at end of file +- Fix for manage the state of replication sequences for node +- Fix for better concurrency with ongoing replication +- Fix for accessing audit log entries diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.16.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.16.md index 3e90a9b1..d85de974 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.16.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.16.md @@ -4,12 +4,13 @@ sidebar_position: 59583 --- ### HarperDB 4.4.16 + 1/22/2025 -* Fix for cleaning up old audit entries and associated deletion entries -* Allow CLI operations to be run when cloning is enabled -* Report table size in describe operations -* Fix for cleaning up symlinks when dropping components -* Fix for enumerating components when symlinks are used -* Add an option for using a specific installation command with deploys -* Add an API for registering an HTTP upgrade listener with `server.upgrade` \ No newline at end of file +- Fix for cleaning up old audit entries and associated deletion entries +- Allow CLI operations to be run when cloning is enabled +- Report table size in describe operations +- Fix for cleaning up symlinks when dropping components +- Fix for enumerating components when symlinks are used +- Add an option for using a specific installation command with deploys +- Add an API for registering an HTTP upgrade listener with `server.upgrade` diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.17.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.17.md index 788b9810..239f7729 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.17.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.17.md @@ -4,9 +4,10 @@ sidebar_position: 59582 --- ### HarperDB 4.4.17 + 1/29/2025 -* Provide statistics on the size of the audit log store -* Fix handling of symlinks to HarperDB package that to avoid NPM's errors in restricted containers -* Add option for rolling/consecutive restarts for deployments -* Fix for enabling root CAs for replication authorization \ No newline at end of file +- Provide statistics on the size of the audit log store +- Fix handling of symlinks to HarperDB package that to avoid NPM's errors in restricted containers +- Add option for rolling/consecutive restarts for deployments +- Fix for enabling root CAs for replication authorization diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.18.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.18.md index cf341732..e7354587 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.18.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.18.md @@ -4,8 +4,9 @@ sidebar_position: 59581 --- ### HarperDB 4.4.18 + 1/29/2025 -* Add option for disabling full table copy in replication -* Add option for startTime in route configuration -* Add/fix option to deploy with package from CLI \ No newline at end of file +- Add option for disabling full table copy in replication +- Add option for startTime in route configuration +- Add/fix option to deploy with package from CLI diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.19.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.19.md index 53d42bb8..5a1cc14e 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.19.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.19.md @@ -4,9 +4,10 @@ sidebar_position: 59580 --- ### HarperDB 4.4.19 + 2/4/2025 -* LMDB upgrade for free-list verification on commit -* Add check to avoid compacting database multiple times with compactOnStart -* Fix handling of denied/absent subscription -* Add support for including symlinked directories in packaging a deployed component \ No newline at end of file +- LMDB upgrade for free-list verification on commit +- Add check to avoid compacting database multiple times with compactOnStart +- Fix handling of denied/absent subscription +- Add support for including symlinked directories in packaging a deployed component diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.2.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.2.md index 6137d48a..53dfbb7b 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.2.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.2.md @@ -4,6 +4,7 @@ sidebar_position: 59597 --- ### HarperDB 4.4.2 + 10/18/2024 -* Republish of 4.4.1 with Git merge correction. \ No newline at end of file +- Republish of 4.4.1 with Git merge correction. diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.20.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.20.md index 845129ca..656de065 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.20.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.20.md @@ -4,6 +4,7 @@ sidebar_position: 59579 --- ### HarperDB 4.4.20 + 2/11/2025 -* LMDB upgrade for improved handling of page boundaries with free-space lists +- LMDB upgrade for improved handling of page boundaries with free-space lists diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.21.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.21.md index 74d653bc..c63d84a2 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.21.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.21.md @@ -4,8 +4,9 @@ sidebar_position: 59578 --- ### HarperDB 4.4.21 + 2/25/2025 -* Fix for saving audit log entries for large keys (> 1KB) -* Security fix for handling missing passwords -* Skip bin links for NPM installation to avoid access issues \ No newline at end of file +- Fix for saving audit log entries for large keys (> 1KB) +- Security fix for handling missing passwords +- Skip bin links for NPM installation to avoid access issues diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.22.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.22.md index 85ae1895..d66163f9 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.22.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.22.md @@ -4,6 +4,7 @@ sidebar_position: 59577 --- ### HarperDB 4.4.22 + 3/5/2025 -* Add new http configuration option `corsAccessControlAllowHeaders` \ No newline at end of file +- Add new http configuration option `corsAccessControlAllowHeaders` diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.23.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.23.md index 42e37e0c..9048b3d6 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.23.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.23.md @@ -4,7 +4,8 @@ sidebar_position: 59576 --- ### HarperDB 4.4.23 + 3/7/2025 -* Fix for subscriptions to children of segmented id -* Fix for better error reporting on NPM failures \ No newline at end of file +- Fix for subscriptions to children of segmented id +- Fix for better error reporting on NPM failures diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.24.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.24.md index dbdf7972..324a2423 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.24.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.24.md @@ -4,7 +4,8 @@ sidebar_position: 59575 --- ### HarperDB 4.4.24 + 3/10/2025 -* Use process.exit(0) to restart when enabled by env var -* Reset the cwd on thread restart \ No newline at end of file +- Use process.exit(0) to restart when enabled by env var +- Reset the cwd on thread restart diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.25.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.25.md index eaf15be1..8420ae5b 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.25.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.25.md @@ -4,6 +4,7 @@ sidebar_position: 59574 --- ### HarperDB 4.4.25 + 4/3/2025 -* Fix for immediately reloading updated certificates and private key files to ensure that certificates properly match the private key +- Fix for immediately reloading updated certificates and private key files to ensure that certificates properly match the private key diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.26.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.26.md index 022c8ef1..b2db0691 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.26.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.26.md @@ -4,8 +4,9 @@ sidebar_position: 59573 --- ### Harper 4.4.26 + 5/12/2025 -* Fix replication of messages with Plexus -* Rebrand HarperDB as Harper -* Add support for enabling heapSnapshotNearLimit via `--heapsnapshot-near-heap-limit` param / `THREADS_HEAPSNAPSHOTNEARLIMIT` env var +- Fix replication of messages with Plexus +- Rebrand HarperDB as Harper +- Add support for enabling heapSnapshotNearLimit via `--heapsnapshot-near-heap-limit` param / `THREADS_HEAPSNAPSHOTNEARLIMIT` env var diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.3.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.3.md index e91428c4..4e844820 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.3.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.3.md @@ -4,10 +4,11 @@ sidebar_position: 59596 --- ### HarperDB 4.4.3 + 10/25/2024 -* Fix for notification of records through classes that override get for multi-tier caching -* Fix for CLI operations -* Support for longer route parameters in Fastify routes -* Fix for accessing `harperdb` package/module from user threads -* Improvements to clone node for cloning without credentials \ No newline at end of file +- Fix for notification of records through classes that override get for multi-tier caching +- Fix for CLI operations +- Support for longer route parameters in Fastify routes +- Fix for accessing `harperdb` package/module from user threads +- Improvements to clone node for cloning without credentials diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.4.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.4.md index 8e6a0c48..bbf0df8d 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.4.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.4.md @@ -4,8 +4,9 @@ sidebar_position: 59595 --- ### HarperDB 4.4.4 + 11/4/2024 -* Re-introduce declarative roles and permissions -* Fix for OpenAPI endpoint -* Fix for exports of `harperdb` package/module \ No newline at end of file +- Re-introduce declarative roles and permissions +- Fix for OpenAPI endpoint +- Fix for exports of `harperdb` package/module diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.5.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.5.md index f075ea02..448687c6 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.5.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.5.md @@ -4,12 +4,13 @@ sidebar_position: 59594 --- ### HarperDB 4.4.5 + 11/15/2024 -* Fix for DOS vulnerability in large headers with cache-control and replication headers -* Fix for handling a change in the schema type for sub-fields in a nested object -* Add support for content type handlers to return iterators -* Fix for session management with custom authentication handler -* Updates for Node.js V23 compatibility -* Fix for sorting on nested properties -* Fix for querying on not_equal to a null with object values \ No newline at end of file +- Fix for DOS vulnerability in large headers with cache-control and replication headers +- Fix for handling a change in the schema type for sub-fields in a nested object +- Add support for content type handlers to return iterators +- Fix for session management with custom authentication handler +- Updates for Node.js V23 compatibility +- Fix for sorting on nested properties +- Fix for querying on not_equal to a null with object values diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.6.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.6.md index 2d4b17b6..4cc0cc86 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.6.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.6.md @@ -4,9 +4,10 @@ sidebar_position: 59593 --- ### HarperDB 4.4.6 + 11/25/2024 -* Fix queries with only sorting applied -* Fix for handling invalidation events propagating through sources -* Expanded CLI support for deploying packages -* Support for deploying large packages \ No newline at end of file +- Fix queries with only sorting applied +- Fix for handling invalidation events propagating through sources +- Expanded CLI support for deploying packages +- Support for deploying large packages diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.7.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.7.md index e1723090..a4f6041f 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.7.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.7.md @@ -4,7 +4,8 @@ sidebar_position: 59592 --- ### HarperDB 4.4.7 + 11/27/2024 -* Allow for package to deploy own modules -* Fix for preventing double sourcing of resources \ No newline at end of file +- Allow for package to deploy own modules +- Fix for preventing double sourcing of resources diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.8.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.8.md index 3bb02964..493736a8 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.8.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.8.md @@ -4,6 +4,7 @@ sidebar_position: 59591 --- ### HarperDB 4.4.8 + 12/2/2024 -* Add multiple node versions of published docker containers \ No newline at end of file +- Add multiple node versions of published docker containers diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.9.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.9.md index fa576ba9..077e80cd 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.9.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/4.4.9.md @@ -4,10 +4,11 @@ sidebar_position: 59590 --- ### HarperDB 4.4.9 + 12/12/2024 -* Change enableRootCAs to default to true -* Fixes for install and clone commands -* Add rejectUnauthorized to the CLI options -* Fixes for cloning -* Install modules in own component when deploying package by payload \ No newline at end of file +- Change enableRootCAs to default to true +- Fixes for install and clone commands +- Add rejectUnauthorized to the CLI options +- Fixes for cloning +- Install modules in own component when deploying package by payload diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/_category_.json b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/_category_.json index 9a7bca50..d20b2f9a 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/_category_.json +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Tucker (Version 4)", - "position": -4 -} \ No newline at end of file + "label": "HarperDB Tucker (Version 4)", + "position": -4 +} diff --git a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/index.md b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/index.md index 67dde9b5..d97c9100 100644 --- a/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/index.md +++ b/site/versioned_docs/version-4.4/technical-details/release-notes/v4-tucker/index.md @@ -8,32 +8,32 @@ HarperDB version 4 ([Tucker release](./tucker)) represents major step forward in ## [4.4](./4.4.0) -* Native replication (codename "Plexus") which is faster, more efficient, secure, and reliable than the previous replication system and provides provisional sharding capabilities with a foundation for the future -* Computed properties that allow applications to define properties that are computed from other properties, allowing for composite properties that are calculated from other data stored in records without requiring actual storage of the computed value -* Custom indexing including composite, full-text indexing, and vector indexing +- Native replication (codename "Plexus") which is faster, more efficient, secure, and reliable than the previous replication system and provides provisional sharding capabilities with a foundation for the future +- Computed properties that allow applications to define properties that are computed from other properties, allowing for composite properties that are calculated from other data stored in records without requiring actual storage of the computed value +- Custom indexing including composite, full-text indexing, and vector indexing ## [4.3](./4.3.0) -* Relationships, joins, and broad new querying capabilities for complex and nested conditions, sorting, joining, and selecting with significant query optimizations -* More advanced transaction support for CRDTs and storage of large integers (with BigInt) -* Better management with new upgraded local studio and new CLI features +- Relationships, joins, and broad new querying capabilities for complex and nested conditions, sorting, joining, and selecting with significant query optimizations +- More advanced transaction support for CRDTs and storage of large integers (with BigInt) +- Better management with new upgraded local studio and new CLI features ## [4.2](./4.2.0) -* New component architecture and Resource API for advanced, robust custom database application development -* Real-time capabilites through MQTT, WebSockets, and Server-Sent Events -* REST interface for intuitive, fast, and standards-compliant HTTP interaction -* Native caching capabilities for high-performance cache scenarios -* Clone node functionality +- New component architecture and Resource API for advanced, robust custom database application development +- Real-time capabilites through MQTT, WebSockets, and Server-Sent Events +- REST interface for intuitive, fast, and standards-compliant HTTP interaction +- Native caching capabilities for high-performance cache scenarios +- Clone node functionality ## [4.1](./4.1.0) -* New streaming iterators mechanism that allows query results to be delivered to clients _while_ querying results are being processed, for incredibly fast time-to-first-byte and concurrent processing/delivery -* New thread-based concurrency model for more efficient resource usage +- New streaming iterators mechanism that allows query results to be delivered to clients _while_ querying results are being processed, for incredibly fast time-to-first-byte and concurrent processing/delivery +- New thread-based concurrency model for more efficient resource usage ## [4.0](./4.0.0) -* New clustering technology that delivers robust, resilient and high-performance replication -* Major storage improvements with highly-efficient adaptive-structure modified MessagePack format, with on-demand deserialization capabilities +- New clustering technology that delivers robust, resilient and high-performance replication +- Major storage improvements with highly-efficient adaptive-structure modified MessagePack format, with on-demand deserialization capabilities Did you know our release names are dedicated to employee pups? For our fourth release, [meet Tucker!](./tucker) diff --git a/site/versioned_docs/version-4.5/administration/_category_.json b/site/versioned_docs/version-4.5/administration/_category_.json index 828e0998..59c33ea4 100644 --- a/site/versioned_docs/version-4.5/administration/_category_.json +++ b/site/versioned_docs/version-4.5/administration/_category_.json @@ -1,12 +1,10 @@ { - "label": "Administration", - "position": 2, - "link": { - "type": "generated-index", - "title": "Administration Documentation", - "description": "Guides for managing and administering HarperDB instances", - "keywords": [ - "administration" - ] - } -} \ No newline at end of file + "label": "Administration", + "position": 2, + "link": { + "type": "generated-index", + "title": "Administration Documentation", + "description": "Guides for managing and administering HarperDB instances", + "keywords": ["administration"] + } +} diff --git a/site/versioned_docs/version-4.5/administration/administration.md b/site/versioned_docs/version-4.5/administration/administration.md index 67407d06..3d6d5ce7 100644 --- a/site/versioned_docs/version-4.5/administration/administration.md +++ b/site/versioned_docs/version-4.5/administration/administration.md @@ -10,9 +10,9 @@ Harper is designed for minimal administrative effort, and with managed services As a distributed database, data protection and recovery can benefit from different data protection strategies than a traditional single-server database. But multiple aspects of data protection and recovery should be considered: -* Availability: As a distributed database Harper is intrinsically built for high-availability and a cluster will continue to run even with complete server(s) failure. This is the first and primary defense for protecting against any downtime or data loss. Harper provides fast horizontal scaling functionality with node cloning, which facilitates ease of establishing high availability clusters. -* [Audit log](./logging/audit-logging): Harper defaults to tracking data changes so malicious data changes can be found, attributed, and reverted. This provides security-level defense against data loss, allowing for fine-grained isolation and reversion of individual data without the large-scale reversion/loss of data associated with point-in-time recovery approaches. -* Snapshots: When used as a source-of-truth database for crucial data, we recommend using snapshot tools to regularly snapshot databases as a final backup/defense against data loss (this should only be used as a last resort in recovery). Harper has a [`get_backup`](../developers/operations-api/databases-and-tables#get-backup) operation, which provides direct support for making and retrieving database snapshots. An HTTP request can be used to get a snapshot. Alternatively, volume snapshot tools can be used to snapshot data at the OS/VM level. Harper can also provide scripts for replaying transaction logs from snapshots to facilitate point-in-time recovery when necessary (often customization may be preferred in certain recovery situations to minimize data loss). +- Availability: As a distributed database Harper is intrinsically built for high-availability and a cluster will continue to run even with complete server(s) failure. This is the first and primary defense for protecting against any downtime or data loss. Harper provides fast horizontal scaling functionality with node cloning, which facilitates ease of establishing high availability clusters. +- [Audit log](./logging/audit-logging): Harper defaults to tracking data changes so malicious data changes can be found, attributed, and reverted. This provides security-level defense against data loss, allowing for fine-grained isolation and reversion of individual data without the large-scale reversion/loss of data associated with point-in-time recovery approaches. +- Snapshots: When used as a source-of-truth database for crucial data, we recommend using snapshot tools to regularly snapshot databases as a final backup/defense against data loss (this should only be used as a last resort in recovery). Harper has a [`get_backup`](../developers/operations-api/databases-and-tables#get-backup) operation, which provides direct support for making and retrieving database snapshots. An HTTP request can be used to get a snapshot. Alternatively, volume snapshot tools can be used to snapshot data at the OS/VM level. Harper can also provide scripts for replaying transaction logs from snapshots to facilitate point-in-time recovery when necessary (often customization may be preferred in certain recovery situations to minimize data loss). ### Horizontal Scaling with Node Cloning @@ -21,10 +21,11 @@ Harper provides rapid horizontal scaling capabilities through [node cloning func ### Monitoring Harper provides robust capabilities for analytics and observability to facilitate effective and informative monitoring: -* Analytics provides statistics on usage, request counts, load, memory usage with historical tracking. The analytics data can be [accessed through querying](../technical-details/reference/analytics). -* A large variety of real-time statistics about load, system information, database metrics, thread usage can be retrieved through the [`system_information` API](../developers/operations-api/utilities). -* Information about the current cluster configuration and status can be found in the [cluster APIs](../developers/operations-api/clustering). -* Analytics and system information can easily be exported to Prometheus with our [Prometheus exporter component](https://github.com/HarperDB-Add-Ons/prometheus_exporter), making it easy visualize and monitor Harper with Graphana. + +- Analytics provides statistics on usage, request counts, load, memory usage with historical tracking. The analytics data can be [accessed through querying](../technical-details/reference/analytics). +- A large variety of real-time statistics about load, system information, database metrics, thread usage can be retrieved through the [`system_information` API](../developers/operations-api/utilities). +- Information about the current cluster configuration and status can be found in the [cluster APIs](../developers/operations-api/clustering). +- Analytics and system information can easily be exported to Prometheus with our [Prometheus exporter component](https://github.com/HarperDB-Add-Ons/prometheus_exporter), making it easy visualize and monitor Harper with Graphana. ### Replication Transaction Logging diff --git a/site/versioned_docs/version-4.5/administration/cloning.md b/site/versioned_docs/version-4.5/administration/cloning.md index 3c599ff1..4669775b 100644 --- a/site/versioned_docs/version-4.5/administration/cloning.md +++ b/site/versioned_docs/version-4.5/administration/cloning.md @@ -4,10 +4,10 @@ title: Clone Node # Clone Node -Clone node is a configurable node script that when pointed to another instance of Harper will create a clone of that -instance's config, databases and setup full replication. If it is run in a location where there is no existing Harper install, +Clone node is a configurable node script that when pointed to another instance of Harper will create a clone of that +instance's config, databases and setup full replication. If it is run in a location where there is no existing Harper install, it will, along with cloning, install Harper. If it is run in a location where there is another Harper instance, it will -only clone config, databases and replication that do not already exist. +only clone config, databases and replication that do not already exist. Clone node is triggered when Harper is installed or started with certain environment or command line (CLI) variables set (see below). @@ -18,34 +18,36 @@ To start clone run `harperdb` in the CLI with either of the following variables #### Environment variables -* `HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). -* `HDB_LEADER_USERNAME` - The leader node admin username. -* `HDB_LEADER_PASSWORD` - The leader node admin password. -* `REPLICATION_HOSTNAME` - _(optional)_ The clones replication hostname. This value will be added to `replication.hostname` on the clone node. If this value is not set, replication will not be set up between the leader and clone. +- `HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). +- `HDB_LEADER_USERNAME` - The leader node admin username. +- `HDB_LEADER_PASSWORD` - The leader node admin password. +- `REPLICATION_HOSTNAME` - _(optional)_ The clones replication hostname. This value will be added to `replication.hostname` on the clone node. If this value is not set, replication will not be set up between the leader and clone. For example: + ``` HDB_LEADER_URL=https://node-1.my-domain.com:9925 REPLICATION_HOSTNAME=node-1.my-domain.com HDB_LEADER_USERNAME=... HDB_LEADER_PASSWORD=... harperdb ``` #### Command line variables -* `--HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). -* `--HDB_LEADER_USERNAME` - The leader node admin username. -* `--HDB_LEADER_PASSWORD` - The leader node admin password. -* `--REPLICATION_HOSTNAME` - _(optional)_ The clones clustering host. This value will be added to `replication.hostname` on the clone node. If this value is not set, replication will not be set up between the leader and clone. +- `--HDB_LEADER_URL` - The URL of the leader node's operation API (usually port 9925). +- `--HDB_LEADER_USERNAME` - The leader node admin username. +- `--HDB_LEADER_PASSWORD` - The leader node admin password. +- `--REPLICATION_HOSTNAME` - _(optional)_ The clones clustering host. This value will be added to `replication.hostname` on the clone node. If this value is not set, replication will not be set up between the leader and clone. For example: + ``` harperdb --HDB_LEADER_URL https://node-1.my-domain.com:9925 --REPLICATION_HOSTNAME node-1.my-domain.com --HDB_LEADER_USERNAME ... --HDB_LEADER_PASSWORD ... ``` -Each time clone is run it will set a value `cloned: true` in `harperdb-config.yaml`. This value will prevent clone from -running again. If you want to run clone again set this value to `false`. If Harper is started with the clone variables +Each time clone is run it will set a value `cloned: true` in `harperdb-config.yaml`. This value will prevent clone from +running again. If you want to run clone again set this value to `false`. If Harper is started with the clone variables still present and `cloned` is true, Harper will just start as normal. -Clone node does not require any additional configuration apart from the variables referenced above. -However, if you wish to set any configuration during clone this can be done by passing the config as environment/CLI +Clone node does not require any additional configuration apart from the variables referenced above. +However, if you wish to set any configuration during clone this can be done by passing the config as environment/CLI variables or cloning overtop of an existing `harperdb-config.yaml` file. More can be found in the Harper config documentation [here](../deployments/configuration). @@ -55,10 +57,10 @@ More can be found in the Harper config documentation [here](../deployments/confi To set any specific (optional) clone config, including the exclusion of any database and/or replication, there is a file called `clone-node-config.yaml` that can be used. -The file must be located in the `ROOTPATH` directory of your clone (the `hdb` directory where you clone will be installed. +The file must be located in the `ROOTPATH` directory of your clone (the `hdb` directory where you clone will be installed. If the directory does not exist, create one and add the file to it). -The config available in `clone-node-config.yaml` is: +The config available in `clone-node-config.yaml` is: ```yaml databaseConfig: @@ -72,27 +74,27 @@ componentConfig: - name: null ``` -_Note: only include the configuration that you are using. If no clone config file is provided nothing will be excluded, +_Note: only include the configuration that you are using. If no clone config file is provided nothing will be excluded, unless it already exists on the clone._ `databaseConfig` - Set any databases or tables that you wish to exclude from cloning. -`componentConfig` - Set any components that you do not want cloned. Clone node will not clone the component code, +`componentConfig` - Set any components that you do not want cloned. Clone node will not clone the component code, it will only clone the component reference that exists in the leader harperdb-config file. ### Cloning configuration -Clone node will not clone any configuration that is classed as unique to the leader node. This includes `replication.hostname`, `replication.url`,`clustering.nodeName`, -`rootPath` and any other path related values, for example `storage.path`, `logging.root`, `componentsRoot`, +Clone node will not clone any configuration that is classed as unique to the leader node. This includes `replication.hostname`, `replication.url`,`clustering.nodeName`, +`rootPath` and any other path related values, for example `storage.path`, `logging.root`, `componentsRoot`, any authentication certificate/key paths. ### Cloning system database -Harper uses a database called `system` to store operational information. Clone node will only clone the user and role +Harper uses a database called `system` to store operational information. Clone node will only clone the user and role tables from this database. It will also set up replication on this table, which means that any existing and future user and roles that are added will be replicated throughout the cluster. -Cloning the user and role tables means that once clone node is complete, the clone will share the same login credentials with +Cloning the user and role tables means that once clone node is complete, the clone will share the same login credentials with the leader. ### Replication @@ -107,20 +109,21 @@ If cloning with replication, the leader's JWT private and public keys will be cl ### Cloning overtop of an existing Harper instance -Clone node will not overwrite any existing config, database or replication. It will write/clone any config database or replication -that does not exist on the node it is running on. +Clone node will not overwrite any existing config, database or replication. It will write/clone any config database or replication +that does not exist on the node it is running on. -An example of how this can be useful is if you want to set Harper config before the clone is created. To do this you -would create a harperdb-config.yaml file in your local `hdb` root directory with the config you wish to set. Then +An example of how this can be useful is if you want to set Harper config before the clone is created. To do this you +would create a harperdb-config.yaml file in your local `hdb` root directory with the config you wish to set. Then when clone is run it will append the missing config to the file and install Harper with the desired config. -Another useful example could be retroactively adding another database to an existing instance. Running clone on -an existing instance could create a full clone of another database and set up replication between the database on the +Another useful example could be retroactively adding another database to an existing instance. Running clone on +an existing instance could create a full clone of another database and set up replication between the database on the leader and the clone. ### Cloning steps Clone node will execute the following steps when ran: + 1. Look for an existing Harper install. It does this by using the default (or user provided) `ROOTPATH`. 1. If an existing instance is found it will check for a `harperdb-config.yaml` file and search for the `cloned` value. If the value exists and is `true` clone will skip the clone logic and start Harper. 1. Clone harperdb-config.yaml values that don't already exist (excluding values unique to the leader node). diff --git a/site/versioned_docs/version-4.5/administration/harper-studio/create-account.md b/site/versioned_docs/version-4.5/administration/harper-studio/create-account.md index a826ed12..ad13b535 100644 --- a/site/versioned_docs/version-4.5/administration/harper-studio/create-account.md +++ b/site/versioned_docs/version-4.5/administration/harper-studio/create-account.md @@ -3,24 +3,25 @@ title: Create a Studio Account --- # Create a Studio Account + Start at the [Harper Studio sign up page](https://studio.harperdb.io/sign-up). -1) Provide the following information: - * First Name - * Last Name - * Email Address - * Subdomain - - *Part of the URL that will be used to identify your Harper Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com).* - * Coupon Code (optional) -2) Review the Privacy Policy and Terms of Service. -3) Click the sign up for free button. -4) You will be taken to a new screen to add an account password. Enter your password. - *Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character.* -5) Click the add account password button. +1. Provide the following information: + - First Name + - Last Name + - Email Address + - Subdomain -You will receive a Studio welcome email confirming your registration. + _Part of the URL that will be used to identify your Harper Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com)._ + - Coupon Code (optional) +2. Review the Privacy Policy and Terms of Service. +3. Click the sign up for free button. +4. You will be taken to a new screen to add an account password. Enter your password. + _Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character._ +5. Click the add account password button. + +You will receive a Studio welcome email confirming your registration. -Note: Your email address will be used as your username and cannot be changed. \ No newline at end of file +Note: Your email address will be used as your username and cannot be changed. diff --git a/site/versioned_docs/version-4.5/administration/harper-studio/enable-mixed-content.md b/site/versioned_docs/version-4.5/administration/harper-studio/enable-mixed-content.md index a1e5e4d8..67747d71 100644 --- a/site/versioned_docs/version-4.5/administration/harper-studio/enable-mixed-content.md +++ b/site/versioned_docs/version-4.5/administration/harper-studio/enable-mixed-content.md @@ -6,6 +6,4 @@ title: Enable Mixed Content Enabling mixed content is required in cases where you would like to connect the Harper Studio to Harper Instances via HTTP. This should not be used for production systems, but may be convenient for development and testing purposes. Doing so will allow your browser to reach HTTP traffic, which is considered insecure, through an HTTPS site like the Studio. - - A comprehensive guide is provided by Adobe [here](https://experienceleague.adobe.com/docs/target/using/experiences/vec/troubleshoot-composer/mixed-content.html). diff --git a/site/versioned_docs/version-4.5/administration/harper-studio/index.md b/site/versioned_docs/version-4.5/administration/harper-studio/index.md index bdb43da5..75f4ccfb 100644 --- a/site/versioned_docs/version-4.5/administration/harper-studio/index.md +++ b/site/versioned_docs/version-4.5/administration/harper-studio/index.md @@ -3,6 +3,7 @@ title: Harper Studio --- # Harper Studio + Harper Studio is the web-based GUI for Harper. Studio enables you to administer, navigate, and monitor all of your Harper instances in a simple, user-friendly interface without any knowledge of the underlying Harper API. It’s free to sign up, get started today! [Sign up for free!](https://studio.harperdb.io/sign-up) @@ -10,8 +11,11 @@ Harper Studio is the web-based GUI for Harper. Studio enables you to administer, Harper now includes a simplified local Studio that is packaged with all Harper installations and served directly from the instance. It can be enabled in the [configuration file](../../deployments/configuration#localstudio). This section is dedicated to the hosted Studio accessed at [studio.harperdb.io](https://studio.harperdb.io). --- + ## How does Studio Work? + While Harper Studio is web based and hosted by us, all database interactions are performed on the Harper instance the studio is connected to. The Harper Studio loads in your browser, at which point you login to your Harper instances. Credentials are stored in your browser cache and are not transmitted back to Harper. All database interactions are made via the Harper Operations API directly from your browser to your instance. ## What type of instances can I manage? -Harper Studio enables users to manage both Harper Cloud instances and privately hosted instances all from a single UI. All Harper instances feature identical behavior whether they are hosted by us or by you. \ No newline at end of file + +Harper Studio enables users to manage both Harper Cloud instances and privately hosted instances all from a single UI. All Harper instances feature identical behavior whether they are hosted by us or by you. diff --git a/site/versioned_docs/version-4.5/administration/harper-studio/instance-configuration.md b/site/versioned_docs/version-4.5/administration/harper-studio/instance-configuration.md index cbf07b38..394aa21c 100644 --- a/site/versioned_docs/version-4.5/administration/harper-studio/instance-configuration.md +++ b/site/versioned_docs/version-4.5/administration/harper-studio/instance-configuration.md @@ -6,71 +6,63 @@ title: Instance Configuration Harper instance configuration can be viewed and managed directly through the Harper Studio. Harper Cloud instances can be resized in two different ways via this page, either by modifying machine RAM or by increasing drive storage. Enterprise instances can have their licenses modified by modifying licensed RAM. - - All instance configuration is handled through the **config** page of the Harper Studio, accessed with the following instructions: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click config in the instance control bar. +4. Click config in the instance control bar. -*Note, the **config** page will only be available to super users and certain items are restricted to Studio organization owners.* +_Note, the **config** page will only be available to super users and certain items are restricted to Studio organization owners._ ## Instance Overview The **instance overview** panel displays the following instance specifications: -* Instance URL +- Instance URL -* Applications URL +- Applications URL -* Instance Node Name (for clustering) +- Instance Node Name (for clustering) -* Instance API Auth Header (this user) - - *The Basic authentication header used for the logged in Harper database user* +- Instance API Auth Header (this user) -* Created Date (Harper Cloud only) + _The Basic authentication header used for the logged in Harper database user_ -* Region (Harper Cloud only) - - *The geographic region where the instance is hosted.* +- Created Date (Harper Cloud only) -* Total Price +- Region (Harper Cloud only) -* RAM + _The geographic region where the instance is hosted._ -* Storage (Harper Cloud only) +- Total Price -* Disk IOPS (Harper Cloud only) +- RAM -## Update Instance RAM +- Storage (Harper Cloud only) -Harper Cloud instance size and Enterprise instance licenses can be modified with the following instructions. This option is only available to Studio organization owners. +- Disk IOPS (Harper Cloud only) +## Update Instance RAM +Harper Cloud instance size and Enterprise instance licenses can be modified with the following instructions. This option is only available to Studio organization owners. Note: For Harper Cloud instances, upgrading RAM may add additional CPUs to your instance as well. Click here to see how many CPUs are provisioned for each instance size. -1) In the **update ram** panel at the bottom left: +1. In the **update ram** panel at the bottom left: + - Select the new instance size. + - If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. + - If you do have a credit card associated, you will be presented with the updated billing information. + - Click **Upgrade**. - * Select the new instance size. - - * If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. - - * If you do have a credit card associated, you will be presented with the updated billing information. - - * Click **Upgrade**. - -2) The instance will shut down and begin reprovisioning/relicensing itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. +2. The instance will shut down and begin reprovisioning/relicensing itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. -3) Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. +3. Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. -*Note, if Harper Cloud instance reprovisioning takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new).* +_Note, if Harper Cloud instance reprovisioning takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new)._ ## Update Instance Storage @@ -78,48 +70,43 @@ The Harper Cloud instance storage size can be increased with the following instr Note: Instance storage can only be upgraded once every 6 hours. -1) In the **update storage** panel at the bottom left: - - * Select the new instance storage size. +1. In the **update storage** panel at the bottom left: + - Select the new instance storage size. - * If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. + - If you do not have a credit card associated with your account, an **Add Credit Card To Account** button will appear. Click that to be taken to the billing screen where you can enter your credit card information before returning to the **config** tab to proceed with the upgrade. - * If you do have a credit card associated, you will be presented with the updated billing information. + - If you do have a credit card associated, you will be presented with the updated billing information. - * Click **Upgrade**. + - Click **Upgrade**. -2) The instance will shut down and begin reprovisioning itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. +2. The instance will shut down and begin reprovisioning itself. The instance will not be available during this time. You will be returned to the instance dashboard and the instance status will show UPDATING INSTANCE. -3) Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. +3. Once your instance upgrade is complete, it will appear on the instance dashboard as status OK with your newly selected instance size. -*Note, if this process takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new).* +_Note, if this process takes longer than 20 minutes, please submit a support ticket here: [https://harperdbhelp.zendesk.com/hc/en-us/requests/new](https://harperdbhelp.zendesk.com/hc/en-us/requests/new)._ ## Remove Instance The Harper instance can be deleted/removed from the Studio with the following instructions. Once this operation is started it cannot be undone. This option is only available to Studio organization owners. -1) In the **remove instance** panel at the bottom left: - * Enter the instance name in the text box. - - * The Studio will present you with a warning. - - * Click **Remove**. - -2) The instance will begin deleting immediately. - +1. In the **remove instance** panel at the bottom left: + - Enter the instance name in the text box. + - The Studio will present you with a warning. + - Click **Remove**. + +2. The instance will begin deleting immediately. + ## Restart Instance The Harper Cloud instance can be restarted with the following instructions. -1) In the **restart instance** panel at the bottom right: - * Enter the instance name in the text box. - - * The Studio will present you with a warning. - - * Click **Restart**. - -2) The instance will begin restarting immediately. +1. In the **restart instance** panel at the bottom right: + - Enter the instance name in the text box. + - The Studio will present you with a warning. + - Click **Restart**. + +2. The instance will begin restarting immediately. ## Instance Config (Read Only) -A JSON preview of the instance config is available for reference at the bottom of the page. This is a read only visual and is not editable via the Studio. To make changes to the instance config, review the [configuration file documentation](../../deployments/configuration#using-the-configuration-file-and-naming-conventions). \ No newline at end of file +A JSON preview of the instance config is available for reference at the bottom of the page. This is a read only visual and is not editable via the Studio. To make changes to the instance config, review the [configuration file documentation](../../deployments/configuration#using-the-configuration-file-and-naming-conventions). diff --git a/site/versioned_docs/version-4.5/administration/harper-studio/instances.md b/site/versioned_docs/version-4.5/administration/harper-studio/instances.md index bb54493d..f17acb70 100644 --- a/site/versioned_docs/version-4.5/administration/harper-studio/instances.md +++ b/site/versioned_docs/version-4.5/administration/harper-studio/instances.md @@ -6,9 +6,9 @@ title: Instances The Harper Studio allows you to administer all of your HarperDinstances in one place. Harper currently offers the following instance types: -* **Harper Cloud Instance** Managed installations of Harper, what we call [Harper Cloud](../../deployments/harper-cloud/). -* **5G Wavelength Instance** Managed installations of Harper running on the Verizon network through AWS Wavelength, what we call 5G Wavelength Instances. _Note, these instances are only accessible via the Verizon network._ -* **Enterprise Instance** Any Harper installation that is managed by you. These include instances hosted within your cloud provider accounts (for example, from the AWS or Digital Ocean Marketplaces), privately hosted instances, or instances installed locally. +- **Harper Cloud Instance** Managed installations of Harper, what we call [Harper Cloud](../../deployments/harper-cloud/). +- **5G Wavelength Instance** Managed installations of Harper running on the Verizon network through AWS Wavelength, what we call 5G Wavelength Instances. _Note, these instances are only accessible via the Verizon network._ +- **Enterprise Instance** Any Harper installation that is managed by you. These include instances hosted within your cloud provider accounts (for example, from the AWS or Digital Ocean Marketplaces), privately hosted instances, or instances installed locally. All interactions between the Studio and your instances take place directly from your browser. Harper stores metadata about your instances, which enables the Studio to display these instances when you log in. Beyond that, all traffic is routed from your browser to the Harper instances using the standard [Harper API](../../developers/operations-api/). @@ -26,24 +26,30 @@ A summary view of all instances within an organization can be viewed by clicking 1. Fill out Instance Info. 1. Enter Instance Name - _This will be used to build your instance URL. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com). The Instance URL will be previewed below._ + _This will be used to build your instance URL. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com). The Instance URL will be previewed below._ + 1. Enter Instance Username - _This is the username of the initial Harper instance super user._ + _This is the username of the initial Harper instance super user._ + 1. Enter Instance Password - _This is the password of the initial Harper instance super user._ + _This is the password of the initial Harper instance super user._ + 1. Click **Instance Details** to move to the next page. 1. Select Instance Specs 1. Select Instance RAM - _Harper Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance._ _More on instance specs__._ + _Harper Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance._ _More on instance specs\_\_._ + 1. Select Storage Size - _Each instance has a mounted storage volume where your Harper data will reside. Storage is provisioned based on space and IOPS._ _More on IOPS Impact on Performance__._ + _Each instance has a mounted storage volume where your Harper data will reside. Storage is provisioned based on space and IOPS._ _More on IOPS Impact on Performance\_\_._ + 1. Select Instance Region - _The geographic area where your instance will be provisioned._ + _The geographic area where your instance will be provisioned._ + 1. Click **Confirm Instance Details** to move to the next page. 1. Review your Instance Details, if there is an error, use the back button to correct it. 1. Review the [Privacy Policy](https://harperdb.io/legal/privacy-policy/) and [Terms of Service](https://harperdb.io/legal/harperdb-cloud-terms-of-service/), if you agree, click the **I agree** radio button to confirm. @@ -59,27 +65,34 @@ A summary view of all instances within an organization can be viewed by clicking 1. Fill out Instance Info. 1. Enter Instance Name - _This is used for descriptive purposes only._ + _This is used for descriptive purposes only._ + 1. Enter Instance Username - _The username of a Harper super user that is already configured in your Harper installation._ + _The username of a Harper super user that is already configured in your Harper installation._ + 1. Enter Instance Password - _The password of a Harper super user that is already configured in your Harper installation._ + _The password of a Harper super user that is already configured in your Harper installation._ + 1. Enter Host - _The host to access the Harper instance. For example, `harperdb.myhost.com` or `localhost`._ + _The host to access the Harper instance. For example, `harperdb.myhost.com` or `localhost`._ + 1. Enter Port - _The port to access the Harper instance. Harper defaults `9925` for HTTP and `31283` for HTTPS._ + _The port to access the Harper instance. Harper defaults `9925` for HTTP and `31283` for HTTPS._ + 1. Select SSL - _If your instance is running over SSL, select the SSL checkbox. If not, you will need to enable mixed content in your browser to allow the HTTPS Studio to access the HTTP instance. If there are issues connecting to the instance, the Studio will display a red error message._ + _If your instance is running over SSL, select the SSL checkbox. If not, you will need to enable mixed content in your browser to allow the HTTPS Studio to access the HTTP instance. If there are issues connecting to the instance, the Studio will display a red error message._ + 1. Click **Instance Details** to move to the next page. 1. Select Instance Specs 1. Select Instance RAM - _Harper instances are billed based on Instance RAM. Selecting additional RAM will enable the ability for faster and more complex queries._ + _Harper instances are billed based on Instance RAM. Selecting additional RAM will enable the ability for faster and more complex queries._ + 1. Click **Confirm Instance Details** to move to the next page. 1. Review your Instance Details, if there is an error, use the back button to correct it. 1. Review the [Privacy Policy](https://harperdb.io/legal/privacy-policy/) and [Terms of Service](https://harperdb.io/legal/harperdb-cloud-terms-of-service/), if you agree, click the **I agree** radio button to confirm. @@ -90,8 +103,8 @@ A summary view of all instances within an organization can be viewed by clicking Instance deletion has two different behaviors depending on the instance type. -* **Harper Cloud Instance** This instance will be permanently deleted, including all data. This process is irreversible and cannot be undone. -* **Enterprise Instance** The instance will be removed from the Harper Studio only. This does not uninstall Harper from your system and your data will remain intact. +- **Harper Cloud Instance** This instance will be permanently deleted, including all data. This process is irreversible and cannot be undone. +- **Enterprise Instance** The instance will be removed from the Harper Studio only. This does not uninstall Harper from your system and your data will remain intact. An instance can be deleted as follows: @@ -100,7 +113,8 @@ An instance can be deleted as follows: 1. Identify the proper instance card and click the trash can icon. 1. Enter the instance name into the text box. - _This is done for confirmation purposes to ensure you do not accidentally delete an instance._ + _This is done for confirmation purposes to ensure you do not accidentally delete an instance._ + 1. Click the **Do It** button. ## Upgrade an Instance @@ -123,8 +137,10 @@ To log in to an instance: 1. Identify the proper instance card, it will have an unlocked icon and a status reading PLEASE LOG IN, and click the center of the card. 1. Enter the database username. - _The username of a Harper user that is already configured in your Harper instance._ + _The username of a Harper user that is already configured in your Harper instance._ + 1. Enter the database password. - _The password of a Harper user that is already configured in your Harper instance._ + _The password of a Harper user that is already configured in your Harper instance._ + 1. Click **Log In**. diff --git a/site/versioned_docs/version-4.5/administration/harper-studio/login-password-reset.md b/site/versioned_docs/version-4.5/administration/harper-studio/login-password-reset.md index 2dd71fe3..93f9a727 100644 --- a/site/versioned_docs/version-4.5/administration/harper-studio/login-password-reset.md +++ b/site/versioned_docs/version-4.5/administration/harper-studio/login-password-reset.md @@ -8,35 +8,35 @@ title: Login and Password Reset To log into your existing Harper Studio account: -1) Navigate to the [Harper Studio](https://studio.harperdb.io/). -2) Enter your email address. -3) Enter your password. -4) Click **sign in**. +1. Navigate to the [Harper Studio](https://studio.harperdb.io/). +2. Enter your email address. +3. Enter your password. +4. Click **sign in**. ## Reset a Forgotten Password To reset a forgotten password: -1) Navigate to the Harper Studio password reset page. -2) Enter your email address. -3) Click **send password reset email**. -4) If the account exists, you will receive an email with a temporary password. -5) Navigate back to the Harper Studio login page. -6) Enter your email address. -7) Enter your temporary password. -8) Click **sign in**. -9) You will be taken to a new screen to reset your account password. Enter your new password. -*Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character.* -10) Click the **add account password** button. +1. Navigate to the Harper Studio password reset page. +2. Enter your email address. +3. Click **send password reset email**. +4. If the account exists, you will receive an email with a temporary password. +5. Navigate back to the Harper Studio login page. +6. Enter your email address. +7. Enter your temporary password. +8. Click **sign in**. +9. You will be taken to a new screen to reset your account password. Enter your new password. + _Passwords must be a minimum of 8 characters with at least 1 lower case character, 1 upper case character, 1 number, and 1 special character._ +10. Click the **add account password** button. ## Change Your Password If you are already logged into the Studio, you can change your password though the user interface. -1) Navigate to the Harper Studio profile page. -2) In the **password** section, enter: +1. Navigate to the Harper Studio profile page. +2. In the **password** section, enter: + - Current password. + - New password. + - New password again _(for verification)_. - * Current password. - * New password. - * New password again *(for verification)*. -4) Click the **Update Password** button. \ No newline at end of file +3. Click the **Update Password** button. diff --git a/site/versioned_docs/version-4.5/administration/harper-studio/manage-applications.md b/site/versioned_docs/version-4.5/administration/harper-studio/manage-applications.md index 5c51915f..854b94b3 100644 --- a/site/versioned_docs/version-4.5/administration/harper-studio/manage-applications.md +++ b/site/versioned_docs/version-4.5/administration/harper-studio/manage-applications.md @@ -37,11 +37,11 @@ Accessing your application endpoints varies with which type of endpoint you're c Below is a breakdown of how to access each type of endpoint. In these examples, we will use a locally hosted instance with `securePort` set to `9926`: `https://localhost:9926`. -* **Standard REST Endpoints**\ +- **Standard REST Endpoints**\ Standard REST endpoints are defined via the `@export` directive to tables in your schema definition. You can read more about these in the [Adding an Endpoint section of the Applications documentation](../../developers/applications/#adding-an-endpoint). Here, if we are looking to access a record with ID `1` from table `Dog` on our instance, [per the REST documentation](../../developers/rest), we could send a `GET` (or since this is a GET, we could post the URL in our browser) to `https://localhost:9926/Dog/1`. -* **Augmented REST Endpoints**\ +- **Augmented REST Endpoints**\ Harper Applications enable you to write [Custom Functionality with JavaScript](../../developers/applications/#custom-functionality-with-javascript) for your resources. Accessing these endpoints is identical to accessing the standard REST endpoints above, though you may have defined custom behavior in each function. Taking the example from the [Applications documentation](../../developers/applications/#custom-functionality-with-javascript), if we are looking to access the `DogWithHumanAge` example, we could send the GET to `https://localhost:9926/DogWithHumanAge/1`. -* **Fastify Routes**\ +- **Fastify Routes**\ If you need more functionality than the REST applications can provide, you can define your own custom endpoints using [Fastify Routes](../../developers/applications/#define-fastify-routes). The paths to these routes are defined via the application `config.yaml` file. You can read more about how you can customize the configuration options in the [Define Fastify Routes documentation](../../developers/applications/define-routes). By default, routes are accessed via the following pattern: `[Instance URL]:[HTTP Port]/[Project Name]/[Route URL]`. Using the example from the [Harper Application Template](https://github.com/HarperDB/application-template/), where we've named our project `application-template`, we would access the `getAll` route at `https://localhost/application-template/getAll`. ## Creating a New Application diff --git a/site/versioned_docs/version-4.5/administration/harper-studio/manage-databases-browse-data.md b/site/versioned_docs/version-4.5/administration/harper-studio/manage-databases-browse-data.md index 88c16a6c..c9b2844d 100644 --- a/site/versioned_docs/version-4.5/administration/harper-studio/manage-databases-browse-data.md +++ b/site/versioned_docs/version-4.5/administration/harper-studio/manage-databases-browse-data.md @@ -6,10 +6,10 @@ title: Manage Databases / Browse Data Manage instance databases/tables and browse data in tabular format with the following instructions: -1) Navigate to the Harper Studio Organizations page. -2) Click the appropriate organization that the instance belongs to. -3) Select your desired instance. -4) Click **browse** in the instance control bar. +1. Navigate to the Harper Studio Organizations page. +2. Click the appropriate organization that the instance belongs to. +3. Select your desired instance. +4. Click **browse** in the instance control bar. Once on the instance browse page you can view data, manage databases and tables, add new data, and more. @@ -17,95 +17,90 @@ Once on the instance browse page you can view data, manage databases and tables, #### Create a Database -1) Click the plus icon at the top right of the databases section. -2) Enter the database name. -3) Click the green check mark. - +1. Click the plus icon at the top right of the databases section. +2. Enter the database name. +3. Click the green check mark. #### Delete a Database Deleting a database is permanent and irreversible. Deleting a database removes all tables and data within it. -1) Click the minus icon at the top right of the databases section. -2) Identify the appropriate database to delete and click the red minus sign in the same row. -3) Click the red check mark to confirm deletion. - +1. Click the minus icon at the top right of the databases section. +2. Identify the appropriate database to delete and click the red minus sign in the same row. +3. Click the red check mark to confirm deletion. #### Create a Table -1) Select the desired database from the databases section. -2) Click the plus icon at the top right of the tables section. -3) Enter the table name. -4) Enter the primary key. - - *The primary key is also often referred to as the hash attribute in the studio, and it defines the unique identifier for each row in your table.* -5) Click the green check mark. +1. Select the desired database from the databases section. +2. Click the plus icon at the top right of the tables section. +3. Enter the table name. +4. Enter the primary key. + _The primary key is also often referred to as the hash attribute in the studio, and it defines the unique identifier for each row in your table._ + +5. Click the green check mark. #### Delete a Table + Deleting a table is permanent and irreversible. Deleting a table removes all data within it. -1) Select the desired database from the databases section. -2) Click the minus icon at the top right of the tables section. -3) Identify the appropriate table to delete and click the red minus sign in the same row. -4) Click the red check mark to confirm deletion. +1. Select the desired database from the databases section. +2. Click the minus icon at the top right of the tables section. +3. Identify the appropriate table to delete and click the red minus sign in the same row. +4. Click the red check mark to confirm deletion. ## Manage Table Data The following section assumes you have selected the appropriate table from the database/table browser. - - #### Filter Table Data -1) Click the magnifying glass icon at the top right of the table browser. -2) This expands the search filters. -3) The results will be filtered appropriately. - +1. Click the magnifying glass icon at the top right of the table browser. +2. This expands the search filters. +3. The results will be filtered appropriately. #### Load CSV Data -1) Click the data icon at the top right of the table browser. You will be directed to the CSV upload page where you can choose to import a CSV by URL or upload a CSV file. -2) To import a CSV by URL: - 1) Enter the URL in the **CSV file URL** textbox. - 2) Click **Import From URL**. - 3) The CSV will load, and you will be redirected back to browse table data. -3) To upload a CSV file: - 1) Click **Click or Drag to select a .csv file** (or drag your CSV file from your file browser). - 2) Navigate to your desired CSV file and select it. - 3) Click **Insert X Records**, where X is the number of records in your CSV. - 4) The CSV will load, and you will be redirected back to browse table data. - +1. Click the data icon at the top right of the table browser. You will be directed to the CSV upload page where you can choose to import a CSV by URL or upload a CSV file. +2. To import a CSV by URL: + 1. Enter the URL in the **CSV file URL** textbox. + 2. Click **Import From URL**. + 3. The CSV will load, and you will be redirected back to browse table data. +3. To upload a CSV file: + 1. Click **Click or Drag to select a .csv file** (or drag your CSV file from your file browser). + 2. Navigate to your desired CSV file and select it. + 3. Click **Insert X Records**, where X is the number of records in your CSV. + 4. The CSV will load, and you will be redirected back to browse table data. #### Add a Record -1) Click the plus icon at the top right of the table browser. -2) The Studio will pre-populate existing table attributes in JSON format. +1. Click the plus icon at the top right of the table browser. +2. The Studio will pre-populate existing table attributes in JSON format. - *The primary key is not included, but you can add it in and set it to your desired value. Auto-maintained fields are not included and cannot be manually set. You may enter a JSON array to insert multiple records in a single transaction.* -3) Enter values to be added to the record. + _The primary key is not included, but you can add it in and set it to your desired value. Auto-maintained fields are not included and cannot be manually set. You may enter a JSON array to insert multiple records in a single transaction._ - *You may add new attributes to the JSON; they will be reflexively added to the table.* -4) Click the **Add New** button. +3. Enter values to be added to the record. + _You may add new attributes to the JSON; they will be reflexively added to the table._ -#### Edit a Record +4. Click the **Add New** button. -1) Click the record/row you would like to edit. -2) Modify the desired values. +#### Edit a Record - *You may add new attributes to the JSON; they will be reflexively added to the table.* +1. Click the record/row you would like to edit. +2. Modify the desired values. -3) Click the **save icon**. + _You may add new attributes to the JSON; they will be reflexively added to the table._ +3. Click the **save icon**. #### Delete a Record Deleting a record is permanent and irreversible. If transaction logging is turned on, the delete transaction will be recorded as well as the data that was deleted. -1) Click the record/row you would like to delete. -2) Click the **delete icon**. -3) Confirm deletion by clicking the **check icon**. +1. Click the record/row you would like to delete. +2. Click the **delete icon**. +3. Confirm deletion by clicking the **check icon**. ## Browse Table Data @@ -115,18 +110,14 @@ The following section assumes you have selected the appropriate table from the d The first page of table data is automatically loaded on table selection. Paging controls are at the bottom of the table. Here you can: -* Page left and right using the arrows. -* Type in the desired page. -* Change the page size (the amount of records displayed in the table). - +- Page left and right using the arrows. +- Type in the desired page. +- Change the page size (the amount of records displayed in the table). #### Refresh Table Data Click the refresh icon at the top right of the table browser. - - #### Automatically Refresh Table Data Toggle the auto switch at the top right of the table browser. The table data will now automatically refresh every 15 seconds. Filters and pages will remain set for refreshed data. - diff --git a/site/versioned_docs/version-4.5/administration/harper-studio/manage-instance-roles.md b/site/versioned_docs/version-4.5/administration/harper-studio/manage-instance-roles.md index d0f8c82d..5a1e36e2 100644 --- a/site/versioned_docs/version-4.5/administration/harper-studio/manage-instance-roles.md +++ b/site/versioned_docs/version-4.5/administration/harper-studio/manage-instance-roles.md @@ -8,69 +8,70 @@ Harper users and roles can be managed directly through the Harper Studio. It is Instance role configuration is handled through the **roles** page of the Harper Studio, accessed with the following instructions: -1) Navigate to the Harper Studio Organizations page. +1. Navigate to the Harper Studio Organizations page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **roles** in the instance control bar. +4. Click **roles** in the instance control bar. -*Note, the **roles** page will only be available to super users.* +_Note, the **roles** page will only be available to super users._ +The _roles management_ screen consists of the following panels: +- **super users** -The *roles management* screen consists of the following panels: + Displays all super user roles for this instance. -* **super users** +- **cluster users** - Displays all super user roles for this instance. -* **cluster users** + Displays all cluster user roles for this instance. - Displays all cluster user roles for this instance. -* **standard roles** +- **standard roles** - Displays all standard roles for this instance. -* **role permission editing** + Displays all standard roles for this instance. - Once a role is selected for editing, permissions will be displayed here in JSON format. +- **role permission editing** -*Note, when new tables are added that are not configured, the Studio will generate configuration values with permissions defaulting to `false`.* + Once a role is selected for editing, permissions will be displayed here in JSON format. + +_Note, when new tables are added that are not configured, the Studio will generate configuration values with permissions defaulting to `false`._ ## Role Management #### Create a Role -1) Click the plus icon at the top right of the appropriate role section. +1. Click the plus icon at the top right of the appropriate role section. -2) Enter the role name. +2. Enter the role name. -3) Click the green check mark. +3. Click the green check mark. -4) Optionally toggle the **manage databases/tables** switch to specify the `structure_user` config. +4. Optionally toggle the **manage databases/tables** switch to specify the `structure_user` config. -5) Configure the role permissions in the role permission editing panel. +5. Configure the role permissions in the role permission editing panel. - *Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel.* + _Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel._ -6) Click **Update Role Permissions**. +6. Click **Update Role Permissions**. #### Modify a Role -1) Click the appropriate role from the appropriate role section. +1. Click the appropriate role from the appropriate role section. -2) Modify the role permissions in the role permission editing panel. +2. Modify the role permissions in the role permission editing panel. - *Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel.* + _Note, to have the Studio generate attribute permissions JSON, toggle **show all attributes** at the top right of the role permission editing panel._ -3) Click **Update Role Permissions**. +3. Click **Update Role Permissions**. #### Delete a Role Deleting a role is permanent and irreversible. A role cannot be remove if users are associated with it. -1) Click the minus icon at the top right of the roles section. +1. Click the minus icon at the top right of the roles section. -2) Identify the appropriate role to delete and click the red minus sign in the same row. +2. Identify the appropriate role to delete and click the red minus sign in the same row. -3) Click the red check mark to confirm deletion. \ No newline at end of file +3. Click the red check mark to confirm deletion. diff --git a/site/versioned_docs/version-4.5/administration/harper-studio/manage-instance-users.md b/site/versioned_docs/version-4.5/administration/harper-studio/manage-instance-users.md index 23bcaa49..e125464a 100644 --- a/site/versioned_docs/version-4.5/administration/harper-studio/manage-instance-users.md +++ b/site/versioned_docs/version-4.5/administration/harper-studio/manage-instance-users.md @@ -8,54 +8,46 @@ Harper users and roles can be managed directly through the Harper Studio. It is Instance user configuration is handled through the **users** page of the Harper Studio, accessed with the following instructions: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **users** in the instance control bar. +4. Click **users** in the instance control bar. -*Note, the **users** page will only be available to super users.* +_Note, the **users** page will only be available to super users._ ## Add a User Harper instance users can be added with the following instructions. -1) In the **add user** panel on the left enter: - - * New user username. - - * New user password. - - * Select a role. - - *Learn more about role management here: [Manage Instance Roles](./manage-instance-roles).* - -2) Click **Add User**. - +1. In the **add user** panel on the left enter: + - New user username. + - New user password. + - Select a role. + + _Learn more about role management here: [Manage Instance Roles](./manage-instance-roles)._ + +2. Click **Add User**. + ## Edit a User Harper instance users can be modified with the following instructions. -1) In the **existing users** panel, click the row of the user you would like to edit. +1. In the **existing users** panel, click the row of the user you would like to edit. + +2. To change a user’s password: + 1. In the **Change user password** section, enter the new password. + 2. Click **Update Password**. -2) To change a user’s password: +3. To change a user’s role: + 1. In the **Change user role** section, select the new role. + 2. Click **Update Role**. - 1) In the **Change user password** section, enter the new password. - - 2) Click **Update Password**. - -3) To change a user’s role: +4. To delete a user: + 1. In the **Delete User** section, type the username into the textbox. - 1) In the **Change user role** section, select the new role. - - 2) Click **Update Role**. - -4) To delete a user: + _This is done for confirmation purposes._ - 1) In the **Delete User** section, type the username into the textbox. - - *This is done for confirmation purposes.* - - 2) Click **Delete User**. \ No newline at end of file + 2. Click **Delete User**. diff --git a/site/versioned_docs/version-4.5/administration/harper-studio/manage-replication.md b/site/versioned_docs/version-4.5/administration/harper-studio/manage-replication.md index 02951470..3fd92514 100644 --- a/site/versioned_docs/version-4.5/administration/harper-studio/manage-replication.md +++ b/site/versioned_docs/version-4.5/administration/harper-studio/manage-replication.md @@ -6,65 +6,66 @@ title: Manage Replication Harper instance clustering and replication can be configured directly through the Harper Studio. It is recommended to read through the [clustering documentation](../../developers/clustering/) first to gain a strong understanding of Harper clustering behavior. - - All clustering configuration is handled through the **replication** page of the Harper Studio, accessed with the following instructions: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. +2. Click the appropriate organization that the instance belongs to. -3) Select your desired instance. +3. Select your desired instance. -4) Click **replication** in the instance control bar. +4. Click **replication** in the instance control bar. Note, the **replication** page will only be available to super users. --- + ## Initial Configuration Harper instances do not have clustering configured by default. The Harper Studio will walk you through the initial configuration. Upon entering the **replication** screen for the first time you will need to complete the following configuration. Configurations are set in the **enable clustering** panel on the left while actions are described in the middle of the screen. It is worth reviewing the [Creating a Cluster User](../../developers/clustering/creating-a-cluster-user) document before proceeding. -1) Enter Cluster User username. (Defaults to `cluster_user`). -2) Enter Cluster Password. -3) Review and/or Set Cluster Node Name. -4) Click **Enable Clustering**. - +1. Enter Cluster User username. (Defaults to `cluster_user`). +2. Enter Cluster Password. +3. Review and/or Set Cluster Node Name. +4. Click **Enable Clustering**. + At this point the Studio will restart your Harper Instance, required for the configuration changes to take effect. --- ## Manage Clustering + Once initial clustering configuration is completed you a presented with a clustering management screen with the following properties: -* **connected instances** +- **connected instances** + + Displays all instances within the Studio Organization that this instance manages a connection with. - Displays all instances within the Studio Organization that this instance manages a connection with. +- **unconnected instances** -* **unconnected instances** + Displays all instances within the Studio Organization that this instance does not manage a connection with. - Displays all instances within the Studio Organization that this instance does not manage a connection with. +- **unregistered instances** -* **unregistered instances** + Displays all instances outside the Studio Organization that this instance manages a connection with. - Displays all instances outside the Studio Organization that this instance manages a connection with. +- **manage clustering** -* **manage clustering** + Once instances are connected, this will display clustering management options for all connected instances and all databases and tables. - Once instances are connected, this will display clustering management options for all connected instances and all databases and tables. --- ## Connect an Instance Harper Instances can be clustered together with the following instructions. -1) Ensure clustering has been configured on both instances and a cluster user with identical credentials exists on both. +1. Ensure clustering has been configured on both instances and a cluster user with identical credentials exists on both. -2) Identify the instance you would like to connect from the **unconnected instances** panel. +2. Identify the instance you would like to connect from the **unconnected instances** panel. -3) Click the plus icon next the appropriate instance. +3. Click the plus icon next the appropriate instance. -4) If configurations are correct, all databases will sync across the cluster, then appear in the **manage clustering** panel. If there is a configuration issue, a red exclamation icon will appear, click it to learn more about what could be causing the issue. +4. If configurations are correct, all databases will sync across the cluster, then appear in the **manage clustering** panel. If there is a configuration issue, a red exclamation icon will appear, click it to learn more about what could be causing the issue. --- @@ -72,9 +73,9 @@ Harper Instances can be clustered together with the following instructions. Harper Instances can be disconnected with the following instructions. -1) Identify the instance you would like to disconnect from the **connected instances** panel. +1. Identify the instance you would like to disconnect from the **connected instances** panel. -2) Click the minus icon next the appropriate instance. +2. Click the minus icon next the appropriate instance. --- @@ -82,8 +83,8 @@ Harper Instances can be disconnected with the following instructions. Subscriptions must be configured in order to move data between connected instances. Read more about subscriptions here: Creating A Subscription. The **manage clustering** panel displays a table with each row representing an channel per instance. Cells are bolded to indicate a change in the column. Publish and subscribe replication can be configured per table with the following instructions: -1) Identify the instance, database, and table for replication to be configured. +1. Identify the instance, database, and table for replication to be configured. -2) For publish, click the toggle switch in the **publish** column. +2. For publish, click the toggle switch in the **publish** column. -3) For subscribe, click the toggle switch in the **subscribe** column. \ No newline at end of file +3. For subscribe, click the toggle switch in the **subscribe** column. diff --git a/site/versioned_docs/version-4.5/administration/harper-studio/organizations.md b/site/versioned_docs/version-4.5/administration/harper-studio/organizations.md index d486abbc..1bb56dd1 100644 --- a/site/versioned_docs/version-4.5/administration/harper-studio/organizations.md +++ b/site/versioned_docs/version-4.5/administration/harper-studio/organizations.md @@ -3,43 +3,46 @@ title: Organizations --- # Organizations -Harper Studio organizations provide the ability to group Harper Cloud Instances. Organization behavior is as follows: -* Billing occurs at the organization level to a single credit card. -* Organizations retain their own unique Harper Cloud subdomain. -* Cloud instances reside within an organization. -* Studio users can be invited to organizations to share instances. +Harper Studio organizations provide the ability to group Harper Cloud Instances. Organization behavior is as follows: +- Billing occurs at the organization level to a single credit card. +- Organizations retain their own unique Harper Cloud subdomain. +- Cloud instances reside within an organization. +- Studio users can be invited to organizations to share instances. An organization is automatically created for you when you sign up for Harper Studio. If you only have one organization, the Studio will automatically bring you to your organization’s page. --- ## List Organizations + A summary view of all organizations your user belongs to can be viewed on the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. You can navigate to this page at any time by clicking the **all organizations** link at the top of the Harper Studio. ## Create a New Organization + A new organization can be created as follows: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the **Create a New Organization** card. -3) Fill out new organization details - * Enter Organization Name - *This is used for descriptive purposes only.* - * Enter Organization Subdomain - *Part of the URL that will be used to identify your Harper Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com).* -4) Click Create Organization. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the **Create a New Organization** card. +3. Fill out new organization details + - Enter Organization Name + _This is used for descriptive purposes only._ + - Enter Organization Subdomain + _Part of the URL that will be used to identify your Harper Cloud Instances. For example, with subdomain “demo” and instance name “c1” the instance URL would be: [https://c1-demo.harperdbcloud.com](https://c1-demo.harperdbcloud.com)._ +4. Click Create Organization. ## Delete an Organization An organization cannot be deleted until all instances have been removed. An organization can be deleted as follows: -1) Navigate to the Harper Studio Organizations page. -2) Identify the proper organization card and click the trash can icon. -3) Enter the organization name into the text box. +1. Navigate to the Harper Studio Organizations page. +2. Identify the proper organization card and click the trash can icon. +3. Enter the organization name into the text box. + + _This is done for confirmation purposes to ensure you do not accidentally delete an organization._ - *This is done for confirmation purposes to ensure you do not accidentally delete an organization.* -4) Click the **Do It** button. +4. Click the **Do It** button. ## Manage Users @@ -49,11 +52,11 @@ Harper Studio organization owners can manage users including inviting new users, A new user can be invited to an organization as follows: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) In the **add user** box, enter the new user’s email address. -5) Click **Add User**. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. In the **add user** box, enter the new user’s email address. +5. Click **Add User**. Users may or may not already be Harper Studio users when adding them to an organization. If the Harper Studio account already exists, the user will receive an email notification alerting them to the organization invitation. If the user does not have a Harper Studio account, they will receive an email welcoming them to Harper Studio. @@ -63,11 +66,11 @@ Users may or may not already be Harper Studio users when adding them to an organ Organization owners have full access to the organization including the ability to manage organization users, create, modify, and delete instances, and delete the organization. Users must have accepted their invitation prior to being promoted to an owner. A user’s organization owner status can be toggled owner as follows: -1) Navigate to the Harper Studio Organizations page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) Click the appropriate user from the **existing users** section. -5) Toggle the **Is Owner** switch to the desired status. +1. Navigate to the Harper Studio Organizations page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. Click the appropriate user from the **existing users** section. +5. Toggle the **Is Owner** switch to the desired status. --- @@ -75,35 +78,32 @@ Organization owners have full access to the organization including the ability t Users may be removed from an organization at any time. Removing a user from an organization will not delete their Harper Studio account, it will only remove their access to the specified organization. A user can be removed from an organization as follows: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **users** at the top of the screen. -4) Click the appropriate user from the **existing users** section. -5) Type **DELETE** in the text box in the **Delete User** row. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **users** at the top of the screen. +4. Click the appropriate user from the **existing users** section. +5. Type **DELETE** in the text box in the **Delete User** row. - *This is done for confirmation purposes to ensure you do not accidentally delete a user.* -6) Click **Delete User**. + _This is done for confirmation purposes to ensure you do not accidentally delete a user._ + +6. Click **Delete User**. ## Manage Billing Billing is configured per organization and will be billed to the stored credit card at appropriate intervals (monthly or annually depending on the registered instance). Billing settings can be configured as follows: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. -2) Click the appropriate organization card. -3) Click **billing** at the top of the screen. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/?redirect=/organizations) page. +2. Click the appropriate organization card. +3. Click **billing** at the top of the screen. Here organization owners can view invoices, manage coupons, and manage the associated credit card. - - -*Harper billing and payments are managed via Stripe.* - - +_Harper billing and payments are managed via Stripe._ ### Add a Coupon Coupons are applicable towards any paid tier or enterprise instance and you can change your subscription at any time. Coupons can be added to your Organization as follows: -1) In the coupons panel of the **billing** page, enter your coupon code. -2) Click **Add Coupon**. -3) The coupon will then be available and displayed in the coupons panel. \ No newline at end of file +1. In the coupons panel of the **billing** page, enter your coupon code. +2. Click **Add Coupon**. +3. The coupon will then be available and displayed in the coupons panel. diff --git a/site/versioned_docs/version-4.5/administration/harper-studio/query-instance-data.md b/site/versioned_docs/version-4.5/administration/harper-studio/query-instance-data.md index 9f3b9324..7f325d6a 100644 --- a/site/versioned_docs/version-4.5/administration/harper-studio/query-instance-data.md +++ b/site/versioned_docs/version-4.5/administration/harper-studio/query-instance-data.md @@ -6,14 +6,14 @@ title: Query Instance Data SQL queries can be executed directly through the Harper Studio with the following instructions: -1) Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. -2) Click the appropriate organization that the instance belongs to. -3) Select your desired instance. -4) Click **query** in the instance control bar. -5) Enter your SQL query in the SQL query window. -6) Click **Execute**. +1. Navigate to the [Harper Studio Organizations](https://studio.harperdb.io/organizations) page. +2. Click the appropriate organization that the instance belongs to. +3. Select your desired instance. +4. Click **query** in the instance control bar. +5. Enter your SQL query in the SQL query window. +6. Click **Execute**. -*Please note, the Studio will execute the query exactly as entered. For example, if you attempt to `SELECT *` from a table with millions of rows, you will most likely crash your browser.* +_Please note, the Studio will execute the query exactly as entered. For example, if you attempt to `SELECT _` from a table with millions of rows, you will most likely crash your browser.\* ## Browse Query Results Set @@ -21,9 +21,9 @@ SQL queries can be executed directly through the Harper Studio with the followin The first page of results set data is automatically loaded on query execution. Paging controls are at the bottom of the table. Here you can: -* Page left and right using the arrows. -* Type in the desired page. -* Change the page size (the amount of records displayed in the table). +- Page left and right using the arrows. +- Type in the desired page. +- Change the page size (the amount of records displayed in the table). #### Refresh Results Set @@ -37,12 +37,11 @@ Toggle the auto switch at the top right of the results set table. The results se Query history is stored in your local browser cache. Executed queries are listed with the most recent at the top in the **query history** section. - #### Rerun Previous Query -* Identify the query from the **query history** list. -* Click the appropriate query. It will be loaded into the **sql query** input box. -* Click **Execute**. +- Identify the query from the **query history** list. +- Click the appropriate query. It will be loaded into the **sql query** input box. +- Click **Execute**. #### Clear Query History @@ -50,4 +49,4 @@ Click the trash can icon at the top right of the **query history** section. ## Create Charts -The Harper Studio includes a charting feature where you can build charts based on your specified queries. Visit the Charts documentation for more information. \ No newline at end of file +The Harper Studio includes a charting feature where you can build charts based on your specified queries. Visit the Charts documentation for more information. diff --git a/site/versioned_docs/version-4.5/administration/jobs.md b/site/versioned_docs/version-4.5/administration/jobs.md index e71dd9cf..84859ffd 100644 --- a/site/versioned_docs/version-4.5/administration/jobs.md +++ b/site/versioned_docs/version-4.5/administration/jobs.md @@ -10,7 +10,7 @@ Harper Jobs are asynchronous tasks performed by the Operations API. Jobs uses an asynchronous methodology to account for the potential of a long-running operation. For example, exporting millions of records to S3 could take some time, so that job is started and the id is provided to check on the status. -The job status can be **COMPLETE** or **IN\_PROGRESS**. +The job status can be **COMPLETE** or **IN_PROGRESS**. ## Example Job Operations diff --git a/site/versioned_docs/version-4.5/administration/logging/audit-logging.md b/site/versioned_docs/version-4.5/administration/logging/audit-logging.md index cfec1062..209b4981 100644 --- a/site/versioned_docs/version-4.5/administration/logging/audit-logging.md +++ b/site/versioned_docs/version-4.5/administration/logging/audit-logging.md @@ -12,7 +12,7 @@ Audit log is enabled by default. To disable the audit log, set `logging.auditLog ### Audit Log Operations -#### read\_audit\_log +#### read_audit_log The `read_audit_log` operation is flexible, enabling users to query with many parameters. All operations search on a single table. Filter options include timestamps, usernames, and table hash values. Additional examples found in the [Harper API documentation](../../developers/operations-api/logs). @@ -20,116 +20,107 @@ The `read_audit_log` operation is flexible, enabling users to query with many pa ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "timestamp", - "search_values": [ - 1660585740558 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "timestamp", + "search_values": [1660585740558] } ``` There are three outcomes using timestamp. -* `"search_values": []` - All records returned for specified table -* `"search_values": [1660585740558]` - All records after provided timestamp -* `"search_values": [1660585740558, 1760585759710]` - Records "from" and "to" provided timestamp +- `"search_values": []` - All records returned for specified table +- `"search_values": [1660585740558]` - All records after provided timestamp +- `"search_values": [1660585740558, 1760585759710]` - Records "from" and "to" provided timestamp -*** +--- **Search by Username** ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "username", - "search_values": [ - "admin" - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "username", + "search_values": ["admin"] } ``` The above example will return all records whose `username` is "admin." -*** +--- **Search by Primary Key** ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "hash_value", - "search_values": [ - 318 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "hash_value", + "search_values": [318] } ``` The above example will return all records whose primary key (`hash_value`) is 318. -*** +--- -#### read\_audit\_log Response +#### read_audit_log Response The example that follows provides records of operations performed on a table. One thing of note is that the `read_audit_log` operation gives you the `original_records`. ```json { - "operation": "update", - "user_name": "HDB_ADMIN", - "timestamp": 1607035559122.277, - "hash_values": [ - 1, - 2 - ], - "records": [ - { - "id": 1, - "breed": "Muttzilla", - "age": 6, - "__updatedtime__": 1607035559122 - }, - { - "id": 2, - "age": 7, - "__updatedtime__": 1607035559121 - } - ], - "original_records": [ - { - "__createdtime__": 1607035556801, - "__updatedtime__": 1607035556801, - "age": 5, - "breed": "Mutt", - "id": 2, - "name": "Penny" - }, - { - "__createdtime__": 1607035556801, - "__updatedtime__": 1607035556801, - "age": 5, - "breed": "Mutt", - "id": 1, - "name": "Harper" - } - ] + "operation": "update", + "user_name": "HDB_ADMIN", + "timestamp": 1607035559122.277, + "hash_values": [1, 2], + "records": [ + { + "id": 1, + "breed": "Muttzilla", + "age": 6, + "__updatedtime__": 1607035559122 + }, + { + "id": 2, + "age": 7, + "__updatedtime__": 1607035559121 + } + ], + "original_records": [ + { + "__createdtime__": 1607035556801, + "__updatedtime__": 1607035556801, + "age": 5, + "breed": "Mutt", + "id": 2, + "name": "Penny" + }, + { + "__createdtime__": 1607035556801, + "__updatedtime__": 1607035556801, + "age": 5, + "breed": "Mutt", + "id": 1, + "name": "Harper" + } + ] } ``` -#### delete\_audit\_logs\_before +#### delete_audit_logs_before Just like with transaction logs, you can clean up your audit logs with the `delete_audit_logs_before` operation. It will delete audit log data according to the given parameters. The example below will delete records older than the timestamp provided. ```json { - "operation": "delete_audit_logs_before", - "schema": "dev", - "table": "cat", - "timestamp": 1598290282817 + "operation": "delete_audit_logs_before", + "schema": "dev", + "table": "cat", + "timestamp": 1598290282817 } ``` diff --git a/site/versioned_docs/version-4.5/administration/logging/index.md b/site/versioned_docs/version-4.5/administration/logging/index.md index 7a9588ce..e04b8adb 100644 --- a/site/versioned_docs/version-4.5/administration/logging/index.md +++ b/site/versioned_docs/version-4.5/administration/logging/index.md @@ -6,6 +6,6 @@ title: Logging Harper provides many different logging options for various features and functionality. -* [Standard Logging](./standard-logging): Harper maintains a log of events that take place throughout operation. -* [Audit Logging](./audit-logging): Harper uses a standard Harper table to track transactions. For each table a user creates, a corresponding table will be created to track transactions against that table. -* [Transaction Logging](./transaction-logging): Harper stores a verbose history of all transactions logged for specified database tables, including original data records. +- [Standard Logging](./standard-logging): Harper maintains a log of events that take place throughout operation. +- [Audit Logging](./audit-logging): Harper uses a standard Harper table to track transactions. For each table a user creates, a corresponding table will be created to track transactions against that table. +- [Transaction Logging](./transaction-logging): Harper stores a verbose history of all transactions logged for specified database tables, including original data records. diff --git a/site/versioned_docs/version-4.5/administration/logging/standard-logging.md b/site/versioned_docs/version-4.5/administration/logging/standard-logging.md index c7c2fe7a..a5116ed7 100644 --- a/site/versioned_docs/version-4.5/administration/logging/standard-logging.md +++ b/site/versioned_docs/version-4.5/administration/logging/standard-logging.md @@ -22,15 +22,15 @@ For example, a typical log entry looks like: The components of a log entry are: -* timestamp - This is the date/time stamp when the event occurred -* level - This is an associated log level that gives a rough guide to the importance and urgency of the message. The available log levels in order of least urgent (and more verbose) are: `trace`, `debug`, `info`, `warn`, `error`, `fatal`, and `notify`. -* thread/ID - This reports the name of the thread and the thread ID that the event was reported on. Note that NATS logs are recorded by their process name and there is no thread id for them since they are a separate process. Key threads are: - * main - This is the thread that is responsible for managing all other threads and routes incoming requests to the other threads - * http - These are the worker threads that handle the primary workload of incoming HTTP requests to the operations API and custom functions. - * Clustering\* - These are threads and processes that handle replication. - * job - These are job threads that have been started to handle operations that are executed in a separate job thread. -* tags - Logging from a custom function will include a "custom-function" tag in the log entry. Most logs will not have any additional tags. -* message - This is the main message that was reported. +- timestamp - This is the date/time stamp when the event occurred +- level - This is an associated log level that gives a rough guide to the importance and urgency of the message. The available log levels in order of least urgent (and more verbose) are: `trace`, `debug`, `info`, `warn`, `error`, `fatal`, and `notify`. +- thread/ID - This reports the name of the thread and the thread ID that the event was reported on. Note that NATS logs are recorded by their process name and there is no thread id for them since they are a separate process. Key threads are: + - main - This is the thread that is responsible for managing all other threads and routes incoming requests to the other threads + - http - These are the worker threads that handle the primary workload of incoming HTTP requests to the operations API and custom functions. + - Clustering\* - These are threads and processes that handle replication. + - job - These are job threads that have been started to handle operations that are executed in a separate job thread. +- tags - Logging from a custom function will include a "custom-function" tag in the log entry. Most logs will not have any additional tags. +- message - This is the main message that was reported. We try to keep logging to a minimum by default, to do this the default log level is `error`. If you require more information from the logs, increasing the log level down will provide that. @@ -54,12 +54,12 @@ To access specific logs you may query the Harper API. Logs can be queried using ```json { - "operation": "read_log", - "start": 0, - "limit": 1000, - "level": "error", - "from": "2021-01-25T22:05:27.464+0000", - "until": "2021-01-25T23:05:27.464+0000", - "order": "desc" + "operation": "read_log", + "start": 0, + "limit": 1000, + "level": "error", + "from": "2021-01-25T22:05:27.464+0000", + "until": "2021-01-25T23:05:27.464+0000", + "order": "desc" } ``` diff --git a/site/versioned_docs/version-4.5/administration/logging/transaction-logging.md b/site/versioned_docs/version-4.5/administration/logging/transaction-logging.md index 48860fdd..9003ff04 100644 --- a/site/versioned_docs/version-4.5/administration/logging/transaction-logging.md +++ b/site/versioned_docs/version-4.5/administration/logging/transaction-logging.md @@ -14,71 +14,71 @@ If you would like to use the transaction log, but have not set up clustering yet ## Transaction Log Operations -### read\_transaction\_log +### read_transaction_log The `read_transaction_log` operation returns a prescribed set of records, based on given parameters. The example below will give a maximum of 2 records within the timestamps provided. ```json { - "operation": "read_transaction_log", - "schema": "dev", - "table": "dog", - "from": 1598290235769, - "to": 1660249020865, - "limit": 2 + "operation": "read_transaction_log", + "schema": "dev", + "table": "dog", + "from": 1598290235769, + "to": 1660249020865, + "limit": 2 } ``` _See example response below._ -### read\_transaction\_log Response +### read_transaction_log Response ```json [ - { - "operation": "insert", - "user": "admin", - "timestamp": 1660165619736, - "records": [ - { - "id": 1, - "dog_name": "Penny", - "owner_name": "Kyle", - "breed_id": 154, - "age": 7, - "weight_lbs": 38, - "__updatedtime__": 1660165619688, - "__createdtime__": 1660165619688 - } - ] - }, - { - "operation": "update", - "user": "admin", - "timestamp": 1660165620040, - "records": [ - { - "id": 1, - "dog_name": "Penny B", - "__updatedtime__": 1660165620036 - } - ] - } + { + "operation": "insert", + "user": "admin", + "timestamp": 1660165619736, + "records": [ + { + "id": 1, + "dog_name": "Penny", + "owner_name": "Kyle", + "breed_id": 154, + "age": 7, + "weight_lbs": 38, + "__updatedtime__": 1660165619688, + "__createdtime__": 1660165619688 + } + ] + }, + { + "operation": "update", + "user": "admin", + "timestamp": 1660165620040, + "records": [ + { + "id": 1, + "dog_name": "Penny B", + "__updatedtime__": 1660165620036 + } + ] + } ] ``` _See example request above._ -### delete\_transaction\_logs\_before +### delete_transaction_logs_before The `delete_transaction_logs_before` operation will delete transaction log data according to the given parameters. The example below will delete records older than the timestamp provided. ```json { - "operation": "delete_transaction_logs_before", - "schema": "dev", - "table": "dog", - "timestamp": 1598290282817 + "operation": "delete_transaction_logs_before", + "schema": "dev", + "table": "dog", + "timestamp": 1598290282817 } ``` diff --git a/site/versioned_docs/version-4.5/deployments/_category_.json b/site/versioned_docs/version-4.5/deployments/_category_.json index 8fdd6e17..95644c6b 100644 --- a/site/versioned_docs/version-4.5/deployments/_category_.json +++ b/site/versioned_docs/version-4.5/deployments/_category_.json @@ -1,12 +1,10 @@ { - "label": "Deployments", - "position": 3, - "link": { - "type": "generated-index", - "title": "Deployments Documentation", - "description": "Installation and deployment guides for HarperDB", - "keywords": [ - "deployments" - ] - } -} \ No newline at end of file + "label": "Deployments", + "position": 3, + "link": { + "type": "generated-index", + "title": "Deployments Documentation", + "description": "Installation and deployment guides for HarperDB", + "keywords": ["deployments"] + } +} diff --git a/site/versioned_docs/version-4.5/deployments/configuration.md b/site/versioned_docs/version-4.5/deployments/configuration.md index f99c8228..25fa2469 100644 --- a/site/versioned_docs/version-4.5/deployments/configuration.md +++ b/site/versioned_docs/version-4.5/deployments/configuration.md @@ -8,7 +8,7 @@ Harper is configured through a [YAML](https://yaml.org/) file called `harperdb-c Some configuration will be populated by default in the config file on install, regardless of whether it is used. -*** +--- ## Using the Configuration File and Naming Conventions @@ -29,19 +29,22 @@ logging: ``` You could apply this change using: -* Environment variable: `LOGGING_ROTATION_ENABLED=false` -* Command line variable: `--LOGGING_ROTATION_ENABLED false` -* Operations API (`set_configuration`): `logging_rotation_enabled: false` + +- Environment variable: `LOGGING_ROTATION_ENABLED=false` +- Command line variable: `--LOGGING_ROTATION_ENABLED false` +- Operations API (`set_configuration`): `logging_rotation_enabled: false` To change the `port` in the `http` section, use: -* Environment variable: `HTTP_PORT=` -* Command line variable: `--HTTP_PORT ` -* Operations API (`set_configuration`): `http_port: ` + +- Environment variable: `HTTP_PORT=` +- Command line variable: `--HTTP_PORT ` +- Operations API (`set_configuration`): `http_port: ` To set the `operationsApi.network.port` to `9925`, use: -* Environment variable: `OPERATIONSAPI_NETWORK_PORT=9925` -* Command line variable: `--OPERATIONSAPI_NETWORK_PORT 9925` -* Operations API (`set_configuration`): `operationsApi_network_port: 9925` + +- Environment variable: `OPERATIONSAPI_NETWORK_PORT=9925` +- Command line variable: `--OPERATIONSAPI_NETWORK_PORT 9925` +- Operations API (`set_configuration`): `operationsApi_network_port: 9925` _Note: Component configuration cannot be added or updated via CLI or ENV variables._ @@ -51,7 +54,7 @@ To use a custom configuration file to set values on install, use the CLI/ENV var To install Harper overtop of an existing configuration file, set `HDB_CONFIG` to the root path of your install `/harperdb-config.yaml` -*** +--- ## Configuration Options @@ -74,7 +77,7 @@ For HTTP clients that support (Brotli) compression encoding, responses that are ```yaml http: - compressionThreshold: 1200 + compressionThreshold: 1200 ``` `cors` - _Type_: boolean; _Default_: true @@ -109,7 +112,7 @@ The port used to access the component server. The port the Harper component server uses for HTTPS connections. This requires a valid certificate and key. -`http2` - _Type_: boolean; _Default_: false +`http2` - _Type_: boolean; _Default_: false Enables HTTP/2 for the HTTP server. @@ -119,16 +122,16 @@ The length of time in milliseconds after which a request will timeout. ```yaml http: - cors: true - corsAccessList: - - null - headersTimeout: 60000 - maxHeaderSize: 8192 - https: false - keepAliveTimeout: 30000 - port: 9926 - securePort: null - timeout: 120000 + cors: true + corsAccessList: + - null + headersTimeout: 60000 + maxHeaderSize: 8192 + https: false + keepAliveTimeout: 30000 + port: 9926 + securePort: null + timeout: 120000 ``` `mlts` - _Type_: boolean | object; _Default_: false @@ -159,7 +162,7 @@ http: user: user-name ``` -*** +--- ### `threads` @@ -195,7 +198,7 @@ threads: This specifies the heap memory limit for each thread, in megabytes. The default heap limit is a heuristic based on available memory and thread count. -*** +--- ### `replication` @@ -205,7 +208,7 @@ The `replication` section configures [Harper replication](../developers/replicat replication: hostname: server-one url: wss://server-one:9925 - databases: "*" + databases: '*' routes: - wss://server-two:9925 port: null @@ -227,7 +230,7 @@ Configure which databases to replicate. This can be a string for all database or ```yaml replication: - databases: + databases: - db1 - db2 ``` @@ -258,7 +261,7 @@ replication: - QA69C7E2S ``` -`port` - _Type_: integer; +`port` - _Type_: integer; The port to use for replication connections. @@ -278,7 +281,7 @@ Replication will first attempt to catch up using the audit log. If unsuccessful, This defines the shard id of this instance and is used in conjunction with the [Table Resource functions](../developers/replication/sharding#custom-sharding) `setResidency` & `setResidencyById` to programmatically route traffic to the proper shard. -*** +--- ### `clustering` using NATS @@ -288,11 +291,11 @@ _Note: There exist two ways to create clusters and replicate data in Harper. One Clustering offers a lot of different configurations, however in a majority of cases the only options you will need to pay attention to are: -* `clustering.enabled` Enable the clustering processes. -* `clustering.hubServer.cluster.network.port` The port other nodes will connect to. This port must be accessible from other cluster nodes. -* `clustering.hubServer.cluster.network.routes`The connections to other instances. -* `clustering.nodeName` The name of your node, must be unique within the cluster. -* `clustering.user` The name of the user credentials used for Inter-node authentication. +- `clustering.enabled` Enable the clustering processes. +- `clustering.hubServer.cluster.network.port` The port other nodes will connect to. This port must be accessible from other cluster nodes. +- `clustering.hubServer.cluster.network.routes`The connections to other instances. +- `clustering.nodeName` The name of your node, must be unique within the cluster. +- `clustering.user` The name of the user credentials used for Inter-node authentication. `enabled` - _Type_: boolean; _Default_: false @@ -302,7 +305,7 @@ _Note: If you enabled clustering but do not create and add a cluster user you wi ```yaml clustering: - enabled: true + enabled: true ``` `clustering.hubServer.cluster` @@ -441,7 +444,7 @@ The maximum number of messages a consumer can process in one go. The number of Harper threads that are delegated to ingesting messages. -*** +--- `logLevel` - _Type_: string; _Default_: error @@ -503,7 +506,7 @@ When true, all transactions that are received from other nodes are republished t When true, hub server will verify client certificate using the CA certificate. -*** +--- `user` - _Type_: string; _Default_: null @@ -515,10 +518,10 @@ The user can be created either through the API using an `add_user` request with ```yaml clustering: - user: cluster_person + user: cluster_person ``` -*** +--- ### `localStudio` @@ -533,7 +536,7 @@ localStudio: enabled: false ``` -*** +--- ### `logging` @@ -554,9 +557,9 @@ To access the audit logs, use the API operation `read_audit_log`. It will provid ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog" + "operation": "read_audit_log", + "schema": "dev", + "table": "dog" } ``` @@ -668,7 +671,7 @@ logging: logSuccessful: false ``` -*** +--- ### `authentication` @@ -780,7 +783,7 @@ Path to the certificate authority file. Path to the private key file. -*** +--- ### `componentsRoot` @@ -792,7 +795,7 @@ The path to the folder containing the local component files. componentsRoot: ~/hdb/components ``` -*** +--- ### `rootPath` @@ -804,7 +807,7 @@ The Harper database and applications/API/interface are decoupled from each other rootPath: /Users/jonsnow/hdb ``` -*** +--- ### `storage` @@ -899,6 +902,7 @@ The `path` configuration sets where all database files should reside. storage: path: /users/harperdb/storage ``` + _**Note:**_ This configuration applies to all database files, which includes system tables that are used internally by Harper. For this reason if you wish to use a non default `path` value you must move any existing schemas into your `path` location. Existing schemas is likely to include the system schema which can be found at `/schema/system`. `blobPaths` - _Type_: string; _Default_: `/blobs` @@ -932,7 +936,7 @@ storage: evictionFactor: 100000 # A factor used to determine how much aggressively to evict cached entries (default) ``` -*** +--- ### `tls` @@ -968,16 +972,15 @@ tls: - certificate: ~/hdb/keys/certificate1.pem certificateAuthority: ~/hdb/keys/ca1.pem privateKey: ~/hdb/keys/privateKey1.pem - host: example.com # the host is optional, and if not provided, this certificate's common name will be used as the host name. + host: example.com # the host is optional, and if not provided, this certificate's common name will be used as the host name. - certificate: ~/hdb/keys/certificate2.pem certificateAuthority: ~/hdb/keys/ca2.pem privateKey: ~/hdb/keys/privateKey2.pem - ``` Note that a `tls` section can also be defined in the `operationsApi` section, which will override the root `tls` section for the operations API. -*** +--- ### `mqtt` @@ -1037,7 +1040,7 @@ mqtt: required: true ``` -*** +--- ### `databases` @@ -1089,20 +1092,22 @@ Using the API: ```json { - "operation": "set_configuration", - "databases": [{ - "nameOfDatabase": { - "tables": { - "nameOfTable": { - "path": "/path/to/table" - } - } - } - }] + "operation": "set_configuration", + "databases": [ + { + "nameOfDatabase": { + "tables": { + "nameOfTable": { + "path": "/path/to/table" + } + } + } + } + ] } ``` -*** +--- ### Components diff --git a/site/versioned_docs/version-4.5/deployments/harper-cli.md b/site/versioned_docs/version-4.5/deployments/harper-cli.md index 90c8e61e..e559df01 100644 --- a/site/versioned_docs/version-4.5/deployments/harper-cli.md +++ b/site/versioned_docs/version-4.5/deployments/harper-cli.md @@ -37,7 +37,7 @@ harperdb install harperdb install --TC_AGREEMENT yes --HDB_ADMIN_USERNAME HDB_ADMIN --HDB_ADMIN_PASSWORD password --ROOTPATH /tmp/hdb/ --OPERATIONSAPI_NETWORK_PORT 9925 ``` -*** +--- ### Starting Harper @@ -47,7 +47,7 @@ To start Harper after it is installed, run the following command: harperdb start ``` -*** +--- ### Stopping Harper @@ -57,7 +57,7 @@ To stop Harper once it is running, run the following command: harperdb stop ``` -*** +--- ### Restarting Harper @@ -67,7 +67,7 @@ To restart Harper once it is running, run the following command: harperdb restart ``` -*** +--- ### Getting the Harper Version @@ -77,7 +77,7 @@ To check the version of Harper that is installed run the following command: harperdb version ``` -*** +--- ### Renew self-signed certificates @@ -87,7 +87,7 @@ To renew the Harper generated self-signed certificates, run: harperdb renew-certs ``` -*** +--- ### Copy a database with compaction @@ -103,7 +103,7 @@ For example, to copy the default database: harperdb copy-db data /home/user/hdb/database/copy.mdb ``` -*** +--- ### Get all available CLI commands @@ -113,7 +113,7 @@ To display all available Harper CLI commands along with a brief description run: harperdb help ``` -*** +--- ### Get the status of Harper and clustering @@ -123,13 +123,13 @@ To display the status of the Harper process, the clustering hub and leaf process harperdb status ``` -*** +--- ### Backups Harper uses a transactional commit process that ensures that data on disk is always transactionally consistent with storage. This means that Harper maintains database integrity in the event of a crash. It also means that you can use any standard volume snapshot tool to make a backup of a Harper database. Database files are stored in the hdb/database directory. As long as the snapshot is an atomic snapshot of these database files, the data can be copied/moved back into the database directory to restore a previous backup (with Harper shut down) , and database integrity will be preserved. Note that simply copying an in-use database file (using `cp`, for example) is _not_ a snapshot, and this would progressively read data from the database at different points in time, which yields unreliable copy that likely will not be usable. Standard copying is only reliable for a database file that is not in use. -*** +--- ## Operations API through the CLI diff --git a/site/versioned_docs/version-4.5/deployments/harper-cloud/alarms.md b/site/versioned_docs/version-4.5/deployments/harper-cloud/alarms.md index 72b4e7a7..372807e5 100644 --- a/site/versioned_docs/version-4.5/deployments/harper-cloud/alarms.md +++ b/site/versioned_docs/version-4.5/deployments/harper-cloud/alarms.md @@ -8,13 +8,13 @@ Harper Cloud instance alarms are triggered when certain conditions are met. Once ### Heading Definitions -* **Alarm**: Title of the alarm. -* **Threshold**: Definition of the alarm threshold. -* **Intervals**: The number of occurrences before an alarm is triggered and the period that the metric is evaluated over. -* **Proposed Remedy**: Recommended solution to avoid the alert in the future. +- **Alarm**: Title of the alarm. +- **Threshold**: Definition of the alarm threshold. +- **Intervals**: The number of occurrences before an alarm is triggered and the period that the metric is evaluated over. +- **Proposed Remedy**: Recommended solution to avoid the alert in the future. -| Alarm | Threshold | Intervals | Proposed Remedy | -| ------- | ---------- | --------- | ------------------------------------------------------------------------------------------------------------------------------ | +| Alarm | Threshold | Intervals | Proposed Remedy | +| ------- | ---------- | --------- | --------------------------------------------------------------------------------------------------------------------------- | | Storage | > 90% Disk | 1 x 5min | [Increased storage volume](../../administration/harper-studio/instance-configuration#update-instance-storage) | | CPU | > 90% Avg | 2 x 5min | [Increase instance size for additional CPUs](../../administration/harper-studio/instance-configuration#update-instance-ram) | | Memory | > 90% RAM | 2 x 5min | [Increase instance size](../../administration/harper-studio/instance-configuration#update-instance-ram) | diff --git a/site/versioned_docs/version-4.5/deployments/harper-cloud/iops-impact.md b/site/versioned_docs/version-4.5/deployments/harper-cloud/iops-impact.md index 9a8a0732..18e9f948 100644 --- a/site/versioned_docs/version-4.5/deployments/harper-cloud/iops-impact.md +++ b/site/versioned_docs/version-4.5/deployments/harper-cloud/iops-impact.md @@ -28,15 +28,18 @@ For assistance in estimating IOPS requirements feel free to contact Harper Suppo ## Example Use Case IOPS Requirements -* **Sensor Data Collection** +- **Sensor Data Collection** - In the case of IoT sensors where data collection will be sustained, high IOPS are required. While there are not typically large queries going on in this case, there is a high volume of data being ingested. This implies that IOPS will be sustained at a high level. For example, if you are collecting 100 records per second you would expect to need roughly 3,000 IOPS just to handle the data inserts. -* **Data Analytics/BI Server** + In the case of IoT sensors where data collection will be sustained, high IOPS are required. While there are not typically large queries going on in this case, there is a high volume of data being ingested. This implies that IOPS will be sustained at a high level. For example, if you are collecting 100 records per second you would expect to need roughly 3,000 IOPS just to handle the data inserts. - Providing a server for analytics purposes typically requires a larger machine. Typically these cases involve large scale SQL joins and aggregations, which puts a large strain on reads. Harper utilizes an in-memory cache, which provides a significant performance boost on machines with large amounts of memory. However, if disparate datasets are constantly being queried and/or new data is frequently being loaded, you will find that the system still needs to have high IOPS to meet performance demand. -* **Web Services** +- **Data Analytics/BI Server** - Typical web service implementations with discrete reads and writes often do not need high IOPS to perform as expected. This is often the case in more transactional systems without the requirement for high performance load. A good rule to follow is that any Harper operation that requires a data scan will be IOPS intensive, but if these are not frequent then the EBS boost will suffice. Queries utilizing equals operations in either SQL or NoSQL do not require a scan due to Harper’s native indexing. -* **High Performance Database** + Providing a server for analytics purposes typically requires a larger machine. Typically these cases involve large scale SQL joins and aggregations, which puts a large strain on reads. Harper utilizes an in-memory cache, which provides a significant performance boost on machines with large amounts of memory. However, if disparate datasets are constantly being queried and/or new data is frequently being loaded, you will find that the system still needs to have high IOPS to meet performance demand. - Ultimately, if performance is your top priority, Harper should be run on bare metal hardware. Cloud providers offer these options at a higher cost, but they come with obvious performance improvements. +- **Web Services** + + Typical web service implementations with discrete reads and writes often do not need high IOPS to perform as expected. This is often the case in more transactional systems without the requirement for high performance load. A good rule to follow is that any Harper operation that requires a data scan will be IOPS intensive, but if these are not frequent then the EBS boost will suffice. Queries utilizing equals operations in either SQL or NoSQL do not require a scan due to Harper’s native indexing. + +- **High Performance Database** + + Ultimately, if performance is your top priority, Harper should be run on bare metal hardware. Cloud providers offer these options at a higher cost, but they come with obvious performance improvements. diff --git a/site/versioned_docs/version-4.5/deployments/harper-cloud/verizon-5g-wavelength-instances.md b/site/versioned_docs/version-4.5/deployments/harper-cloud/verizon-5g-wavelength-instances.md index 31796700..b6104f7c 100644 --- a/site/versioned_docs/version-4.5/deployments/harper-cloud/verizon-5g-wavelength-instances.md +++ b/site/versioned_docs/version-4.5/deployments/harper-cloud/verizon-5g-wavelength-instances.md @@ -28,4 +28,4 @@ AWS EBS gp2 volumes have a baseline performance level, which determines the numb Smaller gp2 volumes are perfect for trying out the functionality of Harper, and might also work well for applications that don’t perform many database transactions. For applications that perform a moderate or high number of transactions, we recommend that you use a larger Harper volume. Learn more about the [impact of IOPS on performance here](./iops-impact). -You can read more about [AWS EBS gp2 volume IOPS here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html#ebsvolumetypes\_gp2). +You can read more about [AWS EBS gp2 volume IOPS here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html#ebsvolumetypes_gp2). diff --git a/site/versioned_docs/version-4.5/deployments/install-harper/index.md b/site/versioned_docs/version-4.5/deployments/install-harper/index.md index ea2f1a45..9c6a3bda 100644 --- a/site/versioned_docs/version-4.5/deployments/install-harper/index.md +++ b/site/versioned_docs/version-4.5/deployments/install-harper/index.md @@ -55,7 +55,7 @@ npm install -g harperdb-X.X.X.tgz harperdb install Harper comes with binaries for standard AMD64/x64 or ARM64 CPU architectures on Linux, Windows (x64 only), and Mac (including Apple Silicon). However, if you are installing on a less common platform (Alpine, for example), you will need to ensure that you have build tools installed for the installation process to compile the binaries (this is handled automatically), including: -* [Go](https://go.dev/dl/): version 1.19.1 -* GCC -* Make -* Python v3.7, v3.8, v3.9, or v3.10 +- [Go](https://go.dev/dl/): version 1.19.1 +- GCC +- Make +- Python v3.7, v3.8, v3.9, or v3.10 diff --git a/site/versioned_docs/version-4.5/deployments/install-harper/linux.md b/site/versioned_docs/version-4.5/deployments/install-harper/linux.md index 93c25ec9..27a9dc79 100644 --- a/site/versioned_docs/version-4.5/deployments/install-harper/linux.md +++ b/site/versioned_docs/version-4.5/deployments/install-harper/linux.md @@ -8,7 +8,7 @@ If you wish to install locally or already have a configured server, see the basi The following is a recommended way to configure Linux and install Harper. These instructions should work reasonably well for any public cloud or on-premises Linux instance. -*** +--- These instructions assume that the following has already been completed: @@ -22,7 +22,7 @@ While you will need to access Harper through port 9925 for the administration th For this example, we will use an AWS Ubuntu Server 22.04 LTS m5.large EC2 Instance with an additional General Purpose SSD EBS volume and the default “ubuntu” user account. -*** +--- ### (Optional) LVM Configuration @@ -85,7 +85,7 @@ Run `lsblk` and note the device name of the additional volume lsblk ``` -Create an ext4 filesystem on the volume (The below commands assume the device name is nvme1n1. If you used LVM to create logical volume, replace /dev/nvme1n1 with /dev/hdb\_vg/hdb\_lv) +Create an ext4 filesystem on the volume (The below commands assume the device name is nvme1n1. If you used LVM to create logical volume, replace /dev/nvme1n1 with /dev/hdb_vg/hdb_lv) ```bash sudo mkfs.ext4 -L hdb_data /dev/nvme1n1 diff --git a/site/versioned_docs/version-4.5/deployments/upgrade-hdb-instance.md b/site/versioned_docs/version-4.5/deployments/upgrade-hdb-instance.md index 7d5662cc..768b9323 100644 --- a/site/versioned_docs/version-4.5/deployments/upgrade-hdb-instance.md +++ b/site/versioned_docs/version-4.5/deployments/upgrade-hdb-instance.md @@ -12,10 +12,11 @@ Upgrading Harper is a two-step process. First the latest version of Harper must 1. Install the latest version of Harper using `npm install -g harperdb`. - Note `-g` should only be used if you installed Harper globally (which is recommended). + Note `-g` should only be used if you installed Harper globally (which is recommended). + 1. Run `harperdb` to initiate the upgrade process. - Harper will then prompt you for all appropriate inputs and then run the upgrade directives. + Harper will then prompt you for all appropriate inputs and then run the upgrade directives. ## Node Version Manager (nvm) @@ -89,7 +90,7 @@ Start Harper harperdb start ``` -*** +--- ## Upgrading Nats to Plexus 4.4 @@ -103,8 +104,8 @@ To enable Plexus on a node that is already running NATS, you will need to update ```yaml replication: - url: wss://my-cluster-node-1:9925 - hostname: node-1 + url: wss://my-cluster-node-1:9925 + hostname: node-1 ``` `replication.url` – This should be set to the URL of the current Harper instance. @@ -114,22 +115,22 @@ replication: ### Upgrade Steps 1. Set up the bridge node: - * Choose one node to be the bridge node. - * On this node, follow the "Enabling Plexus" steps from the previous section, but **do not disable NATS clustering on this instance.** - * Stop the instance and perform the upgrade. - * Start the instance. This node should now be running both Plexus and NATS. + - Choose one node to be the bridge node. + - On this node, follow the "Enabling Plexus" steps from the previous section, but **do not disable NATS clustering on this instance.** + - Stop the instance and perform the upgrade. + - Start the instance. This node should now be running both Plexus and NATS. 1. Upgrade a node: - * Choose a node that needs upgrading and enable Plexus by following the "Enable Plexus" steps. - * Disable NATS by setting `clustering.enabled` to `false`. - * Stop the instance and upgrade it. - * Start the instance. - * Call [`add_node`](../developers/operations-api/clustering#add-node) on the upgraded instance. In this call, omit `subscriptions` so that a fully replicating cluster is built. The target node for this call should be the bridge node. _Note: depending on your setup, you may need to expand this `add_node` call to include_ [_authorization and/or tls information_](../developers/operations-api/clustering#add-node)_._ + - Choose a node that needs upgrading and enable Plexus by following the "Enable Plexus" steps. + - Disable NATS by setting `clustering.enabled` to `false`. + - Stop the instance and upgrade it. + - Start the instance. + - Call [`add_node`](../developers/operations-api/clustering#add-node) on the upgraded instance. In this call, omit `subscriptions` so that a fully replicating cluster is built. The target node for this call should be the bridge node. _Note: depending on your setup, you may need to expand this `add_node` call to include_ [_authorization and/or tls information_](../developers/operations-api/clustering#add-node)_._ ```json { - "operation": "add_node", - "hostname:": "node-1", - "url": "wss://my-cluster-node-1:9925" + "operation": "add_node", + "hostname:": "node-1", + "url": "wss://my-cluster-node-1:9925" } ``` diff --git a/site/versioned_docs/version-4.5/developers/_category_.json b/site/versioned_docs/version-4.5/developers/_category_.json index 9fe399bf..fdc723e5 100644 --- a/site/versioned_docs/version-4.5/developers/_category_.json +++ b/site/versioned_docs/version-4.5/developers/_category_.json @@ -1,12 +1,10 @@ { - "label": "Developers", - "position": 1, - "link": { - "type": "generated-index", - "title": "Developers Documentation", - "description": "Comprehensive guides and references for building applications with HarperDB", - "keywords": [ - "developers" - ] - } -} \ No newline at end of file + "label": "Developers", + "position": 1, + "link": { + "type": "generated-index", + "title": "Developers Documentation", + "description": "Comprehensive guides and references for building applications with HarperDB", + "keywords": ["developers"] + } +} diff --git a/site/versioned_docs/version-4.5/developers/applications/caching.md b/site/versioned_docs/version-4.5/developers/applications/caching.md index ddd3c8ec..29fec826 100644 --- a/site/versioned_docs/version-4.5/developers/applications/caching.md +++ b/site/versioned_docs/version-4.5/developers/applications/caching.md @@ -21,9 +21,10 @@ You may also note that we can define a time-to-live (TTL) expiration on the tabl While you can provide a single expiration time, there are actually several expiration timings that are potentially relevant, and can be independently configured. These settings are available as directive properties on the table configuration (like `expiration` above): stale expiration: The point when a request for a record should trigger a request to origin (but might possibly return the current stale record depending on policy) must-revalidate expiration: The point when a request for a record must make a request to origin first and return the latest value from origin. eviction expiration: The point when a record is actually removed from the caching table. You can provide a single expiration and it defines the behavior for all three. You can also provide three settings for expiration, through table directives: -* expiration - The amount of time until a record goes stale. -* eviction - The amount of time after expiration before a record can be evicted (defaults to zero). -* scanInterval - The interval for scanning for expired records (defaults to one quarter of the total of expiration and eviction). + +- expiration - The amount of time until a record goes stale. +- eviction - The amount of time after expiration before a record can be evicted (defaults to zero). +- scanInterval - The interval for scanning for expired records (defaults to one quarter of the total of expiration and eviction). ## Define External Data Source @@ -32,8 +33,8 @@ Next, you need to define the source for your cache. External data sources could ```javascript class ThirdPartyAPI extends Resource { async get() { - return (await fetch(`https://some-api.com/${this.getId()}`)).json(); - } + return (await fetch(`https://some-api.com/${this.getId()}`)).json(); + } } ``` @@ -68,11 +69,11 @@ In the example above, we simply retrieved data to fulfill a cache request. We ma ```javascript class ThirdPartyAPI extends Resource { - async get() { - let response = await fetch(`https://some-api.com/${this.getId()}`); - this.getContext().lastModified = response.headers.get('Last-Modified'); - return response.json(); - } + async get() { + let response = await fetch(`https://some-api.com/${this.getId()}`); + this.getContext().lastModified = response.headers.get('Last-Modified'); + return response.json(); + } } ``` @@ -108,10 +109,11 @@ One way to provide more active caching is to specifically invalidate individual ```javascript const { MyTable } = tables; export class MyTableEndpoint extends MyTable { - async post(data) { - if (data.invalidate) // use this flag as a marker - this.invalidate(); - } + async post(data) { + if (data.invalidate) + // use this flag as a marker + this.invalidate(); + } } ``` @@ -142,20 +144,20 @@ class ThirdPartyAPI extends Resource { Notification events should always include an `id` property to indicate the primary key of the updated record. The event should have a `value` property for `put` and `message` event types. The `timestamp` is optional and can be used to indicate the exact timestamp of the change. The following event `type`s are supported: -* `put` - This indicates that the record has been updated and provides the new value of the record. -* `invalidate` - Alternately, you can notify with an event type of `invalidate` to indicate that the data has changed, but without the overhead of actually sending the data (the `value` property is not needed), so the data only needs to be sent if and when the data is requested through the cache. An `invalidate` will evict the entry and update the timestamp to indicate that there is new data that should be requested (if needed). -* `delete` - This indicates that the record has been deleted. -* `message` - This indicates a message is being passed through the record. The record value has not changed, but this is used for [publish/subscribe messaging](../real-time). -* `transaction` - This indicates that there are multiple writes that should be treated as a single atomic transaction. These writes should be included as an array of data notification events in the `writes` property. +- `put` - This indicates that the record has been updated and provides the new value of the record. +- `invalidate` - Alternately, you can notify with an event type of `invalidate` to indicate that the data has changed, but without the overhead of actually sending the data (the `value` property is not needed), so the data only needs to be sent if and when the data is requested through the cache. An `invalidate` will evict the entry and update the timestamp to indicate that there is new data that should be requested (if needed). +- `delete` - This indicates that the record has been deleted. +- `message` - This indicates a message is being passed through the record. The record value has not changed, but this is used for [publish/subscribe messaging](../real-time). +- `transaction` - This indicates that there are multiple writes that should be treated as a single atomic transaction. These writes should be included as an array of data notification events in the `writes` property. And the following properties can be defined on event objects: -* `type`: The event type as described above. -* `id`: The primary key of the record that updated -* `value`: The new value of the record that updated (for put and message) -* `writes`: An array of event properties that are part of a transaction (used in conjunction with the transaction event type). -* `table`: The name of the table with the record that was updated. This can be used with events within a transaction to specify events across multiple tables. -* `timestamp`: The timestamp of when the data change occurred +- `type`: The event type as described above. +- `id`: The primary key of the record that updated +- `value`: The new value of the record that updated (for put and message) +- `writes`: An array of event properties that are part of a transaction (used in conjunction with the transaction event type). +- `table`: The name of the table with the record that was updated. This can be used with events within a transaction to specify events across multiple tables. +- `timestamp`: The timestamp of when the data change occurred With an active external data source with a `subscribe` method, the data source will proactively notify the cache, ensuring a fresh and efficient active cache. Note that with an active data source, we still use the `sourcedFrom` method to register the source for a caching table, and the table will automatically detect and call the subscribe method on the data source. @@ -174,13 +176,13 @@ An alternative to using asynchronous generators is to use a subscription stream ```javascript class ThirdPartyAPI extends Resource { - subscribe() { - const subscription = super.subscribe(); - setupListeningToRemoteService().on('update', (event) => { - subscription.send(event); - }); - return subscription; - } + subscribe() { + const subscription = super.subscribe(); + setupListeningToRemoteService().on('update', (event) => { + subscription.send(event); + }); + return subscription; + } } ``` @@ -216,12 +218,12 @@ When you are using a caching table, it is important to remember that any resourc ```javascript class MyCache extends tables.MyCache { - async post(data) { - // if the data is not cached locally, retrieves from source: - await this.ensuredLoaded(); - // now we can be sure that the data is loaded, and can access properties - this.quantity = this.quantity - data.purchases; - } + async post(data) { + // if the data is not cached locally, retrieves from source: + await this.ensuredLoaded(); + // now we can be sure that the data is loaded, and can access properties + this.quantity = this.quantity - data.purchases; + } } ``` @@ -267,21 +269,24 @@ Cache-Control: only-if-cached, no-store You may also use the `stale-if-error` to indicate if it is acceptable to return a stale cached resource when the data source returns an error (network connection error, 500, 502, 503, or 504). The `must-revalidate` directive can indicate a stale cached resource can not be returned, even when the data source has an error (by default a stale cached resource is returned when there is a network connection error). - ## Caching Flow + It may be helpful to understand the flow of a cache request. When a request is made to a caching table: -* Harper will first create a resource instance to handle the process, and ensure that the data is loaded for the resource instance. To do this, it will first check if the record is in the table/cache. - * If the record is not in the cache, Harper will first check if there is a current request to get the record from the source. If there is, Harper will wait for the request to complete and return the record from the cache. - * If not, Harper will call the `get()` method on the source to retrieve the record. The record will then be stored in the cache. - * If the record is in the cache, Harper will check if the record is stale. If the record is not stale, Harper will immediately return the record from the cache. If the record is stale, Harper will call the `get()` method on the source to retrieve the record. - * The record will then be stored in the cache. This will write the record to the cache in a separate asynchronous/background write-behind transaction, so it does not block the current request, then return the data immediately once it has it. -* The `get()` method will be called on the resource instance to return the record to the client (or perform any querying on the record). If this is overriden, the method will be called at this time. + +- Harper will first create a resource instance to handle the process, and ensure that the data is loaded for the resource instance. To do this, it will first check if the record is in the table/cache. + - If the record is not in the cache, Harper will first check if there is a current request to get the record from the source. If there is, Harper will wait for the request to complete and return the record from the cache. + - If not, Harper will call the `get()` method on the source to retrieve the record. The record will then be stored in the cache. + - If the record is in the cache, Harper will check if the record is stale. If the record is not stale, Harper will immediately return the record from the cache. If the record is stale, Harper will call the `get()` method on the source to retrieve the record. + - The record will then be stored in the cache. This will write the record to the cache in a separate asynchronous/background write-behind transaction, so it does not block the current request, then return the data immediately once it has it. +- The `get()` method will be called on the resource instance to return the record to the client (or perform any querying on the record). If this is overriden, the method will be called at this time. ### Caching Flow with Write-Through + When a writes are performed on a caching table (in `put()` or `post()` method, for example), the flow is slightly different: -* Harper will have first created a resource instance to handle the process, and this resource instance that will be the current `this` for a call to `put()` or `post()`. -* If a `put()` or `update()` is called, for example, this action will be record in the current transaction. -* Once the transaction is committed (which is done automatically as the request handler completes), the transaction write will be sent to the source to update the data. - * The local writes will wait for the source to confirm the writes have completed (note that this effectively allows you to perform a two-phase transactional write to the source, and the source can confirm the writes have completed before the transaction is committed locally). - * The transaction writes will then be written the local caching table. -* The transaction handler will wait for the local commit to be written, then the transaction will be resolved and a response will be sent to the client. + +- Harper will have first created a resource instance to handle the process, and this resource instance that will be the current `this` for a call to `put()` or `post()`. +- If a `put()` or `update()` is called, for example, this action will be record in the current transaction. +- Once the transaction is committed (which is done automatically as the request handler completes), the transaction write will be sent to the source to update the data. + - The local writes will wait for the source to confirm the writes have completed (note that this effectively allows you to perform a two-phase transactional write to the source, and the source can confirm the writes have completed before the transaction is committed locally). + - The transaction writes will then be written the local caching table. +- The transaction handler will wait for the local commit to be written, then the transaction will be resolved and a response will be sent to the client. diff --git a/site/versioned_docs/version-4.5/developers/applications/debugging.md b/site/versioned_docs/version-4.5/developers/applications/debugging.md index c7c085bf..bd9d2622 100644 --- a/site/versioned_docs/version-4.5/developers/applications/debugging.md +++ b/site/versioned_docs/version-4.5/developers/applications/debugging.md @@ -18,13 +18,13 @@ For local debugging and development, it is recommended that you use standard con Harper Logger Functions -* `trace(message)`: Write a 'trace' level log, if the configured level allows for it. -* `debug(message)`: Write a 'debug' level log, if the configured level allows for it. -* `info(message)`: Write a 'info' level log, if the configured level allows for it. -* `warn(message)`: Write a 'warn' level log, if the configured level allows for it. -* `error(message)`: Write a 'error' level log, if the configured level allows for it. -* `fatal(message)`: Write a 'fatal' level log, if the configured level allows for it. -* `notify(message)`: Write a 'notify' level log. +- `trace(message)`: Write a 'trace' level log, if the configured level allows for it. +- `debug(message)`: Write a 'debug' level log, if the configured level allows for it. +- `info(message)`: Write a 'info' level log, if the configured level allows for it. +- `warn(message)`: Write a 'warn' level log, if the configured level allows for it. +- `error(message)`: Write a 'error' level log, if the configured level allows for it. +- `fatal(message)`: Write a 'fatal' level log, if the configured level allows for it. +- `notify(message)`: Write a 'notify' level log. For example, you can log a warning: diff --git a/site/versioned_docs/version-4.5/developers/applications/define-routes.md b/site/versioned_docs/version-4.5/developers/applications/define-routes.md index 3dd91c18..720f4f06 100644 --- a/site/versioned_docs/version-4.5/developers/applications/define-routes.md +++ b/site/versioned_docs/version-4.5/developers/applications/define-routes.md @@ -16,23 +16,23 @@ fastifyRoutes: # This loads files that define fastify routes using fastify's aut By default, route URLs are configured to be: -* \[**Instance URL**]:\[**HTTP Port**]/\[**Project Name**]/\[**Route URL**] +- \[**Instance URL**]:\[**HTTP Port**]/\[**Project Name**]/\[**Route URL**] However, you can specify the path to be `/` if you wish to have your routes handling the root path of incoming URLs. -* The route below, using the default config, within the **dogs** project, with a route of **breeds** would be available at **http:/localhost:9926/dogs/breeds**. +- The route below, using the default config, within the **dogs** project, with a route of **breeds** would be available at **http:/localhost:9926/dogs/breeds**. In effect, this route is just a pass-through to Harper. The same result could have been achieved by hitting the core Harper API, since it uses **hdbCore.preValidation** and **hdbCore.request**, which are defined in the “helper methods” section, below. ```javascript export default async (server, { hdbCore, logger }) => { - server.route({ - url: '/', - method: 'POST', - preValidation: hdbCore.preValidation, - handler: hdbCore.request, - }) -} + server.route({ + url: '/', + method: 'POST', + preValidation: hdbCore.preValidation, + handler: hdbCore.request, + }); +}; ``` ## Custom Handlers @@ -69,20 +69,20 @@ Below is an example of a route that uses a custom validation hook: import customValidation from '../helpers/customValidation'; export default async (server, { hdbCore, logger }) => { - server.route({ - url: '/:id', - method: 'GET', - preValidation: (request) => customValidation(request, logger), - handler: (request) => { - request.body= { - operation: 'sql', - sql: `SELECT * FROM dev.dog WHERE id = ${request.params.id}` - }; - - return hdbCore.requestWithoutAuthentication(request); - } - }); -} + server.route({ + url: '/:id', + method: 'GET', + preValidation: (request) => customValidation(request, logger), + handler: (request) => { + request.body = { + operation: 'sql', + sql: `SELECT * FROM dev.dog WHERE id = ${request.params.id}`, + }; + + return hdbCore.requestWithoutAuthentication(request); + }, + }); +}; ``` Notice we imported customValidation from the **helpers** directory. To include a helper, and to see the actual code within customValidation, see [Helper Methods](./define-routes#helper-methods). @@ -95,24 +95,25 @@ When declaring routes, you are given access to 2 helper methods: hdbCore and log hdbCore contains three functions that allow you to authenticate an inbound request, and execute operations against Harper directly, by passing the standard Operations API. -* **preValidation** +- **preValidation** + + This is an array of functions used for fastify authentication. The second function takes the authorization header from the inbound request and executes the same authentication as the standard Harper Operations API (for example, `hdbCore.preValidation[1](./req, resp, callback)`). It will determine if the user exists, and if they are allowed to perform this operation. **If you use the request method, you have to use preValidation to get the authenticated user**. - This is an array of functions used for fastify authentication. The second function takes the authorization header from the inbound request and executes the same authentication as the standard Harper Operations API (for example, `hdbCore.preValidation[1](./req, resp, callback)`). It will determine if the user exists, and if they are allowed to perform this operation. **If you use the request method, you have to use preValidation to get the authenticated user**. -* **request** +- **request** - This will execute a request with Harper using the operations API. The `request.body` should contain a standard Harper operation and must also include the `hdb_user` property that was in `request.body` provided in the callback. -* **requestWithoutAuthentication** + This will execute a request with Harper using the operations API. The `request.body` should contain a standard Harper operation and must also include the `hdb_user` property that was in `request.body` provided in the callback. - Executes a request against Harper without any security checks around whether the inbound user is allowed to make this request. For security purposes, you should always take the following precautions when using this method: +- **requestWithoutAuthentication** - * Properly handle user-submitted values, including url params. User-submitted values should only be used for `search_value` and for defining values in records. Special care should be taken to properly escape any values if user-submitted values are used for SQL. + Executes a request against Harper without any security checks around whether the inbound user is allowed to make this request. For security purposes, you should always take the following precautions when using this method: + - Properly handle user-submitted values, including url params. User-submitted values should only be used for `search_value` and for defining values in records. Special care should be taken to properly escape any values if user-submitted values are used for SQL. **logger** This helper allows you to write directly to the log file, hdb.log. It’s useful for debugging during development, although you may also use the console logger. There are 5 functions contained within logger, each of which pertains to a different **logging.level** configuration in your harperdb-config.yaml file. -* logger.trace(‘Starting the handler for /dogs’) -* logger.debug(‘This should only fire once’) -* logger.warn(‘This should never ever fire’) -* logger.error(‘This did not go well’) -* logger.fatal(‘This did not go very well at all’) +- logger.trace(‘Starting the handler for /dogs’) +- logger.debug(‘This should only fire once’) +- logger.warn(‘This should never ever fire’) +- logger.error(‘This did not go well’) +- logger.fatal(‘This did not go very well at all’) diff --git a/site/versioned_docs/version-4.5/developers/applications/defining-roles.md b/site/versioned_docs/version-4.5/developers/applications/defining-roles.md index d6c766fc..55dd5885 100644 --- a/site/versioned_docs/version-4.5/developers/applications/defining-roles.md +++ b/site/versioned_docs/version-4.5/developers/applications/defining-roles.md @@ -8,7 +8,9 @@ In addition to [defining a database schema](./defining-schemas), you can also de roles: files: roles.yaml ``` + Now you can create a roles.yaml in your application directory: + ```yaml declared-role: super_user: false # This is a boolean value that indicates if the role is a super user or not @@ -32,12 +34,13 @@ declared-role: With this in place, where Harper starts up, it will create the roles in the roles.yaml file if they do not already exist. If they do exist, it will update the roles with the new permissions. This allows you to manage your roles in your application code and have them automatically created or updated when the application starts. The structure of the roles.yaml file is: + ```yaml : permission: # contains the permissions for the role, this structure is optional, and you can place flags like super_user here as a shortcut super_user: : # each database with permissions can be added as named properties on the role - tables: # this structure is optional, and table names can be placed directly under the database as a shortcut + tables: # this structure is optional, and table names can be placed directly under the database as a shortcut : read: # indicates if the role has read permission to this table insert: # indicates if the role has insert permission to this table @@ -48,4 +51,4 @@ The structure of the roles.yaml file is: read: insert: update: -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.5/developers/applications/defining-schemas.md b/site/versioned_docs/version-4.5/developers/applications/defining-schemas.md index f5fe86a0..e1c16f18 100644 --- a/site/versioned_docs/version-4.5/developers/applications/defining-schemas.md +++ b/site/versioned_docs/version-4.5/developers/applications/defining-schemas.md @@ -40,10 +40,10 @@ type TableName @table By default the table name is inherited from the type name (in this case the table name would be "TableName"). The `@table` directive supports several optional arguments (all of these are optional and can be freely combined): -* `@table(table: "table_name")` - This allows you to explicitly specify the table name. -* `@table(database: "database_name")` - This allows you to specify which database the table belongs to. This defaults to the "data" database. -* `@table(expiration: 3600)` - Sets an expiration time on entries in the table before they are automatically cleared (primarily useful for caching tables). This is specified in seconds. -* `@table(audit: true)` - This enables the audit log for the table so that a history of record changes are recorded. This defaults to [configuration file's setting for `auditLog`](../../deployments/configuration#logging). +- `@table(table: "table_name")` - This allows you to explicitly specify the table name. +- `@table(database: "database_name")` - This allows you to specify which database the table belongs to. This defaults to the "data" database. +- `@table(expiration: 3600)` - Sets an expiration time on entries in the table before they are automatically cleared (primarily useful for caching tables). This is specified in seconds. +- `@table(audit: true)` - This enables the audit log for the table so that a history of record changes are recorded. This defaults to [configuration file's setting for `auditLog`](../../deployments/configuration#logging). Database naming: the default "data" database is generally a good default choice for tables in applications that will not be reused in other applications (and don't need to worry about staying in a separate namespace). Application with many tables may wish to organize the tables into separate databases (but remember that transactions do not preserve atomicity across different databases, only across tables in the same database). For components that are designed for re-use, it is recommended that you use a database name that is specific to the component (e.g. "my-component-data") to avoid name collisions with other components. @@ -136,7 +136,7 @@ type Product @table { ```javascript tables.Product.setComputedAttribute('totalPrice', (record) => { - return record.price + (record.price * record.taxRate); + return record.price + record.price * record.taxRate; }); ``` @@ -171,7 +171,7 @@ The field directives can be used for information about each attribute in table t #### `@primaryKey` -The `@primaryKey` directive specifies that an attribute is the primary key for a table. These must be unique and when records are created, this will be auto-generated if no primary key is provided. When a primary key is auto-generated, it will be a UUID (as a string) if the primary key type is `String` or `ID`. If the primary key type is `Int`, `Long`, or `Any`, then the primary key will be an auto-incremented number. Using numeric primary keys is more efficient than using UUIDs. Note that if the type is `Int`, the primary key will be limited to 32-bit, which can be limiting and problematic for large tables. It is recommended that if you will be relying on auto-generated keys, that you use a primary key type of `Long` or `Any` (the latter will allow you to also use strings as primary keys). +The `@primaryKey` directive specifies that an attribute is the primary key for a table. These must be unique and when records are created, this will be auto-generated if no primary key is provided. When a primary key is auto-generated, it will be a UUID (as a string) if the primary key type is `String` or `ID`. If the primary key type is `Int`, `Long`, or `Any`, then the primary key will be an auto-incremented number. Using numeric primary keys is more efficient than using UUIDs. Note that if the type is `Int`, the primary key will be limited to 32-bit, which can be limiting and problematic for large tables. It is recommended that if you will be relying on auto-generated keys, that you use a primary key type of `Long` or `Any` (the latter will allow you to also use strings as primary keys). #### `@indexed` @@ -197,17 +197,17 @@ If you do not define a schema for a table and create a table through the operati Harper supports the following field types in addition to user defined (object) types: -* `String`: String/text -* `Int`: A 32-bit signed integer (from -2147483648 to 2147483647) -* `Long`: A 54-bit signed integer (from -9007199254740992 to 9007199254740992) -* `Float`: Any number (any number that can be represented as a [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision\_floating-point\_format). Note that all numbers are stored in the most compact representation available) -* `BigInt`: Any integer (negative or positive) with less than 300 digits (Note that `BigInt` is a distinct and separate type from standard numbers in JavaScript, so custom code should handle this type appropriately) -* `Boolean`: true or false -* `ID`: A string (but indicates it is not intended to be human readable) -* `Any`: Any primitive, object, or array is allowed -* `Date`: A Date object -* `Bytes`: Binary data as a Buffer or Uint8Array -* `Blob`: Binary data as a [Blob](../../technical-details/reference/blob), designed for large blocks of data that can be streamed. It is recommend that you use this for binary data that will typically be larger than 20KB. +- `String`: String/text +- `Int`: A 32-bit signed integer (from -2147483648 to 2147483647) +- `Long`: A 54-bit signed integer (from -9007199254740992 to 9007199254740992) +- `Float`: Any number (any number that can be represented as a [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision_floating-point_format). Note that all numbers are stored in the most compact representation available) +- `BigInt`: Any integer (negative or positive) with less than 300 digits (Note that `BigInt` is a distinct and separate type from standard numbers in JavaScript, so custom code should handle this type appropriately) +- `Boolean`: true or false +- `ID`: A string (but indicates it is not intended to be human readable) +- `Any`: Any primitive, object, or array is allowed +- `Date`: A Date object +- `Bytes`: Binary data as a Buffer or Uint8Array +- `Blob`: Binary data as a [Blob](../../technical-details/reference/blob), designed for large blocks of data that can be streamed. It is recommend that you use this for binary data that will typically be larger than 20KB. #### Renaming Tables diff --git a/site/versioned_docs/version-4.5/developers/applications/example-projects.md b/site/versioned_docs/version-4.5/developers/applications/example-projects.md index c3e23aae..3c2342a3 100644 --- a/site/versioned_docs/version-4.5/developers/applications/example-projects.md +++ b/site/versioned_docs/version-4.5/developers/applications/example-projects.md @@ -6,32 +6,32 @@ title: Example Projects **Library of example Harper applications and components:** -* [Authorization in Harper using Okta Customer Identity Cloud](https://www.harperdb.io/post/authorization-in-harperdb-using-okta-customer-identity-cloud), by Yitaek Hwang +- [Authorization in Harper using Okta Customer Identity Cloud](https://www.harperdb.io/post/authorization-in-harperdb-using-okta-customer-identity-cloud), by Yitaek Hwang -* [How to Speed Up your Applications by Caching at the Edge with Harper](https://dev.to/doabledanny/how-to-speed-up-your-applications-by-caching-at-the-edge-with-harperdb-3o2l), by Danny Adams +- [How to Speed Up your Applications by Caching at the Edge with Harper](https://dev.to/doabledanny/how-to-speed-up-your-applications-by-caching-at-the-edge-with-harperdb-3o2l), by Danny Adams -* [OAuth Authentication in Harper using Auth0 & Node.js](https://www.harperdb.io/post/oauth-authentication-in-harperdb-using-auth0-and-node-js), by Lucas Santos +- [OAuth Authentication in Harper using Auth0 & Node.js](https://www.harperdb.io/post/oauth-authentication-in-harperdb-using-auth0-and-node-js), by Lucas Santos -* [How To Create a CRUD API with Next.js & Harper Custom Functions](https://www.harperdb.io/post/create-a-crud-api-w-next-js-harperdb), by Colby Fayock +- [How To Create a CRUD API with Next.js & Harper Custom Functions](https://www.harperdb.io/post/create-a-crud-api-w-next-js-harperdb), by Colby Fayock -* [Build a Dynamic REST API with Custom Functions](https://harperdb.io/blog/build-a-dynamic-rest-api-with-custom-functions/), by Terra Roush +- [Build a Dynamic REST API with Custom Functions](https://harperdb.io/blog/build-a-dynamic-rest-api-with-custom-functions/), by Terra Roush -* [How to use Harper Custom Functions to Build your Entire Backend](https://dev.to/andrewbaisden/how-to-use-harperdb-custom-functions-to-build-your-entire-backend-a2m), by Andrew Baisden +- [How to use Harper Custom Functions to Build your Entire Backend](https://dev.to/andrewbaisden/how-to-use-harperdb-custom-functions-to-build-your-entire-backend-a2m), by Andrew Baisden -* [Using TensorFlowJS & Harper Custom Functions for Machine Learning](https://harperdb.io/blog/using-tensorflowjs-harperdb-for-machine-learning/), by Kevin Ashcraft +- [Using TensorFlowJS & Harper Custom Functions for Machine Learning](https://harperdb.io/blog/using-tensorflowjs-harperdb-for-machine-learning/), by Kevin Ashcraft -* [Build & Deploy a Fitness App with Python & Harper](https://www.youtube.com/watch?v=KMkmA4i2FQc), by Patrick Löber +- [Build & Deploy a Fitness App with Python & Harper](https://www.youtube.com/watch?v=KMkmA4i2FQc), by Patrick Löber -* [Create a Discord Slash Bot using Harper Custom Functions](https://geekysrm.hashnode.dev/discord-slash-bot-with-harperdb-custom-functions), by Soumya Ranjan Mohanty +- [Create a Discord Slash Bot using Harper Custom Functions](https://geekysrm.hashnode.dev/discord-slash-bot-with-harperdb-custom-functions), by Soumya Ranjan Mohanty -* [How I used Harper Custom Functions to Build a Web App for my Newsletter](https://blog.hrithwik.me/how-i-used-harperdb-custom-functions-to-build-a-web-app-for-my-newsletter), by Hrithwik Bharadwaj +- [How I used Harper Custom Functions to Build a Web App for my Newsletter](https://blog.hrithwik.me/how-i-used-harperdb-custom-functions-to-build-a-web-app-for-my-newsletter), by Hrithwik Bharadwaj -* [How I used Harper Custom Functions and Recharts to create Dashboard](https://blog.greenroots.info/how-to-create-dashboard-with-harperdb-custom-functions-and-recharts), by Tapas Adhikary +- [How I used Harper Custom Functions and Recharts to create Dashboard](https://blog.greenroots.info/how-to-create-dashboard-with-harperdb-custom-functions-and-recharts), by Tapas Adhikary -* [How To Use Harper Custom Functions With Your React App](https://dev.to/tyaga001/how-to-use-harperdb-custom-functions-with-your-react-app-2c43), by Ankur Tyagi +- [How To Use Harper Custom Functions With Your React App](https://dev.to/tyaga001/how-to-use-harperdb-custom-functions-with-your-react-app-2c43), by Ankur Tyagi -* [Build a Web App Using Harper’s Custom Functions](https://www.youtube.com/watch?v=rz6prItVJZU), livestream by Jaxon Repp +- [Build a Web App Using Harper’s Custom Functions](https://www.youtube.com/watch?v=rz6prItVJZU), livestream by Jaxon Repp -* [How to Web Scrape Using Python, Snscrape & Custom Functions](https://hackernoon.com/how-to-web-scrape-using-python-snscrape-and-harperdb), by Davis David +- [How to Web Scrape Using Python, Snscrape & Custom Functions](https://hackernoon.com/how-to-web-scrape-using-python-snscrape-and-harperdb), by Davis David -* [What’s the Big Deal w/ Custom Functions](https://rss.com/podcasts/harperdb-select-star/278933/), Select* Podcast +- [What’s the Big Deal w/ Custom Functions](https://rss.com/podcasts/harperdb-select-star/278933/), Select\* Podcast diff --git a/site/versioned_docs/version-4.5/developers/applications/index.md b/site/versioned_docs/version-4.5/developers/applications/index.md index 01a84fc0..b4725af8 100644 --- a/site/versioned_docs/version-4.5/developers/applications/index.md +++ b/site/versioned_docs/version-4.5/developers/applications/index.md @@ -84,8 +84,7 @@ Here we have focused on customizing how we retrieve data, but we may also want t ```javascript export class CustomDog extends Dog { async post(data) { - if (data.action === 'add-trick') - this.tricks.push(data.trick); + if (data.action === 'add-trick') this.tricks.push(data.trick); } } ``` @@ -122,9 +121,10 @@ We can also directly implement the Resource class and use it to create new data ```javascript const { Breed } = tables; // our Breed table -class BreedSource extends Resource { // define a data source +class BreedSource extends Resource { + // define a data source async get() { - return (await fetch(`https://best-dog-site.com/${this.getId()}`)).json(); + return (await fetch(`https://best-dog-site.com/${this.getId()}`)).json(); } } // define that our breed table is a cache of data from the data source above, with a specified expiration @@ -143,10 +143,10 @@ This config file allows you define a location for static files, as well (that ar Each configuration entry can have the following properties, in addition to properties that may be specific to the individual component: -* `files`: This specifies the set of files that should be handled the component. This is a glob pattern, so a set of files can be specified like "directory/**". -* `path`: This is the URL path that is handled by this component. -* `root`: This specifies the root directory for mapping file paths to the URLs. For example, if you want all the files in `web/**` to be available in the root URL path via the static handler, you could specify a root of `web`, to indicate that the web directory maps to the root URL path. -* `package`: This is used to specify that this component is a third party package, and can be loaded from the specified package reference (which can be an NPM package, Github reference, URL, etc.). +- `files`: This specifies the set of files that should be handled the component. This is a glob pattern, so a set of files can be specified like "directory/\*\*". +- `path`: This is the URL path that is handled by this component. +- `root`: This specifies the root directory for mapping file paths to the URLs. For example, if you want all the files in `web/**` to be available in the root URL path via the static handler, you could specify a root of `web`, to indicate that the web directory maps to the root URL path. +- `package`: This is used to specify that this component is a third party package, and can be loaded from the specified package reference (which can be an NPM package, Github reference, URL, etc.). ## Define Fastify Routes diff --git a/site/versioned_docs/version-4.5/developers/clustering/certificate-management.md b/site/versioned_docs/version-4.5/developers/clustering/certificate-management.md index 11ff0a6c..43839a4b 100644 --- a/site/versioned_docs/version-4.5/developers/clustering/certificate-management.md +++ b/site/versioned_docs/version-4.5/developers/clustering/certificate-management.md @@ -34,7 +34,7 @@ Since these new certificates can be issued with correct CNs, you should set `ins ### Certificate Requirements -* Certificates must have an `Extended Key Usage` that defines both `TLS Web Server Authentication` and `TLS Web Client Authentication` as these certificates will be used to accept connections from other Harper nodes and to make requests to other Harper nodes. Example: +- Certificates must have an `Extended Key Usage` that defines both `TLS Web Server Authentication` and `TLS Web Client Authentication` as these certificates will be used to accept connections from other Harper nodes and to make requests to other Harper nodes. Example: ``` X509v3 Key Usage: critical @@ -43,8 +43,8 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication ``` -* If you are using an intermediate CA to issue the certificates, the entire certificate chain (to the root CA) must be included in the `certificateAuthority` file. -* If your certificates expire you will need a way to issue new certificates to the nodes and then restart Harper. If you are using a public CA such as LetsEncrypt, a tool like `certbot` can be used to renew certificates. +- If you are using an intermediate CA to issue the certificates, the entire certificate chain (to the root CA) must be included in the `certificateAuthority` file. +- If your certificates expire you will need a way to issue new certificates to the nodes and then restart Harper. If you are using a public CA such as LetsEncrypt, a tool like `certbot` can be used to renew certificates. ### Certificate Troubleshooting diff --git a/site/versioned_docs/version-4.5/developers/clustering/creating-a-cluster-user.md b/site/versioned_docs/version-4.5/developers/clustering/creating-a-cluster-user.md index 5569ff04..0a8b2a6c 100644 --- a/site/versioned_docs/version-4.5/developers/clustering/creating-a-cluster-user.md +++ b/site/versioned_docs/version-4.5/developers/clustering/creating-a-cluster-user.md @@ -16,11 +16,11 @@ There are multiple ways a `cluster_user` can be created, they are: ```json { - "operation": "add_user", - "role": "cluster_user", - "username": "cluster_account", - "password": "letsCluster123!", - "active": true + "operation": "add_user", + "role": "cluster_user", + "username": "cluster_account", + "password": "letsCluster123!", + "active": true } ``` @@ -30,8 +30,8 @@ This can be done through the API by calling `set_configuration` or by editing th ```json { - "operation": "set_configuration", - "clustering_user": "cluster_account" + "operation": "set_configuration", + "clustering_user": "cluster_account" } ``` diff --git a/site/versioned_docs/version-4.5/developers/clustering/enabling-clustering.md b/site/versioned_docs/version-4.5/developers/clustering/enabling-clustering.md index 2b80d4e7..606bc29c 100644 --- a/site/versioned_docs/version-4.5/developers/clustering/enabling-clustering.md +++ b/site/versioned_docs/version-4.5/developers/clustering/enabling-clustering.md @@ -23,8 +23,8 @@ _Note: When making any changes to the `harperdb-config.yaml` file Harper must be ```json { - "operation": "set_configuration", - "clustering_enabled": true + "operation": "set_configuration", + "clustering_enabled": true } ``` diff --git a/site/versioned_docs/version-4.5/developers/clustering/establishing-routes.md b/site/versioned_docs/version-4.5/developers/clustering/establishing-routes.md index 26ebf659..e4a0ea89 100644 --- a/site/versioned_docs/version-4.5/developers/clustering/establishing-routes.md +++ b/site/versioned_docs/version-4.5/developers/clustering/establishing-routes.md @@ -43,9 +43,9 @@ There are multiple ways to set routes, they are: ```json { - "operation": "cluster_set_routes", - "server": "hub", - "routes":[ {"host": "3.735.184.8", "port": 9932} ] + "operation": "cluster_set_routes", + "server": "hub", + "routes": [{ "host": "3.735.184.8", "port": 9932 }] } ``` @@ -67,7 +67,7 @@ The API also has `cluster_get_routes` for getting all routes in the config and ` ```json { - "operation": "cluster_delete_routes", - "routes":[ {"host": "3.735.184.8", "port": 9932} ] + "operation": "cluster_delete_routes", + "routes": [{ "host": "3.735.184.8", "port": 9932 }] } ``` diff --git a/site/versioned_docs/version-4.5/developers/clustering/index.md b/site/versioned_docs/version-4.5/developers/clustering/index.md index 14556f3c..95c3433c 100644 --- a/site/versioned_docs/version-4.5/developers/clustering/index.md +++ b/site/versioned_docs/version-4.5/developers/clustering/index.md @@ -8,24 +8,24 @@ Harper 4.0 - 4.3 used a clustering system based on NATS for replication. In 4.4+ Harper’s clustering engine replicates data between instances of Harper using a highly performant, bi-directional pub/sub model on a per-table basis. Data replicates asynchronously with eventual consistency across the cluster following the defined pub/sub configuration. Individual transactions are sent in the order in which they were transacted, once received by the destination instance, they are processed in an ACID-compliant manner. Conflict resolution follows a last writer wins model based on recorded transaction time on the transaction and the timestamp on the record on the node. -*** +--- ### Common Use Case A common use case is an edge application collecting and analyzing sensor data that creates an alert if a sensor value exceeds a given threshold: -* The edge application should not be making outbound http requests for security purposes. -* There may not be a reliable network connection. -* Not all sensor data will be sent to the cloud--either because of the unreliable network connection, or maybe it’s just a pain to store it. -* The edge node should be inaccessible from outside the firewall. -* The edge node will send alerts to the cloud with a snippet of sensor data containing the offending sensor readings. +- The edge application should not be making outbound http requests for security purposes. +- There may not be a reliable network connection. +- Not all sensor data will be sent to the cloud--either because of the unreliable network connection, or maybe it’s just a pain to store it. +- The edge node should be inaccessible from outside the firewall. +- The edge node will send alerts to the cloud with a snippet of sensor data containing the offending sensor readings. Harper simplifies the architecture of such an application with its bi-directional, table-level replication: -* The edge instance subscribes to a “thresholds” table on the cloud instance, so the application only makes localhost calls to get the thresholds. -* The application continually pushes sensor data into a “sensor\_data” table via the localhost API, comparing it to the threshold values as it does so. -* When a threshold violation occurs, the application adds a record to the “alerts” table. -* The application appends to that record array “sensor\_data” entries for the 60 seconds (or minutes, or days) leading up to the threshold violation. -* The edge instance publishes the “alerts” table up to the cloud instance. +- The edge instance subscribes to a “thresholds” table on the cloud instance, so the application only makes localhost calls to get the thresholds. +- The application continually pushes sensor data into a “sensor_data” table via the localhost API, comparing it to the threshold values as it does so. +- When a threshold violation occurs, the application adds a record to the “alerts” table. +- The application appends to that record array “sensor_data” entries for the 60 seconds (or minutes, or days) leading up to the threshold violation. +- The edge instance publishes the “alerts” table up to the cloud instance. By letting Harper focus on the fault-tolerant logistics of transporting your data, you get to write less code. By moving data only when and where it’s needed, you lower storage and bandwidth costs. And by restricting your app to only making local calls to Harper, you reduce the overall exposure of your application to outside forces. diff --git a/site/versioned_docs/version-4.5/developers/clustering/managing-subscriptions.md b/site/versioned_docs/version-4.5/developers/clustering/managing-subscriptions.md index 8d2cafef..f043c9d1 100644 --- a/site/versioned_docs/version-4.5/developers/clustering/managing-subscriptions.md +++ b/site/versioned_docs/version-4.5/developers/clustering/managing-subscriptions.md @@ -4,12 +4,14 @@ title: Managing subscriptions Tables are replicated when the table is designated as replicating and there is subscription between the nodes. Tables designated as replicating by default, but can be changed by setting `replicate` to `false` in the table definition: + ```graphql type Product @table(replicate: false) { - id: ID! - name: String! + id: ID! + name: String! } ``` + Or in your harperdb-config.yaml, you can set the default replication behavior for databases, and indicate which databases should be replicated by default: @@ -17,22 +19,20 @@ should be replicated by default: replication: databases: data ``` + If a table is not in the list of databases to be replicated, it will not be replicated unless the table is specifically set to replicate: ```graphql type Product @table(replicate: true) { - id: ID! - name: String! + id: ID! + name: String! } ``` -Reading hdb_nodes (what we do _to_ the node, not what the node does). +Reading hdb*nodes (what we do \_to* the node, not what the node does). The subscription can be set to publish, subscribe, or both. - - - # Managing subscriptions Subscriptions can be added, updated, or removed through the API. @@ -43,22 +43,22 @@ To add a single node and create one or more subscriptions use `set_node_replicat ```json { - "operation": "set_node_replication", - "node_name": "Node2", - "subscriptions": [ - { - "database": "data", - "table": "dog", - "publish": false, - "subscribe": true - }, - { - "database": "data", - "table": "chicken", - "publish": true, - "subscribe": true - } - ] + "operation": "set_node_replication", + "node_name": "Node2", + "subscriptions": [ + { + "database": "data", + "table": "dog", + "publish": false, + "subscribe": true + }, + { + "database": "data", + "table": "chicken", + "publish": true, + "subscribe": true + } + ] } ``` @@ -68,16 +68,16 @@ To update one or more subscriptions with a single node you can also use `set_nod ```json { - "operation": "set_node_replication", - "node_name": "Node2", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ] + "operation": "set_node_replication", + "node_name": "Node2", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ] } ``` @@ -87,37 +87,37 @@ To add or update subscriptions with one or more nodes in one API call use `confi ```json { - "operation": "configure_cluster", - "connections": [ - { - "node_name": "Node2", - "subscriptions": [ - { - "database": "dev", - "table": "chicken", - "publish": false, - "subscribe": true - }, - { - "database": "prod", - "table": "dog", - "publish": true, - "subscribe": true - } - ] - }, - { - "node_name": "Node3", - "subscriptions": [ - { - "database": "dev", - "table": "chicken", - "publish": true, - "subscribe": false - } - ] - } - ] + "operation": "configure_cluster", + "connections": [ + { + "node_name": "Node2", + "subscriptions": [ + { + "database": "dev", + "table": "chicken", + "publish": false, + "subscribe": true + }, + { + "database": "prod", + "table": "dog", + "publish": true, + "subscribe": true + } + ] + }, + { + "node_name": "Node3", + "subscriptions": [ + { + "database": "dev", + "table": "chicken", + "publish": true, + "subscribe": false + } + ] + } + ] } ``` @@ -131,17 +131,17 @@ There is an optional property called `start_time` that can be passed in the subs ```json { - "operation": "set_node_replication", - "node_name": "Node2", - "subscriptions": [ - { - "database": "dev", - "table": "dog", - "publish": false, - "subscribe": true, - "start_time": "2022-09-02T20:06:35.993Z" - } - ] + "operation": "set_node_replication", + "node_name": "Node2", + "subscriptions": [ + { + "database": "dev", + "table": "dog", + "publish": false, + "subscribe": true, + "start_time": "2022-09-02T20:06:35.993Z" + } + ] } ``` @@ -157,8 +157,8 @@ To remove a node and all its subscriptions use `remove_node`. ```json { - "operation":"remove_node", - "node_name":"Node2" + "operation": "remove_node", + "node_name": "Node2" } ``` @@ -168,32 +168,32 @@ To get the status of all connected nodes and see their subscriptions use `cluste ```json { - "node_name": "Node1", - "is_enabled": true, - "connections": [ - { - "node_name": "Node2", - "status": "open", - "ports": { - "clustering": 9932, - "operations_api": 9925 - }, - "latency_ms": 65, - "uptime": "11m 19s", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ], - "system_info": { - "hdb_version": "4.0.0", - "node_version": "16.17.1", - "platform": "linux" - } - } - ] + "node_name": "Node1", + "is_enabled": true, + "connections": [ + { + "node_name": "Node2", + "status": "open", + "ports": { + "clustering": 9932, + "operations_api": 9925 + }, + "latency_ms": 65, + "uptime": "11m 19s", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ], + "system_info": { + "hdb_version": "4.0.0", + "node_version": "16.17.1", + "platform": "linux" + } + } + ] } ``` diff --git a/site/versioned_docs/version-4.5/developers/clustering/naming-a-node.md b/site/versioned_docs/version-4.5/developers/clustering/naming-a-node.md index 67ac2c49..7a512efb 100644 --- a/site/versioned_docs/version-4.5/developers/clustering/naming-a-node.md +++ b/site/versioned_docs/version-4.5/developers/clustering/naming-a-node.md @@ -27,8 +27,8 @@ _Note: When making any changes to the `harperdb-config.yaml` file Harper must be ```json { - "operation": "set_configuration", - "clustering_nodeName":"Node1" + "operation": "set_configuration", + "clustering_nodeName": "Node1" } ``` diff --git a/site/versioned_docs/version-4.5/developers/clustering/subscription-overview.md b/site/versioned_docs/version-4.5/developers/clustering/subscription-overview.md index 2c135a86..12a929f6 100644 --- a/site/versioned_docs/version-4.5/developers/clustering/subscription-overview.md +++ b/site/versioned_docs/version-4.5/developers/clustering/subscription-overview.md @@ -10,7 +10,7 @@ _Note: ‘local’ and ‘remote’ will often be referred to. In the context of A subscription consists of: -`database` - the name of the database that the table you are creating the subscription for belongs to. *Note, this was previously referred to as schema and may occasionally still be referenced that way.* +`database` - the name of the database that the table you are creating the subscription for belongs to. _Note, this was previously referred to as schema and may occasionally still be referenced that way._ `table` - the name of the table the subscription will apply to. diff --git a/site/versioned_docs/version-4.5/developers/clustering/things-worth-knowing.md b/site/versioned_docs/version-4.5/developers/clustering/things-worth-knowing.md index 02c188ae..cd81f348 100644 --- a/site/versioned_docs/version-4.5/developers/clustering/things-worth-knowing.md +++ b/site/versioned_docs/version-4.5/developers/clustering/things-worth-knowing.md @@ -6,21 +6,21 @@ title: Things Worth Knowing Additional information that will help you define your clustering topology. -*** +--- ### Transactions Transactions that are replicated across the cluster are: -* Insert -* Update -* Upsert -* Delete -* Bulk loads - * CSV data load - * CSV file load - * CSV URL load - * Import from S3 +- Insert +- Update +- Upsert +- Delete +- Bulk loads + - CSV data load + - CSV file load + - CSV URL load + - Import from S3 When adding or updating a node any databases and tables in the subscription that don’t exist on the remote node will be automatically created. @@ -28,13 +28,13 @@ When adding or updating a node any databases and tables in the subscription that Users and roles are not replicated across the cluster. -*** +--- ### Queueing Harper has built-in resiliency for when network connectivity is lost within a subscription. When connections are reestablished, a catchup routine is executed to ensure data that was missed, specific to the subscription, is sent/received as defined. -*** +--- ### Topologies diff --git a/site/versioned_docs/version-4.5/developers/components/built-in.md b/site/versioned_docs/version-4.5/developers/components/built-in.md index 1e832085..6eee3879 100644 --- a/site/versioned_docs/version-4.5/developers/components/built-in.md +++ b/site/versioned_docs/version-4.5/developers/components/built-in.md @@ -7,14 +7,14 @@ title: Built-In Components Harper provides extended features using built-in components. They do **not** need to be installed with a package manager, and simply must be specified in a config to run. These are used throughout many Harper docs, guides, and examples. Unlike external components which have their own semantic versions, built-in components follow Harper's semantic version. - [Built-In Components](#built-in-components) - - [fastifyRoutes](#fastifyroutes) - - [graphql](#graphql) - - [graphqlSchema](#graphqlschema) - - [jsResource](#jsresource) - - [loadEnv](#loadenv) - - [rest](#rest) - - [roles](#roles) - - [static](#static) + - [fastifyRoutes](#fastifyroutes) + - [graphql](#graphql) + - [graphqlSchema](#graphqlschema) + - [jsResource](#jsresource) + - [loadEnv](#loadenv) + - [rest](#rest) + - [roles](#roles) + - [static](#static) diff --git a/site/versioned_docs/version-4.5/developers/components/managing.md b/site/versioned_docs/version-4.5/developers/components/managing.md index 5acf800c..ced912a3 100644 --- a/site/versioned_docs/version-4.5/developers/components/managing.md +++ b/site/versioned_docs/version-4.5/developers/components/managing.md @@ -31,21 +31,21 @@ Alternatively, to mimic interfacing with a hosted Harper instance, use operation 1. Start up Harper with `harperdb` 1. _Deploy_ the component to the local instance by executing: - ```sh - harperdb deploy_component \ - project= \ - package= \ - restart=true - ``` - - * Make sure to omit the `target` option so that it _deploys_ to the Harper instance running locally - * The `package=` option creates a symlink to the component simplifying restarts - * By default, the `deploy_component` operation command will _deploy_ the current directory by packaging it up and streaming the bytes. By specifying `package`, it skips this and references the file path directly - * The `restart=true` option automatically restarts Harper threads after the component is deployed - * If set to `'rolling'`, a rolling restart will be triggered after the component is deployed + ```sh + harperdb deploy_component \ + project= \ + package= \ + restart=true + ``` + - Make sure to omit the `target` option so that it _deploys_ to the Harper instance running locally + - The `package=` option creates a symlink to the component simplifying restarts + - By default, the `deploy_component` operation command will _deploy_ the current directory by packaging it up and streaming the bytes. By specifying `package`, it skips this and references the file path directly + - The `restart=true` option automatically restarts Harper threads after the component is deployed + - If set to `'rolling'`, a rolling restart will be triggered after the component is deployed + 1. In another terminal, use the `harperdb restart` command to restart the instance's threads at any time - * With `package=`, the component source is symlinked so changes will automatically be picked up between restarts - * If `package` was omitted, run the `deploy_component` command again with any new changes + - With `package=`, the component source is symlinked so changes will automatically be picked up between restarts + - If `package` was omitted, run the `deploy_component` command again with any new changes 1. To remove the component use `harperdb drop_component project=` Similar to the previous section, if the main thread needs to be restarted, start and stop the Harper instance manually (with the component deployed). Upon Harper startup, the component will automatically be loaded and executed across all threads. @@ -103,11 +103,11 @@ A local component can be deployed to a remote instance by **omitting** the `pack Furthermore, the `package` field can be set to any valid [npm dependency value](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#dependencies). -* For components deployed to npm, specify the package name: `package="@harperdb/status-check"` -* For components on GitHub, specify the URL: `package="https://github.com/HarperDB/status-check"`, or the shorthand `package=HarperDB/status-check` -* Private repositories also work if the correct SSH keys are on the server: `package="git+ssh:/git@github.com:HarperDB/secret-component.git"` - * Reference the [SSH Key](../operations-api/components#add-ssh-key) operations for more information on managing SSH keys on a remote instance -* Even tarball URLs are supported: `package="https://example.com/component.tar.gz"` +- For components deployed to npm, specify the package name: `package="@harperdb/status-check"` +- For components on GitHub, specify the URL: `package="https://github.com/HarperDB/status-check"`, or the shorthand `package=HarperDB/status-check` +- Private repositories also work if the correct SSH keys are on the server: `package="git+ssh:/git@github.com:HarperDB/secret-component.git"` + - Reference the [SSH Key](../operations-api/components#add-ssh-key) operations for more information on managing SSH keys on a remote instance +- Even tarball URLs are supported: `package="https://example.com/component.tar.gz"` > When using git tags, we highly recommend that you use the semver directive to ensure consistent and reliable installation by npm. In addition to tags, you can also reference branches or commit numbers. @@ -133,7 +133,7 @@ The configuration is very similar to that of `config.yaml`. Entries are comprise ```yaml status-check: - package: "@harperdb/status-check" + package: '@harperdb/status-check' ``` The key difference between this and a component's `config.yaml` is that the name does **not** need to be associated with a `package.json` dependency. When Harper starts up, it transforms these configurations into a `package.json` file, and then executes a form of `npm install`. Thus, the `package: ` can be any valid dependency syntax such as npm packages, GitHub repos, tarballs, and local directories are all supported. @@ -142,7 +142,7 @@ Given a root config like: ```yaml myGithubComponent: - package: HarperDB-Add-Ons/package#v2.2.0 # install from GitHub + package: HarperDB-Add-Ons/package#v2.2.0 # install from GitHub myNPMComponent: package: harperdb # install from npm myTarBall: @@ -157,13 +157,13 @@ Harper will generate a `package.json` like: ```json { - "dependencies": { - "myGithubComponent": "github:HarperDB-Add-Ons/package#v2.2.0", - "myNPMComponent": "npm:harperdb", - "myTarBall": "file:/Users/harper/cool-component.tar", - "myLocal": "file:/Users/harper/local", - "myWebsite": "https://harperdb-component" - } + "dependencies": { + "myGithubComponent": "github:HarperDB-Add-Ons/package#v2.2.0", + "myNPMComponent": "npm:harperdb", + "myTarBall": "file:/Users/harper/cool-component.tar", + "myLocal": "file:/Users/harper/local", + "myWebsite": "https://harperdb-component" + } } ``` diff --git a/site/versioned_docs/version-4.5/developers/components/reference.md b/site/versioned_docs/version-4.5/developers/components/reference.md index 002258eb..4b709f86 100644 --- a/site/versioned_docs/version-4.5/developers/components/reference.md +++ b/site/versioned_docs/version-4.5/developers/components/reference.md @@ -40,9 +40,9 @@ Any custom component **must** be configured with the `package` option in order f ```json { - "dependencies": { - "@harperdb/nextjs": "^1.0.0" - } + "dependencies": { + "@harperdb/nextjs": "^1.0.0" + } } ``` @@ -58,9 +58,9 @@ Since npm allows for a [variety of dependency configurations](https://docs.npmjs ```json { - "dependencies": { - "harper-nextjs-test-feature": "HarperDB/nextjs#test-feature" - } + "dependencies": { + "harper-nextjs-test-feature": "HarperDB/nextjs#test-feature" + } } ``` @@ -129,9 +129,9 @@ Other than their execution behavior, the `handleFile()` and `setupFile()` method Any [Resource Extension](#resource-extension) can be configured with the `files`, `path`, and `root` options. These options control how _files_ and _directories_ are resolved in order to be passed to the extension's `handleFile()`, `setupFile()`, `handleDirectory()`, and `setupDirectory()` methods. -- **files** - `string` - *required* - Specifies the set of files and directories that should be handled by the component. Can be a glob pattern. -- **path** - `string` - *optional* - Specifies the URL path to be handled by the component. -- **root** - `string` - *optional* - Specifies the root directory for mapping file paths to the URLs. +- **files** - `string` - _required_ - Specifies the set of files and directories that should be handled by the component. Can be a glob pattern. +- **path** - `string` - _optional_ - Specifies the URL path to be handled by the component. +- **root** - `string` - _optional_ - Specifies the root directory for mapping file paths to the URLs. For example, to configure the [static](./built-in#static) component to server all files from `web` to the root URL path: @@ -161,28 +161,29 @@ export function setupDirectory() {} function handleDirectory() {} function setupFile() {} -module.exports = { handleDirectory, setupFile } +module.exports = { handleDirectory, setupFile }; ``` When returned by a [Protocol Extension](#protocol-extension), these methods should be defined on the object instead: ```js export function start() { - return { - handleFile () {} - } + return { + handleFile() {}, + }; } ``` ##### `handleFile(contents, urlPath, path, resources): void | Promise` + ##### `setupFile(contents, urlPath, path, resources): void | Promise` These methods are for processing individual files. They can be async. > Remember! -> +> > `setupFile()` is executed **once** on the **main thread** during the main start sequence. -> +> > `handleFile()` is executed on **worker threads** and is executed again during restarts. Parameters: @@ -196,6 +197,7 @@ Parameters: Returns: `void | Promise` ##### `handleDirectory(urlPath, path, resources): boolean | void | Promise` + ##### `setupDirectory(urlPath, path, resources): boolean | void | Promise` These methods are for processing directories. They can be async. @@ -203,9 +205,9 @@ These methods are for processing directories. They can be async. If the function returns or resolves a truthy value, then the component loading sequence will end and no other entries within the directory will be processed. > Remember! -> +> > `setupFile()` is executed **once** on the **main thread** during the main start sequence. -> +> > `handleFile()` is executed on **worker threads** and is executed again during restarts. Parameters: @@ -242,6 +244,7 @@ Many protocol extensions will use the `port` and `securePort` options for config A Protocol Extension is made up of two distinct methods, [`start()`](#startoptions-resourceextension--promiseresourceextension) and [`startOnMainThread()`](#startonmainthreadoptions-resourceextension--promiseresourceextension). Similar to a Resource Extension, the `start()` method is executed on _all worker threads_, and _executed again on restarts_. The `startOnMainThread()` method is **only** executed **once** during the initial system start sequence. These methods have identical `options` object parameter, and can both return a Resource Extension (i.e. an object containing one or more of the methods listed above). ##### `start(options): ResourceExtension | Promise` + ##### `startOnMainThread(options): ResourceExtension | Promise` Parameters: diff --git a/site/versioned_docs/version-4.5/developers/miscellaneous/google-data-studio.md b/site/versioned_docs/version-4.5/developers/miscellaneous/google-data-studio.md index 53236fea..02fea100 100644 --- a/site/versioned_docs/version-4.5/developers/miscellaneous/google-data-studio.md +++ b/site/versioned_docs/version-4.5/developers/miscellaneous/google-data-studio.md @@ -23,15 +23,15 @@ Get started by selecting the Harper connector from the [Google Data Studio Partn 1. Check the box for “Secure Connections Only” if you want to always use HTTPS connections for this data source; entering a Web URL that starts with https:// will do the same thing, if you prefer. 1. Check the box for “Allow Bad Certs” if your Harper instance does not have a valid SSL certificate. [Harper Cloud](../../deployments/harper-cloud/) always has valid certificates, and so will never require this to be checked. Instances you set up yourself may require this, if you are using self-signed certs. If you are using [Harper Cloud](../../deployments/harper-cloud/) or another instance you know should always have valid SSL certificates, do not check this box. 1. Choose your Query Type. This determines what information the configuration will ask for after pressing the Next button. - * Table will ask you for a Schema and a Table to return all fields of using `SELECT *`. - * SQL will ask you for the SQL query you’re using to retrieve fields from the database. You may `JOIN` multiple tables together, and use Harper specific SQL functions, along with the usual power SQL grants. + - Table will ask you for a Schema and a Table to return all fields of using `SELECT *`. + - SQL will ask you for the SQL query you’re using to retrieve fields from the database. You may `JOIN` multiple tables together, and use Harper specific SQL functions, along with the usual power SQL grants. 1. When all information is entered correctly, press the Connect button in the top right of the new Data Source view to generate the Schema. You may also want to name the data source at this point. If the connector encounters any errors, a dialog box will tell you what went wrong so you can correct the issue. 1. If there are no errors, you now have a data source you can use in your reports! You may change the types of the generated fields in the Schema view if you need to (for instance, changing a Number field to a specific currency), as well as creating new fields from the report view that do calculations on other fields. ## Considerations -* Both Postman and the [Harper Studio](../../deployments/harper-cloud/) app have ways to convert a user:password pair to a Basic Auth token. Use either to create the token for the connector’s user. - * You may sign out of your current user by going to the instances tab in Harper Studio, then clicking on the lock icon at the top-right of a given instance’s box. Click the lock again to sign in as any user. The Basic Auth token will be visible in the Authorization header portion of any code created in the Sample Code tab. -* It’s highly recommended that you create a read-only user role in Harper Studio, and create a user with that role for your data sources to use. This prevents that authorization token from being used to alter your database, should someone else ever get ahold of it. -* The RecordCount field is intended for use as a metric, for counting how many instances of a given set of values appear in a report’s data set. -* _Do not attempt to create fields with spaces in their names_ for any data sources! Google Data Studio will crash when attempting to retrieve a field with such a name, producing a System Error instead of a useful chart on your reports. Using CamelCase or snake\_case gets around this. +- Both Postman and the [Harper Studio](../../deployments/harper-cloud/) app have ways to convert a user:password pair to a Basic Auth token. Use either to create the token for the connector’s user. + - You may sign out of your current user by going to the instances tab in Harper Studio, then clicking on the lock icon at the top-right of a given instance’s box. Click the lock again to sign in as any user. The Basic Auth token will be visible in the Authorization header portion of any code created in the Sample Code tab. +- It’s highly recommended that you create a read-only user role in Harper Studio, and create a user with that role for your data sources to use. This prevents that authorization token from being used to alter your database, should someone else ever get ahold of it. +- The RecordCount field is intended for use as a metric, for counting how many instances of a given set of values appear in a report’s data set. +- _Do not attempt to create fields with spaces in their names_ for any data sources! Google Data Studio will crash when attempting to retrieve a field with such a name, producing a System Error instead of a useful chart on your reports. Using CamelCase or snake_case gets around this. diff --git a/site/versioned_docs/version-4.5/developers/miscellaneous/index.md b/site/versioned_docs/version-4.5/developers/miscellaneous/index.md index 13ee450a..f80dc499 100644 --- a/site/versioned_docs/version-4.5/developers/miscellaneous/index.md +++ b/site/versioned_docs/version-4.5/developers/miscellaneous/index.md @@ -4,4 +4,4 @@ title: Miscellaneous # Miscellaneous -This section covers a grouping of reference documents for various external developer tools, packages, SDKs, etc. \ No newline at end of file +This section covers a grouping of reference documents for various external developer tools, packages, SDKs, etc. diff --git a/site/versioned_docs/version-4.5/developers/miscellaneous/query-optimization.md b/site/versioned_docs/version-4.5/developers/miscellaneous/query-optimization.md index 4a2dbc6c..139b862b 100644 --- a/site/versioned_docs/version-4.5/developers/miscellaneous/query-optimization.md +++ b/site/versioned_docs/version-4.5/developers/miscellaneous/query-optimization.md @@ -28,10 +28,10 @@ Conditions can be applied to primary key fields or other indexed fields (known a Harper supports relationships between tables, allowing for "join" queries that. This does result in more complex queries with potentially larger performance overhead, as more lookups are necessary to connect matched or selected data with other tables. Similar principles apply to conditions which use relationships. Indexed fields and comparators that leverage the ordering are still valuable for performance. It is also important that if a condition on a table is connected to another table's foreign key, that that foreign key also be indexed. Likewise, if a query `select`s data from a related table that uses a foreign key to relate, that it is indexed. The same principles of higher cardinality applies here as well, more unique values allow for efficient lookups. - ### Sorting + Queries can also specify a sort order. This can also significantly impact performance. If a query specifies a sort order on an indexed field, the database can use the index to quickly retrieve the data in the specified order. A sort order can be used in conjunction with a condition on the same (indexed) field can utilize the index for ordering. However, if the sort order is not on an indexed field, or the query specifies conditions on different fields, Harper will generally need to sort the data after retrieving it, which can be slow for large datasets. The same principles apply to sorting as they do to conditions. Sorting on a primary key is generally faster than sorting on a secondary index, if the condition aligns with the sort order. ### Streaming -One of the unique and powerful features of Harper's querying functionality is the ability to stream query results. When possible, Harper can return records from a query as they are found, rather than waiting for the entire query to complete. This can significantly improve performance for large queries, as it allows the application to start processing results or sending the initial data before the entire query is complete (improving time-to-first-byte speed, for example). However, using a sort order on a query with conditions that are not on an aligned index requires that the entire query result be loaded in order to perform the sorting, which defeats the streaming benefits. \ No newline at end of file +One of the unique and powerful features of Harper's querying functionality is the ability to stream query results. When possible, Harper can return records from a query as they are found, rather than waiting for the entire query to complete. This can significantly improve performance for large queries, as it allows the application to start processing results or sending the initial data before the entire query is complete (improving time-to-first-byte speed, for example). However, using a sort order on a query with conditions that are not on an aligned index requires that the entire query result be loaded in order to perform the sorting, which defeats the streaming benefits. diff --git a/site/versioned_docs/version-4.5/developers/miscellaneous/sdks.md b/site/versioned_docs/version-4.5/developers/miscellaneous/sdks.md index 33ec0bed..2397c294 100644 --- a/site/versioned_docs/version-4.5/developers/miscellaneous/sdks.md +++ b/site/versioned_docs/version-4.5/developers/miscellaneous/sdks.md @@ -7,15 +7,15 @@ description: >- # SDKs -| SDK/Tool | Description | Installation | -| ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------- | -| [HarperDB.NET.Client](https://www.nuget.org/packages/HarperDB.NET.Client) | A Dot Net Core client to execute operations against HarperDB | `dotnet add package HarperDB.NET.Client --version 1.1.0` | -| [Websocket Client](https://www.npmjs.com/package/harperdb-websocket-client) | A Javascript client for real-time access to HarperDB transactions | `npm i -s harperdb-websocket-client` | +| SDK/Tool | Description | Installation | +| ------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | +| [HarperDB.NET.Client](https://www.nuget.org/packages/HarperDB.NET.Client) | A Dot Net Core client to execute operations against HarperDB | `dotnet add package HarperDB.NET.Client --version 1.1.0` | +| [Websocket Client](https://www.npmjs.com/package/harperdb-websocket-client) | A Javascript client for real-time access to HarperDB transactions | `npm i -s harperdb-websocket-client` | | [Gatsby HarperDB Source](https://www.npmjs.com/package/gatsby-source-harperdb) | Use Harper as the data source for a Gatsby project at the build time | `npm i -s gatsby-source-harperdb` | | [HarperDB.EntityFrameworkCore](https://www.nuget.org/packages/HarperDB.EntityFrameworkCore) | The Harper EntityFrameworkCore Provider Package for .NET 6.0 | `dotnet add package HarperDB.EntityFrameworkCore --version 1.0.0` | | [Python SDK](https://pypi.org/project/harperdb/) | Python3 implementations of Harper API functions with wrappers for an object-oriented interface | `pip3 install harperdb` | | [HarperDB Flutter SDK](https://github.com/HarperDB/harperdb-sdk-flutter) | A Harper SDK for Flutter | `flutter pub add harperdb` | -| [React Hook](https://www.npmjs.com/package/use-harperdb) | A ReactJS Hook for HarperDB | `npm i -s use-harperdb` | +| [React Hook](https://www.npmjs.com/package/use-harperdb) | A ReactJS Hook for HarperDB | `npm i -s use-harperdb` | | [Node Red Node](https://flows.nodered.org/node/node-red-contrib-harperdb) | Easy drag and drop connections to Harper using the Node-Red platform | `npm i -s node-red-contrib-harperdb` | | [NodeJS SDK](https://www.npmjs.com/package/harperive) | A Harper SDK for NodeJS | `npm i -s harperive` | | [HarperDB Cargo Crate](https://crates.io/crates/harperdb) | A Harper SDK for Rust | `Cargo.toml > harperdb = '1.0.0'` | diff --git a/site/versioned_docs/version-4.5/developers/operations-api/advanced-json-sql-examples.md b/site/versioned_docs/version-4.5/developers/operations-api/advanced-json-sql-examples.md index 5b7a2c8e..ec300e2e 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/advanced-json-sql-examples.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/advanced-json-sql-examples.md @@ -1,1780 +1,1775 @@ --- -title: Advanced JSON SQL Examples +title: Advanced JSON SQL Examples --- -# Advanced JSON SQL Examples +# Advanced JSON SQL Examples ## Create movies database + Create a new database called "movies" using the 'create_database' operation. _Note: Creating a database is optional, if one is not created Harper will default to using a database named `data`_ ### Body + ```json { - "operation": "create_database", - "database": "movies" + "operation": "create_database", + "database": "movies" } ``` ### Response: 200 + ```json { - "message": "database 'movies' successfully created" + "message": "database 'movies' successfully created" } ``` --- ## Create movie Table + Creates a new table called "movie" inside the database "movies" using the ‘create_table’ operation. ### Body ```json { - "operation": "create_table", - "database": "movies", - "table": "movie", - "primary_key": "id" + "operation": "create_table", + "database": "movies", + "table": "movie", + "primary_key": "id" } ``` ### Response: 200 + ```json { - "message": "table 'movies.movie' successfully created." + "message": "table 'movies.movie' successfully created." } ``` - --- ## Create credits Table + Creates a new table called "credits" inside the database "movies" using the ‘create_table’ operation. ### Body ```json { - "operation": "create_table", - "database": "movies", - "table": "credits", - "primary_key": "movie_id" + "operation": "create_table", + "database": "movies", + "table": "credits", + "primary_key": "movie_id" } ``` ### Response: 200 + ```json { - "message": "table 'movies.credits' successfully created." + "message": "table 'movies.credits' successfully created." } ``` - --- ## Bulk Insert movie Via CSV + Inserts data from a hosted CSV file into the "movie" table using the 'csv_url_load' operation. ### Body ```json { - "operation": "csv_url_load", - "database": "movies", - "table": "movie", - "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/movie.csv" + "operation": "csv_url_load", + "database": "movies", + "table": "movie", + "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/movie.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 1889eee4-23c1-4945-9bb7-c805fc20726c" + "message": "Starting job with id 1889eee4-23c1-4945-9bb7-c805fc20726c" } ``` - --- ## Bulk Insert credits Via CSV + Inserts data from a hosted CSV file into the "credits" table using the 'csv_url_load' operation. ### Body ```json { - "operation": "csv_url_load", - "database": "movies", - "table": "credits", - "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/credits.csv" + "operation": "csv_url_load", + "database": "movies", + "table": "credits", + "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/credits.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 3a14cd74-67f3-41e9-8ccd-45ffd0addc2c", - "job_id": "3a14cd74-67f3-41e9-8ccd-45ffd0addc2c" + "message": "Starting job with id 3a14cd74-67f3-41e9-8ccd-45ffd0addc2c", + "job_id": "3a14cd74-67f3-41e9-8ccd-45ffd0addc2c" } ``` - --- ## View raw data + In the following example we will be running expressions on the keywords & production_companies attributes, so for context we are displaying what the raw data looks like. ### Body ```json { - "operation": "sql", - "sql": "SELECT title, rank, keywords, production_companies FROM movies.movie ORDER BY rank LIMIT 10" + "operation": "sql", + "sql": "SELECT title, rank, keywords, production_companies FROM movies.movie ORDER BY rank LIMIT 10" } ``` ### Response: 200 + ```json [ - { - "title": "Ad Astra", - "rank": 1, - "keywords": [ - { - "id": 305, - "name": "moon" - }, - { - "id": 697, - "name": "loss of loved one" - }, - { - "id": 839, - "name": "planet mars" - }, - { - "id": 14626, - "name": "astronaut" - }, - { - "id": 157265, - "name": "moon colony" - }, - { - "id": 162429, - "name": "solar system" - }, - { - "id": 240119, - "name": "father son relationship" - }, - { - "id": 244256, - "name": "near future" - }, - { - "id": 257878, - "name": "planet neptune" - }, - { - "id": 260089, - "name": "space walk" - } - ], - "production_companies": [ - { - "id": 490, - "name": "New Regency Productions", - "origin_country": "" - }, - { - "id": 79963, - "name": "Keep Your Head", - "origin_country": "" - }, - { - "id": 73492, - "name": "MadRiver Pictures", - "origin_country": "" - }, - { - "id": 81, - "name": "Plan B Entertainment", - "origin_country": "US" - }, - { - "id": 30666, - "name": "RT Features", - "origin_country": "BR" - }, - { - "id": 30148, - "name": "Bona Film Group", - "origin_country": "CN" - }, - { - "id": 22213, - "name": "TSG Entertainment", - "origin_country": "US" - } - ] - }, - { - "title": "Extraction", - "rank": 2, - "keywords": [ - { - "id": 3070, - "name": "mercenary" - }, - { - "id": 4110, - "name": "mumbai (bombay), india" - }, - { - "id": 9717, - "name": "based on comic" - }, - { - "id": 9730, - "name": "crime boss" - }, - { - "id": 11107, - "name": "rescue mission" - }, - { - "id": 18712, - "name": "based on graphic novel" - }, - { - "id": 265216, - "name": "dhaka (dacca), bangladesh" - } - ], - "production_companies": [ - { - "id": 106544, - "name": "AGBO", - "origin_country": "US" - }, - { - "id": 109172, - "name": "Thematic Entertainment", - "origin_country": "US" - }, - { - "id": 92029, - "name": "TGIM Films", - "origin_country": "US" - } - ] - }, - { - "title": "To the Beat! Back 2 School", - "rank": 3, - "keywords": [ - { - "id": 10873, - "name": "school" - } - ], - "production_companies": [] - }, - { - "title": "Bloodshot", - "rank": 4, - "keywords": [ - { - "id": 2651, - "name": "nanotechnology" - }, - { - "id": 9715, - "name": "superhero" - }, - { - "id": 9717, - "name": "based on comic" - }, - { - "id": 164218, - "name": "psychotronic" - }, - { - "id": 255024, - "name": "shared universe" - }, - { - "id": 258575, - "name": "valiant comics" - } - ], - "production_companies": [ - { - "id": 34, - "name": "Sony Pictures", - "origin_country": "US" - }, - { - "id": 10246, - "name": "Cross Creek Pictures", - "origin_country": "US" - }, - { - "id": 6573, - "name": "Mimran Schur Pictures", - "origin_country": "US" - }, - { - "id": 333, - "name": "Original Film", - "origin_country": "US" - }, - { - "id": 103673, - "name": "The Hideaway Entertainment", - "origin_country": "US" - }, - { - "id": 124335, - "name": "Valiant Entertainment", - "origin_country": "US" - }, - { - "id": 5, - "name": "Columbia Pictures", - "origin_country": "US" - }, - { - "id": 1225, - "name": "One Race", - "origin_country": "US" - }, - { - "id": 30148, - "name": "Bona Film Group", - "origin_country": "CN" - } - ] - }, - { - "title": "The Call of the Wild", - "rank": 5, - "keywords": [ - { - "id": 818, - "name": "based on novel or book" - }, - { - "id": 4542, - "name": "gold rush" - }, - { - "id": 15162, - "name": "dog" - }, - { - "id": 155821, - "name": "sled dogs" - }, - { - "id": 189390, - "name": "yukon" - }, - { - "id": 207928, - "name": "19th century" - }, - { - "id": 259987, - "name": "cgi animation" - }, - { - "id": 263806, - "name": "1890s" - } - ], - "production_companies": [ - { - "id": 787, - "name": "3 Arts Entertainment", - "origin_country": "US" - }, - { - "id": 127928, - "name": "20th Century Studios", - "origin_country": "US" - }, - { - "id": 22213, - "name": "TSG Entertainment", - "origin_country": "US" - } - ] - }, - { - "title": "Sonic the Hedgehog", - "rank": 6, - "keywords": [ - { - "id": 282, - "name": "video game" - }, - { - "id": 6054, - "name": "friendship" - }, - { - "id": 10842, - "name": "good vs evil" - }, - { - "id": 41645, - "name": "based on video game" - }, - { - "id": 167043, - "name": "road movie" - }, - { - "id": 172142, - "name": "farting" - }, - { - "id": 188933, - "name": "bar fight" - }, - { - "id": 226967, - "name": "amistad" - }, - { - "id": 245230, - "name": "live action remake" - }, - { - "id": 258111, - "name": "fantasy" - }, - { - "id": 260223, - "name": "videojuego" - } - ], - "production_companies": [ - { - "id": 333, - "name": "Original Film", - "origin_country": "US" - }, - { - "id": 10644, - "name": "Blur Studios", - "origin_country": "US" - }, - { - "id": 77884, - "name": "Marza Animation Planet", - "origin_country": "JP" - }, - { - "id": 4, - "name": "Paramount", - "origin_country": "US" - }, - { - "id": 113750, - "name": "SEGA", - "origin_country": "JP" - }, - { - "id": 100711, - "name": "DJ2 Entertainment", - "origin_country": "" - }, - { - "id": 24955, - "name": "Paramount Animation", - "origin_country": "US" - } - ] - }, - { - "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", - "rank": 7, - "keywords": [ - { - "id": 849, - "name": "dc comics" - }, - { - "id": 9717, - "name": "based on comic" - }, - { - "id": 187056, - "name": "woman director" - }, - { - "id": 229266, - "name": "dc extended universe" - } - ], - "production_companies": [ - { - "id": 9993, - "name": "DC Entertainment", - "origin_country": "US" - }, - { - "id": 82968, - "name": "LuckyChap Entertainment", - "origin_country": "GB" - }, - { - "id": 103462, - "name": "Kroll & Co Entertainment", - "origin_country": "US" - }, - { - "id": 174, - "name": "Warner Bros. Pictures", - "origin_country": "US" - }, - { - "id": 429, - "name": "DC Comics", - "origin_country": "US" - }, - { - "id": 128064, - "name": "DC Films", - "origin_country": "US" - }, - { - "id": 101831, - "name": "Clubhouse Pictures", - "origin_country": "US" - } - ] - }, - { - "title": "Justice League Dark: Apokolips War", - "rank": 8, - "keywords": [ - { - "id": 849, - "name": "dc comics" - } - ], - "production_companies": [ - { - "id": 2785, - "name": "Warner Bros. Animation", - "origin_country": "US" - }, - { - "id": 9993, - "name": "DC Entertainment", - "origin_country": "US" - }, - { - "id": 429, - "name": "DC Comics", - "origin_country": "US" - } - ] - }, - { - "title": "Parasite", - "rank": 9, - "keywords": [ - { - "id": 1353, - "name": "underground" - }, - { - "id": 5318, - "name": "seoul" - }, - { - "id": 5732, - "name": "birthday party" - }, - { - "id": 5752, - "name": "private lessons" - }, - { - "id": 9866, - "name": "basement" - }, - { - "id": 10453, - "name": "con artist" - }, - { - "id": 11935, - "name": "working class" - }, - { - "id": 12565, - "name": "psychological thriller" - }, - { - "id": 13126, - "name": "limousine driver" - }, - { - "id": 14514, - "name": "class differences" - }, - { - "id": 14864, - "name": "rich poor" - }, - { - "id": 17997, - "name": "housekeeper" - }, - { - "id": 18015, - "name": "tutor" - }, - { - "id": 18035, - "name": "family" - }, - { - "id": 33421, - "name": "crime family" - }, - { - "id": 173272, - "name": "flood" - }, - { - "id": 188861, - "name": "smell" - }, - { - "id": 198673, - "name": "unemployed" - }, - { - "id": 237462, - "name": "wealthy family" - } - ], - "production_companies": [ - { - "id": 7036, - "name": "CJ Entertainment", - "origin_country": "KR" - }, - { - "id": 4399, - "name": "Barunson E&A", - "origin_country": "KR" - } - ] - }, - { - "title": "Star Wars: The Rise of Skywalker", - "rank": 10, - "keywords": [ - { - "id": 161176, - "name": "space opera" - } - ], - "production_companies": [ - { - "id": 1, - "name": "Lucasfilm", - "origin_country": "US" - }, - { - "id": 11461, - "name": "Bad Robot", - "origin_country": "US" - }, - { - "id": 2, - "name": "Walt Disney Pictures", - "origin_country": "US" - }, - { - "id": 120404, - "name": "British Film Commission", - "origin_country": "" - } - ] - } + { + "title": "Ad Astra", + "rank": 1, + "keywords": [ + { + "id": 305, + "name": "moon" + }, + { + "id": 697, + "name": "loss of loved one" + }, + { + "id": 839, + "name": "planet mars" + }, + { + "id": 14626, + "name": "astronaut" + }, + { + "id": 157265, + "name": "moon colony" + }, + { + "id": 162429, + "name": "solar system" + }, + { + "id": 240119, + "name": "father son relationship" + }, + { + "id": 244256, + "name": "near future" + }, + { + "id": 257878, + "name": "planet neptune" + }, + { + "id": 260089, + "name": "space walk" + } + ], + "production_companies": [ + { + "id": 490, + "name": "New Regency Productions", + "origin_country": "" + }, + { + "id": 79963, + "name": "Keep Your Head", + "origin_country": "" + }, + { + "id": 73492, + "name": "MadRiver Pictures", + "origin_country": "" + }, + { + "id": 81, + "name": "Plan B Entertainment", + "origin_country": "US" + }, + { + "id": 30666, + "name": "RT Features", + "origin_country": "BR" + }, + { + "id": 30148, + "name": "Bona Film Group", + "origin_country": "CN" + }, + { + "id": 22213, + "name": "TSG Entertainment", + "origin_country": "US" + } + ] + }, + { + "title": "Extraction", + "rank": 2, + "keywords": [ + { + "id": 3070, + "name": "mercenary" + }, + { + "id": 4110, + "name": "mumbai (bombay), india" + }, + { + "id": 9717, + "name": "based on comic" + }, + { + "id": 9730, + "name": "crime boss" + }, + { + "id": 11107, + "name": "rescue mission" + }, + { + "id": 18712, + "name": "based on graphic novel" + }, + { + "id": 265216, + "name": "dhaka (dacca), bangladesh" + } + ], + "production_companies": [ + { + "id": 106544, + "name": "AGBO", + "origin_country": "US" + }, + { + "id": 109172, + "name": "Thematic Entertainment", + "origin_country": "US" + }, + { + "id": 92029, + "name": "TGIM Films", + "origin_country": "US" + } + ] + }, + { + "title": "To the Beat! Back 2 School", + "rank": 3, + "keywords": [ + { + "id": 10873, + "name": "school" + } + ], + "production_companies": [] + }, + { + "title": "Bloodshot", + "rank": 4, + "keywords": [ + { + "id": 2651, + "name": "nanotechnology" + }, + { + "id": 9715, + "name": "superhero" + }, + { + "id": 9717, + "name": "based on comic" + }, + { + "id": 164218, + "name": "psychotronic" + }, + { + "id": 255024, + "name": "shared universe" + }, + { + "id": 258575, + "name": "valiant comics" + } + ], + "production_companies": [ + { + "id": 34, + "name": "Sony Pictures", + "origin_country": "US" + }, + { + "id": 10246, + "name": "Cross Creek Pictures", + "origin_country": "US" + }, + { + "id": 6573, + "name": "Mimran Schur Pictures", + "origin_country": "US" + }, + { + "id": 333, + "name": "Original Film", + "origin_country": "US" + }, + { + "id": 103673, + "name": "The Hideaway Entertainment", + "origin_country": "US" + }, + { + "id": 124335, + "name": "Valiant Entertainment", + "origin_country": "US" + }, + { + "id": 5, + "name": "Columbia Pictures", + "origin_country": "US" + }, + { + "id": 1225, + "name": "One Race", + "origin_country": "US" + }, + { + "id": 30148, + "name": "Bona Film Group", + "origin_country": "CN" + } + ] + }, + { + "title": "The Call of the Wild", + "rank": 5, + "keywords": [ + { + "id": 818, + "name": "based on novel or book" + }, + { + "id": 4542, + "name": "gold rush" + }, + { + "id": 15162, + "name": "dog" + }, + { + "id": 155821, + "name": "sled dogs" + }, + { + "id": 189390, + "name": "yukon" + }, + { + "id": 207928, + "name": "19th century" + }, + { + "id": 259987, + "name": "cgi animation" + }, + { + "id": 263806, + "name": "1890s" + } + ], + "production_companies": [ + { + "id": 787, + "name": "3 Arts Entertainment", + "origin_country": "US" + }, + { + "id": 127928, + "name": "20th Century Studios", + "origin_country": "US" + }, + { + "id": 22213, + "name": "TSG Entertainment", + "origin_country": "US" + } + ] + }, + { + "title": "Sonic the Hedgehog", + "rank": 6, + "keywords": [ + { + "id": 282, + "name": "video game" + }, + { + "id": 6054, + "name": "friendship" + }, + { + "id": 10842, + "name": "good vs evil" + }, + { + "id": 41645, + "name": "based on video game" + }, + { + "id": 167043, + "name": "road movie" + }, + { + "id": 172142, + "name": "farting" + }, + { + "id": 188933, + "name": "bar fight" + }, + { + "id": 226967, + "name": "amistad" + }, + { + "id": 245230, + "name": "live action remake" + }, + { + "id": 258111, + "name": "fantasy" + }, + { + "id": 260223, + "name": "videojuego" + } + ], + "production_companies": [ + { + "id": 333, + "name": "Original Film", + "origin_country": "US" + }, + { + "id": 10644, + "name": "Blur Studios", + "origin_country": "US" + }, + { + "id": 77884, + "name": "Marza Animation Planet", + "origin_country": "JP" + }, + { + "id": 4, + "name": "Paramount", + "origin_country": "US" + }, + { + "id": 113750, + "name": "SEGA", + "origin_country": "JP" + }, + { + "id": 100711, + "name": "DJ2 Entertainment", + "origin_country": "" + }, + { + "id": 24955, + "name": "Paramount Animation", + "origin_country": "US" + } + ] + }, + { + "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", + "rank": 7, + "keywords": [ + { + "id": 849, + "name": "dc comics" + }, + { + "id": 9717, + "name": "based on comic" + }, + { + "id": 187056, + "name": "woman director" + }, + { + "id": 229266, + "name": "dc extended universe" + } + ], + "production_companies": [ + { + "id": 9993, + "name": "DC Entertainment", + "origin_country": "US" + }, + { + "id": 82968, + "name": "LuckyChap Entertainment", + "origin_country": "GB" + }, + { + "id": 103462, + "name": "Kroll & Co Entertainment", + "origin_country": "US" + }, + { + "id": 174, + "name": "Warner Bros. Pictures", + "origin_country": "US" + }, + { + "id": 429, + "name": "DC Comics", + "origin_country": "US" + }, + { + "id": 128064, + "name": "DC Films", + "origin_country": "US" + }, + { + "id": 101831, + "name": "Clubhouse Pictures", + "origin_country": "US" + } + ] + }, + { + "title": "Justice League Dark: Apokolips War", + "rank": 8, + "keywords": [ + { + "id": 849, + "name": "dc comics" + } + ], + "production_companies": [ + { + "id": 2785, + "name": "Warner Bros. Animation", + "origin_country": "US" + }, + { + "id": 9993, + "name": "DC Entertainment", + "origin_country": "US" + }, + { + "id": 429, + "name": "DC Comics", + "origin_country": "US" + } + ] + }, + { + "title": "Parasite", + "rank": 9, + "keywords": [ + { + "id": 1353, + "name": "underground" + }, + { + "id": 5318, + "name": "seoul" + }, + { + "id": 5732, + "name": "birthday party" + }, + { + "id": 5752, + "name": "private lessons" + }, + { + "id": 9866, + "name": "basement" + }, + { + "id": 10453, + "name": "con artist" + }, + { + "id": 11935, + "name": "working class" + }, + { + "id": 12565, + "name": "psychological thriller" + }, + { + "id": 13126, + "name": "limousine driver" + }, + { + "id": 14514, + "name": "class differences" + }, + { + "id": 14864, + "name": "rich poor" + }, + { + "id": 17997, + "name": "housekeeper" + }, + { + "id": 18015, + "name": "tutor" + }, + { + "id": 18035, + "name": "family" + }, + { + "id": 33421, + "name": "crime family" + }, + { + "id": 173272, + "name": "flood" + }, + { + "id": 188861, + "name": "smell" + }, + { + "id": 198673, + "name": "unemployed" + }, + { + "id": 237462, + "name": "wealthy family" + } + ], + "production_companies": [ + { + "id": 7036, + "name": "CJ Entertainment", + "origin_country": "KR" + }, + { + "id": 4399, + "name": "Barunson E&A", + "origin_country": "KR" + } + ] + }, + { + "title": "Star Wars: The Rise of Skywalker", + "rank": 10, + "keywords": [ + { + "id": 161176, + "name": "space opera" + } + ], + "production_companies": [ + { + "id": 1, + "name": "Lucasfilm", + "origin_country": "US" + }, + { + "id": 11461, + "name": "Bad Robot", + "origin_country": "US" + }, + { + "id": 2, + "name": "Walt Disney Pictures", + "origin_country": "US" + }, + { + "id": 120404, + "name": "British Film Commission", + "origin_country": "" + } + ] + } ] ``` - --- ## Simple search_json call -This query uses search_json to convert the keywords object array to a simple string array. The expression '[name]' tells the function to extract all values for the name attribute and wrap them in an array. + +This query uses search_json to convert the keywords object array to a simple string array. The expression '[name]' tells the function to extract all values for the name attribute and wrap them in an array. ### Body ```json { - "operation": "sql", - "sql": "SELECT title, rank, search_json('[name]', keywords) as keywords FROM movies.movie ORDER BY rank LIMIT 10" + "operation": "sql", + "sql": "SELECT title, rank, search_json('[name]', keywords) as keywords FROM movies.movie ORDER BY rank LIMIT 10" } ``` ### Response: 200 + ```json [ - { - "title": "Ad Astra", - "rank": 1, - "keywords": [ - "moon", - "loss of loved one", - "planet mars", - "astronaut", - "moon colony", - "solar system", - "father son relationship", - "near future", - "planet neptune", - "space walk" - ] - }, - { - "title": "Extraction", - "rank": 2, - "keywords": [ - "mercenary", - "mumbai (bombay), india", - "based on comic", - "crime boss", - "rescue mission", - "based on graphic novel", - "dhaka (dacca), bangladesh" - ] - }, - { - "title": "To the Beat! Back 2 School", - "rank": 3, - "keywords": [ - "school" - ] - }, - { - "title": "Bloodshot", - "rank": 4, - "keywords": [ - "nanotechnology", - "superhero", - "based on comic", - "psychotronic", - "shared universe", - "valiant comics" - ] - }, - { - "title": "The Call of the Wild", - "rank": 5, - "keywords": [ - "based on novel or book", - "gold rush", - "dog", - "sled dogs", - "yukon", - "19th century", - "cgi animation", - "1890s" - ] - }, - { - "title": "Sonic the Hedgehog", - "rank": 6, - "keywords": [ - "video game", - "friendship", - "good vs evil", - "based on video game", - "road movie", - "farting", - "bar fight", - "amistad", - "live action remake", - "fantasy", - "videojuego" - ] - }, - { - "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", - "rank": 7, - "keywords": [ - "dc comics", - "based on comic", - "woman director", - "dc extended universe" - ] - }, - { - "title": "Justice League Dark: Apokolips War", - "rank": 8, - "keywords": [ - "dc comics" - ] - }, - { - "title": "Parasite", - "rank": 9, - "keywords": [ - "underground", - "seoul", - "birthday party", - "private lessons", - "basement", - "con artist", - "working class", - "psychological thriller", - "limousine driver", - "class differences", - "rich poor", - "housekeeper", - "tutor", - "family", - "crime family", - "flood", - "smell", - "unemployed", - "wealthy family" - ] - }, - { - "title": "Star Wars: The Rise of Skywalker", - "rank": 10, - "keywords": [ - "space opera" - ] - } + { + "title": "Ad Astra", + "rank": 1, + "keywords": [ + "moon", + "loss of loved one", + "planet mars", + "astronaut", + "moon colony", + "solar system", + "father son relationship", + "near future", + "planet neptune", + "space walk" + ] + }, + { + "title": "Extraction", + "rank": 2, + "keywords": [ + "mercenary", + "mumbai (bombay), india", + "based on comic", + "crime boss", + "rescue mission", + "based on graphic novel", + "dhaka (dacca), bangladesh" + ] + }, + { + "title": "To the Beat! Back 2 School", + "rank": 3, + "keywords": ["school"] + }, + { + "title": "Bloodshot", + "rank": 4, + "keywords": ["nanotechnology", "superhero", "based on comic", "psychotronic", "shared universe", "valiant comics"] + }, + { + "title": "The Call of the Wild", + "rank": 5, + "keywords": [ + "based on novel or book", + "gold rush", + "dog", + "sled dogs", + "yukon", + "19th century", + "cgi animation", + "1890s" + ] + }, + { + "title": "Sonic the Hedgehog", + "rank": 6, + "keywords": [ + "video game", + "friendship", + "good vs evil", + "based on video game", + "road movie", + "farting", + "bar fight", + "amistad", + "live action remake", + "fantasy", + "videojuego" + ] + }, + { + "title": "Birds of Prey (and the Fantabulous Emancipation of One Harley Quinn)", + "rank": 7, + "keywords": ["dc comics", "based on comic", "woman director", "dc extended universe"] + }, + { + "title": "Justice League Dark: Apokolips War", + "rank": 8, + "keywords": ["dc comics"] + }, + { + "title": "Parasite", + "rank": 9, + "keywords": [ + "underground", + "seoul", + "birthday party", + "private lessons", + "basement", + "con artist", + "working class", + "psychological thriller", + "limousine driver", + "class differences", + "rich poor", + "housekeeper", + "tutor", + "family", + "crime family", + "flood", + "smell", + "unemployed", + "wealthy family" + ] + }, + { + "title": "Star Wars: The Rise of Skywalker", + "rank": 10, + "keywords": ["space opera"] + } ] ``` - --- ## Use search_json in a where clause -This example shows how we can use SEARCH_JSON to filter out records in a WHERE clause. The production_companies attribute holds an object array of companies that produced each movie, we want to only see movies which were produced by Marvel Studios. Our expression is a filter '$[name="Marvel Studios"]' this tells the function to iterate the production_companies array and only return entries where the name is "Marvel Studios". + +This example shows how we can use SEARCH_JSON to filter out records in a WHERE clause. The production_companies attribute holds an object array of companies that produced each movie, we want to only see movies which were produced by Marvel Studios. Our expression is a filter '$[name="Marvel Studios"]' this tells the function to iterate the production_companies array and only return entries where the name is "Marvel Studios". ### Body ```json { - "operation": "sql", - "sql": "SELECT title, release_date FROM movies.movie where search_json('$[name=\"Marvel Studios\"]', production_companies) IS NOT NULL ORDER BY release_date" + "operation": "sql", + "sql": "SELECT title, release_date FROM movies.movie where search_json('$[name=\"Marvel Studios\"]', production_companies) IS NOT NULL ORDER BY release_date" } ``` ### Response: 200 + ```json [ - { - "title": "Iron Man", - "release_date": "2008-04-30" - }, - { - "title": "The Incredible Hulk", - "release_date": "2008-06-12" - }, - { - "title": "Iron Man 2", - "release_date": "2010-04-28" - }, - { - "title": "Thor", - "release_date": "2011-04-21" - }, - { - "title": "Captain America: The First Avenger", - "release_date": "2011-07-22" - }, - { - "title": "Marvel One-Shot: The Consultant", - "release_date": "2011-09-12" - }, - { - "title": "Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer", - "release_date": "2011-10-25" - }, - { - "title": "The Avengers", - "release_date": "2012-04-25" - }, - { - "title": "Marvel One-Shot: Item 47", - "release_date": "2012-09-13" - }, - { - "title": "Iron Man 3", - "release_date": "2013-04-18" - }, - { - "title": "Marvel One-Shot: Agent Carter", - "release_date": "2013-09-08" - }, - { - "title": "Thor: The Dark World", - "release_date": "2013-10-29" - }, - { - "title": "Marvel One-Shot: All Hail the King", - "release_date": "2014-02-04" - }, - { - "title": "Marvel Studios: Assembling a Universe", - "release_date": "2014-03-18" - }, - { - "title": "Captain America: The Winter Soldier", - "release_date": "2014-03-20" - }, - { - "title": "Guardians of the Galaxy", - "release_date": "2014-07-30" - }, - { - "title": "Avengers: Age of Ultron", - "release_date": "2015-04-22" - }, - { - "title": "Ant-Man", - "release_date": "2015-07-14" - }, - { - "title": "Captain America: Civil War", - "release_date": "2016-04-27" - }, - { - "title": "Team Thor", - "release_date": "2016-08-28" - }, - { - "title": "Doctor Strange", - "release_date": "2016-10-25" - }, - { - "title": "Guardians of the Galaxy Vol. 2", - "release_date": "2017-04-19" - }, - { - "title": "Spider-Man: Homecoming", - "release_date": "2017-07-05" - }, - { - "title": "Thor: Ragnarok", - "release_date": "2017-10-25" - }, - { - "title": "Black Panther", - "release_date": "2018-02-13" - }, - { - "title": "Avengers: Infinity War", - "release_date": "2018-04-25" - }, - { - "title": "Ant-Man and the Wasp", - "release_date": "2018-07-04" - }, - { - "title": "Captain Marvel", - "release_date": "2019-03-06" - }, - { - "title": "Avengers: Endgame", - "release_date": "2019-04-24" - }, - { - "title": "Spider-Man: Far from Home", - "release_date": "2019-06-28" - }, - { - "title": "Black Widow", - "release_date": "2020-10-28" - }, - { - "title": "Untitled Spider-Man 3", - "release_date": "2021-11-04" - }, - { - "title": "Thor: Love and Thunder", - "release_date": "2022-02-10" - }, - { - "title": "Doctor Strange in the Multiverse of Madness", - "release_date": "2022-03-23" - }, - { - "title": "Untitled Marvel Project (3)", - "release_date": "2022-07-29" - }, - { - "title": "Guardians of the Galaxy Vol. 3", - "release_date": "2023-02-16" - } + { + "title": "Iron Man", + "release_date": "2008-04-30" + }, + { + "title": "The Incredible Hulk", + "release_date": "2008-06-12" + }, + { + "title": "Iron Man 2", + "release_date": "2010-04-28" + }, + { + "title": "Thor", + "release_date": "2011-04-21" + }, + { + "title": "Captain America: The First Avenger", + "release_date": "2011-07-22" + }, + { + "title": "Marvel One-Shot: The Consultant", + "release_date": "2011-09-12" + }, + { + "title": "Marvel One-Shot: A Funny Thing Happened on the Way to Thor's Hammer", + "release_date": "2011-10-25" + }, + { + "title": "The Avengers", + "release_date": "2012-04-25" + }, + { + "title": "Marvel One-Shot: Item 47", + "release_date": "2012-09-13" + }, + { + "title": "Iron Man 3", + "release_date": "2013-04-18" + }, + { + "title": "Marvel One-Shot: Agent Carter", + "release_date": "2013-09-08" + }, + { + "title": "Thor: The Dark World", + "release_date": "2013-10-29" + }, + { + "title": "Marvel One-Shot: All Hail the King", + "release_date": "2014-02-04" + }, + { + "title": "Marvel Studios: Assembling a Universe", + "release_date": "2014-03-18" + }, + { + "title": "Captain America: The Winter Soldier", + "release_date": "2014-03-20" + }, + { + "title": "Guardians of the Galaxy", + "release_date": "2014-07-30" + }, + { + "title": "Avengers: Age of Ultron", + "release_date": "2015-04-22" + }, + { + "title": "Ant-Man", + "release_date": "2015-07-14" + }, + { + "title": "Captain America: Civil War", + "release_date": "2016-04-27" + }, + { + "title": "Team Thor", + "release_date": "2016-08-28" + }, + { + "title": "Doctor Strange", + "release_date": "2016-10-25" + }, + { + "title": "Guardians of the Galaxy Vol. 2", + "release_date": "2017-04-19" + }, + { + "title": "Spider-Man: Homecoming", + "release_date": "2017-07-05" + }, + { + "title": "Thor: Ragnarok", + "release_date": "2017-10-25" + }, + { + "title": "Black Panther", + "release_date": "2018-02-13" + }, + { + "title": "Avengers: Infinity War", + "release_date": "2018-04-25" + }, + { + "title": "Ant-Man and the Wasp", + "release_date": "2018-07-04" + }, + { + "title": "Captain Marvel", + "release_date": "2019-03-06" + }, + { + "title": "Avengers: Endgame", + "release_date": "2019-04-24" + }, + { + "title": "Spider-Man: Far from Home", + "release_date": "2019-06-28" + }, + { + "title": "Black Widow", + "release_date": "2020-10-28" + }, + { + "title": "Untitled Spider-Man 3", + "release_date": "2021-11-04" + }, + { + "title": "Thor: Love and Thunder", + "release_date": "2022-02-10" + }, + { + "title": "Doctor Strange in the Multiverse of Madness", + "release_date": "2022-03-23" + }, + { + "title": "Untitled Marvel Project (3)", + "release_date": "2022-07-29" + }, + { + "title": "Guardians of the Galaxy Vol. 3", + "release_date": "2023-02-16" + } ] ``` - --- ## Use search_json to show the movies with the largest casts -This example shows how we can use SEARCH_JSON to perform a simple calculation on JSON and order by the results. The cast attribute holds an object array of details around the cast of a movie. We use the expression '$count(id)' that counts each id and returns the value back which we alias in SQL as cast_size which in turn gets used to sort the rows. + +This example shows how we can use SEARCH_JSON to perform a simple calculation on JSON and order by the results. The cast attribute holds an object array of details around the cast of a movie. We use the expression '$count(id)' that counts each id and returns the value back which we alias in SQL as cast_size which in turn gets used to sort the rows. ### Body ```json { - "operation": "sql", - "sql": "SELECT movie_title, search_json('$count(id)', `cast`) as cast_size FROM movies.credits ORDER BY cast_size DESC LIMIT 10" + "operation": "sql", + "sql": "SELECT movie_title, search_json('$count(id)', `cast`) as cast_size FROM movies.credits ORDER BY cast_size DESC LIMIT 10" } ``` ### Response: 200 + ```json [ - { - "movie_title": "Around the World in Eighty Days", - "cast_size": 312 - }, - { - "movie_title": "And the Oscar Goes To...", - "cast_size": 259 - }, - { - "movie_title": "Rock of Ages", - "cast_size": 223 - }, - { - "movie_title": "Mr. Smith Goes to Washington", - "cast_size": 213 - }, - { - "movie_title": "Les Misérables", - "cast_size": 208 - }, - { - "movie_title": "Jason Bourne", - "cast_size": 201 - }, - { - "movie_title": "The Muppets", - "cast_size": 191 - }, - { - "movie_title": "You Don't Mess with the Zohan", - "cast_size": 183 - }, - { - "movie_title": "The Irishman", - "cast_size": 173 - }, - { - "movie_title": "Spider-Man: Far from Home", - "cast_size": 173 - } + { + "movie_title": "Around the World in Eighty Days", + "cast_size": 312 + }, + { + "movie_title": "And the Oscar Goes To...", + "cast_size": 259 + }, + { + "movie_title": "Rock of Ages", + "cast_size": 223 + }, + { + "movie_title": "Mr. Smith Goes to Washington", + "cast_size": 213 + }, + { + "movie_title": "Les Misérables", + "cast_size": 208 + }, + { + "movie_title": "Jason Bourne", + "cast_size": 201 + }, + { + "movie_title": "The Muppets", + "cast_size": 191 + }, + { + "movie_title": "You Don't Mess with the Zohan", + "cast_size": 183 + }, + { + "movie_title": "The Irishman", + "cast_size": 173 + }, + { + "movie_title": "Spider-Man: Far from Home", + "cast_size": 173 + } ] ``` - --- ## search_json as a condition, in a select with a table join -This example shows how we can use SEARCH_JSON to find movies where at least of 2 our favorite actors from Marvel films have acted together then list the movie, its overview, release date, and the actors names and their characters. The WHERE clause performs a count on credits.cast attribute that have the matching actors. The SELECT performs the same filter on the cast attribute and performs a transform on each object to just return the actor's name and their character. + +This example shows how we can use SEARCH_JSON to find movies where at least of 2 our favorite actors from Marvel films have acted together then list the movie, its overview, release date, and the actors names and their characters. The WHERE clause performs a count on credits.cast attribute that have the matching actors. The SELECT performs the same filter on the cast attribute and performs a transform on each object to just return the actor's name and their character. ### Body ```json { - "operation": "sql", - "sql": "SELECT m.title, m.overview, m.release_date, search_json('$[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]].{\"actor\": name, \"character\": character}', c.`cast`) as characters FROM movies.credits c INNER JOIN movies.movie m ON c.movie_id = m.id WHERE search_json('$count($[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]])', c.`cast`) >= 2" + "operation": "sql", + "sql": "SELECT m.title, m.overview, m.release_date, search_json('$[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]].{\"actor\": name, \"character\": character}', c.`cast`) as characters FROM movies.credits c INNER JOIN movies.movie m ON c.movie_id = m.id WHERE search_json('$count($[name in [\"Robert Downey Jr.\", \"Chris Evans\", \"Scarlett Johansson\", \"Mark Ruffalo\", \"Chris Hemsworth\", \"Jeremy Renner\", \"Clark Gregg\", \"Samuel L. Jackson\", \"Gwyneth Paltrow\", \"Don Cheadle\"]])', c.`cast`) >= 2" } ``` ### Response: 200 + ```json [ - { - "title": "Out of Sight", - "overview": "Meet Jack Foley, a smooth criminal who bends the law and is determined to make one last heist. Karen Sisco is a federal marshal who chooses all the right moves … and all the wrong guys. Now they're willing to risk it all to find out if there's more between them than just the law.", - "release_date": "1998-06-26", - "characters": [ - { - "actor": "Don Cheadle", - "character": "Maurice Miller" - }, - { - "actor": "Samuel L. Jackson", - "character": "Hejira Henry (uncredited)" - } - ] - }, - { - "title": "Iron Man", - "overview": "After being held captive in an Afghan cave, billionaire engineer Tony Stark creates a unique weaponized suit of armor to fight evil.", - "release_date": "2008-04-30", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury (uncredited)" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - } - ] - }, - { - "title": "Captain America: The First Avenger", - "overview": "During World War II, Steve Rogers is a sickly man from Brooklyn who's transformed into super-soldier Captain America to aid in the war effort. Rogers must stop the Red Skull – Adolf Hitler's ruthless head of weaponry, and the leader of an organization that intends to use a mysterious device of untold powers for world domination.", - "release_date": "2011-07-22", - "characters": [ - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - } - ] - }, - { - "title": "In Good Company", - "overview": "Dan Foreman is a seasoned advertisement sales executive at a high-ranking publication when a corporate takeover results in him being placed under naive supervisor Carter Duryea, who is half his age. Matters are made worse when Dan's new supervisor becomes romantically involved with his daughter an 18 year-old college student Alex.", - "release_date": "2004-12-29", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Alex Foreman" - }, - { - "actor": "Clark Gregg", - "character": "Mark Steckle" - } - ] - }, - { - "title": "Zodiac", - "overview": "The true story of the investigation of the \"Zodiac Killer\", a serial killer who terrified the San Francisco Bay Area, taunting police with his ciphers and letters. The case becomes an obsession for three men as their lives and careers are built and destroyed by the endless trail of clues.", - "release_date": "2007-03-02", - "characters": [ - { - "actor": "Mark Ruffalo", - "character": "Dave Toschi" - }, - { - "actor": "Robert Downey Jr.", - "character": "Paul Avery" - } - ] - }, - { - "title": "Hard Eight", - "overview": "A stranger mentors a young Reno gambler who weds a hooker and befriends a vulgar casino regular.", - "release_date": "1996-02-28", - "characters": [ - { - "actor": "Gwyneth Paltrow", - "character": "Clementine" - }, - { - "actor": "Samuel L. Jackson", - "character": "Jimmy" - } - ] - }, - { - "title": "The Spirit", - "overview": "Down these mean streets a man must come. A hero born, murdered, and born again. A Rookie cop named Denny Colt returns from the beyond as The Spirit, a hero whose mission is to fight against the bad forces from the shadows of Central City. The Octopus, who kills anyone unfortunate enough to see his face, has other plans; he is going to wipe out the entire city.", - "release_date": "2008-12-25", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Silken Floss" - }, - { - "actor": "Samuel L. Jackson", - "character": "Octopuss" - } - ] - }, - { - "title": "S.W.A.T.", - "overview": "Hondo Harrelson recruits Jim Street to join an elite unit of the Los Angeles Police Department. Together they seek out more members, including tough Deke Kay and single mom Chris Sanchez. The team's first big assignment is to escort crime boss Alex Montel to prison. It seems routine, but when Montel offers a huge reward to anyone who can break him free, criminals of various stripes step up for the prize.", - "release_date": "2003-08-08", - "characters": [ - { - "actor": "Samuel L. Jackson", - "character": "Sgt. Dan 'Hondo' Harrelson" - }, - { - "actor": "Jeremy Renner", - "character": "Brian Gamble" - } - ] - }, - { - "title": "Iron Man 2", - "overview": "With the world now aware of his dual life as the armored superhero Iron Man, billionaire inventor Tony Stark faces pressure from the government, the press and the public to share his technology with the military. Unwilling to let go of his invention, Stark, with Pepper Potts and James 'Rhodey' Rhodes at his side, must forge new alliances – and confront powerful enemies.", - "release_date": "2010-04-28", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - }, - { - "actor": "Scarlett Johansson", - "character": "Natalie Rushman / Natasha Romanoff / Black Widow" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - } - ] - }, - { - "title": "Thor", - "overview": "Against his father Odin's will, The Mighty Thor - a powerful but arrogant warrior god - recklessly reignites an ancient war. Thor is cast down to Earth and forced to live among humans as punishment. Once here, Thor learns what it takes to be a true hero when the most dangerous villain of his world sends the darkest forces of Asgard to invade Earth.", - "release_date": "2011-04-21", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye (uncredited)" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury (uncredited)" - } - ] - }, - { - "title": "View from the Top", - "overview": "A small-town woman tries to achieve her goal of becoming a flight attendant.", - "release_date": "2003-03-21", - "characters": [ - { - "actor": "Gwyneth Paltrow", - "character": "Donna" - }, - { - "actor": "Mark Ruffalo", - "character": "Ted Stewart" - } - ] - }, - { - "title": "The Nanny Diaries", - "overview": "A college graduate goes to work as a nanny for a rich New York family. Ensconced in their home, she has to juggle their dysfunction, a new romance, and the spoiled brat in her charge.", - "release_date": "2007-08-24", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Annie Braddock" - }, - { - "actor": "Chris Evans", - "character": "Hayden \"Harvard Hottie\"" - } - ] - }, - { - "title": "The Perfect Score", - "overview": "Six high school seniors decide to break into the Princeton Testing Center so they can steal the answers to their upcoming SAT tests and all get perfect scores.", - "release_date": "2004-01-30", - "characters": [ - { - "actor": "Chris Evans", - "character": "Kyle" - }, - { - "actor": "Scarlett Johansson", - "character": "Francesca Curtis" - } - ] - }, - { - "title": "The Avengers", - "overview": "When an unexpected enemy emerges and threatens global safety and security, Nick Fury, director of the international peacekeeping agency known as S.H.I.E.L.D., finds himself in need of a team to pull the world back from the brink of disaster. Spanning the globe, a daring recruitment effort begins!", - "release_date": "2012-04-25", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - } - ] - }, - { - "title": "Iron Man 3", - "overview": "When Tony Stark's world is torn apart by a formidable terrorist called the Mandarin, he starts an odyssey of rebuilding and retribution.", - "release_date": "2013-04-18", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / Iron Patriot" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner (uncredited)" - } - ] - }, - { - "title": "Marvel One-Shot: The Consultant", - "overview": "Agent Coulson informs Agent Sitwell that the World Security Council wishes Emil Blonsky to be released from prison to join the Avengers Initiative. As Nick Fury doesn't want to release Blonsky, the two agents decide to send a patsy to sabotage the meeting...", - "release_date": "2011-09-12", - "characters": [ - { - "actor": "Clark Gregg", - "character": "Phil Coulson" - }, - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark (archive footage)" - } - ] - }, - { - "title": "Thor: The Dark World", - "overview": "Thor fights to restore order across the cosmos… but an ancient race led by the vengeful Malekith returns to plunge the universe back into darkness. Faced with an enemy that even Odin and Asgard cannot withstand, Thor must embark on his most perilous and personal journey yet, one that will reunite him with Jane Foster and force him to sacrifice everything to save us all.", - "release_date": "2013-10-29", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Chris Evans", - "character": "Loki as Captain America (uncredited)" - } - ] - }, - { - "title": "Avengers: Age of Ultron", - "overview": "When Tony Stark tries to jumpstart a dormant peacekeeping program, things go awry and Earth’s Mightiest Heroes are put to the ultimate test as the fate of the planet hangs in the balance. As the villainous Ultron emerges, it is up to The Avengers to stop him from enacting his terrible plans, and soon uneasy alliances and unexpected action pave the way for an epic and unique global adventure.", - "release_date": "2015-04-22", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - } - ] - }, - { - "title": "Captain America: The Winter Soldier", - "overview": "After the cataclysmic events in New York with The Avengers, Steve Rogers, aka Captain America is living quietly in Washington, D.C. and trying to adjust to the modern world. But when a S.H.I.E.L.D. colleague comes under attack, Steve becomes embroiled in a web of intrigue that threatens to put the world at risk. Joining forces with the Black Widow, Captain America struggles to expose the ever-widening conspiracy while fighting off professional assassins sent to silence him at every turn. When the full scope of the villainous plot is revealed, Captain America and the Black Widow enlist the help of a new ally, the Falcon. However, they soon find themselves up against an unexpected and formidable enemy—the Winter Soldier.", - "release_date": "2014-03-20", - "characters": [ - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - } - ] - }, - { - "title": "Thanks for Sharing", - "overview": "A romantic comedy that brings together three disparate characters who are learning to face a challenging and often confusing world as they struggle together against a common demon—sex addiction.", - "release_date": "2013-09-19", - "characters": [ - { - "actor": "Mark Ruffalo", - "character": "Adam" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Phoebe" - } - ] - }, - { - "title": "Chef", - "overview": "When Chef Carl Casper suddenly quits his job at a prominent Los Angeles restaurant after refusing to compromise his creative integrity for its controlling owner, he is left to figure out what's next. Finding himself in Miami, he teams up with his ex-wife, his friend and his son to launch a food truck. Taking to the road, Chef Carl goes back to his roots to reignite his passion for the kitchen -- and zest for life and love.", - "release_date": "2014-05-08", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Molly" - }, - { - "actor": "Robert Downey Jr.", - "character": "Marvin" - } - ] - }, - { - "title": "Marvel Studios: Assembling a Universe", - "overview": "A look at the story behind Marvel Studios and the Marvel Cinematic Universe, featuring interviews and behind-the-scenes footage from all of the Marvel films, the Marvel One-Shots and \"Marvel's Agents of S.H.I.E.L.D.\"", - "release_date": "2014-03-18", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Himself / Tony Stark / Iron Man" - }, - { - "actor": "Chris Hemsworth", - "character": "Himself / Thor" - }, - { - "actor": "Chris Evans", - "character": "Himself / Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Himself / Bruce Banner / Hulk" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Herself" - }, - { - "actor": "Clark Gregg", - "character": "Himself" - }, - { - "actor": "Samuel L. Jackson", - "character": "Himself" - }, - { - "actor": "Scarlett Johansson", - "character": "Herself" - }, - { - "actor": "Jeremy Renner", - "character": "Himself" - } - ] - }, - { - "title": "Captain America: Civil War", - "overview": "Following the events of Age of Ultron, the collective governments of the world pass an act designed to regulate all superhuman activity. This polarizes opinion amongst the Avengers, causing two factions to side with Iron Man or Captain America, which causes an epic battle between former allies.", - "release_date": "2016-04-27", - "characters": [ - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - } - ] - }, - { - "title": "Thor: Ragnarok", - "overview": "Thor is imprisoned on the other side of the universe and finds himself in a race against time to get back to Asgard to stop Ragnarok, the destruction of his home-world and the end of Asgardian civilization, at the hands of an all-powerful new threat, the ruthless Hela.", - "release_date": "2017-10-25", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / Hulk" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow (archive footage / uncredited)" - } - ] - }, - { - "title": "Avengers: Endgame", - "overview": "After the devastating events of Avengers: Infinity War, the universe is in ruins due to the efforts of the Mad Titan, Thanos. With the help of remaining allies, the Avengers must assemble once more in order to undo Thanos' actions and restore order to the universe once and for all, no matter what consequences may be in store.", - "release_date": "2019-04-24", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / Hulk" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Jeremy Renner", - "character": "Clint Barton / Hawkeye" - }, - { - "actor": "Don Cheadle", - "character": "James Rhodes / War Machine" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Pepper Potts" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - } - ] - }, - { - "title": "Avengers: Infinity War", - "overview": "As the Avengers and their allies have continued to protect the world from threats too large for any one hero to handle, a new danger has emerged from the cosmic shadows: Thanos. A despot of intergalactic infamy, his goal is to collect all six Infinity Stones, artifacts of unimaginable power, and use them to inflict his twisted will on all of reality. Everything the Avengers have fought for has led up to this moment - the fate of Earth and existence itself has never been more uncertain.", - "release_date": "2018-04-25", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Don Cheadle", - "character": "James \"Rhodey\" Rhodes / War Machine" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury (uncredited)" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - } - ] - }, - { - "title": "Captain Marvel", - "overview": "The story follows Carol Danvers as she becomes one of the universe’s most powerful heroes when Earth is caught in the middle of a galactic war between two alien races. Set in the 1990s, Captain Marvel is an all-new adventure from a previously unseen period in the history of the Marvel Cinematic Universe.", - "release_date": "2019-03-06", - "characters": [ - { - "actor": "Samuel L. Jackson", - "character": "Nick Fury" - }, - { - "actor": "Clark Gregg", - "character": "Agent Phil Coulson" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America (uncredited)" - }, - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow (uncredited)" - }, - { - "actor": "Don Cheadle", - "character": "James 'Rhodey' Rhodes / War Machine (uncredited)" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk (uncredited)" - } - ] - }, - { - "title": "Spider-Man: Homecoming", - "overview": "Following the events of Captain America: Civil War, Peter Parker, with the help of his mentor Tony Stark, tries to balance his life as an ordinary high school student in Queens, New York City, with fighting crime as his superhero alter ego Spider-Man as a new threat, the Vulture, emerges.", - "release_date": "2017-07-05", - "characters": [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Gwyneth Paltrow", - "character": "Virginia \"Pepper\" Potts" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - } - ] - }, - { - "title": "Team Thor", - "overview": "Discover what Thor was up to during the events of Captain America: Civil War.", - "release_date": "2016-08-28", - "characters": [ - { - "actor": "Chris Hemsworth", - "character": "Thor Odinson" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner" - } - ] - }, - { - "title": "Black Widow", - "overview": "Natasha Romanoff, also known as Black Widow, confronts the darker parts of her ledger when a dangerous conspiracy with ties to her past arises. Pursued by a force that will stop at nothing to bring her down, Natasha must deal with her history as a spy and the broken relationships left in her wake long before she became an Avenger.", - "release_date": "2020-10-28", - "characters": [ - { - "actor": "Scarlett Johansson", - "character": "Natasha Romanoff / Black Widow" - }, - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - } - ] - } + { + "title": "Out of Sight", + "overview": "Meet Jack Foley, a smooth criminal who bends the law and is determined to make one last heist. Karen Sisco is a federal marshal who chooses all the right moves … and all the wrong guys. Now they're willing to risk it all to find out if there's more between them than just the law.", + "release_date": "1998-06-26", + "characters": [ + { + "actor": "Don Cheadle", + "character": "Maurice Miller" + }, + { + "actor": "Samuel L. Jackson", + "character": "Hejira Henry (uncredited)" + } + ] + }, + { + "title": "Iron Man", + "overview": "After being held captive in an Afghan cave, billionaire engineer Tony Stark creates a unique weaponized suit of armor to fight evil.", + "release_date": "2008-04-30", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury (uncredited)" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + } + ] + }, + { + "title": "Captain America: The First Avenger", + "overview": "During World War II, Steve Rogers is a sickly man from Brooklyn who's transformed into super-soldier Captain America to aid in the war effort. Rogers must stop the Red Skull – Adolf Hitler's ruthless head of weaponry, and the leader of an organization that intends to use a mysterious device of untold powers for world domination.", + "release_date": "2011-07-22", + "characters": [ + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + } + ] + }, + { + "title": "In Good Company", + "overview": "Dan Foreman is a seasoned advertisement sales executive at a high-ranking publication when a corporate takeover results in him being placed under naive supervisor Carter Duryea, who is half his age. Matters are made worse when Dan's new supervisor becomes romantically involved with his daughter an 18 year-old college student Alex.", + "release_date": "2004-12-29", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Alex Foreman" + }, + { + "actor": "Clark Gregg", + "character": "Mark Steckle" + } + ] + }, + { + "title": "Zodiac", + "overview": "The true story of the investigation of the \"Zodiac Killer\", a serial killer who terrified the San Francisco Bay Area, taunting police with his ciphers and letters. The case becomes an obsession for three men as their lives and careers are built and destroyed by the endless trail of clues.", + "release_date": "2007-03-02", + "characters": [ + { + "actor": "Mark Ruffalo", + "character": "Dave Toschi" + }, + { + "actor": "Robert Downey Jr.", + "character": "Paul Avery" + } + ] + }, + { + "title": "Hard Eight", + "overview": "A stranger mentors a young Reno gambler who weds a hooker and befriends a vulgar casino regular.", + "release_date": "1996-02-28", + "characters": [ + { + "actor": "Gwyneth Paltrow", + "character": "Clementine" + }, + { + "actor": "Samuel L. Jackson", + "character": "Jimmy" + } + ] + }, + { + "title": "The Spirit", + "overview": "Down these mean streets a man must come. A hero born, murdered, and born again. A Rookie cop named Denny Colt returns from the beyond as The Spirit, a hero whose mission is to fight against the bad forces from the shadows of Central City. The Octopus, who kills anyone unfortunate enough to see his face, has other plans; he is going to wipe out the entire city.", + "release_date": "2008-12-25", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Silken Floss" + }, + { + "actor": "Samuel L. Jackson", + "character": "Octopuss" + } + ] + }, + { + "title": "S.W.A.T.", + "overview": "Hondo Harrelson recruits Jim Street to join an elite unit of the Los Angeles Police Department. Together they seek out more members, including tough Deke Kay and single mom Chris Sanchez. The team's first big assignment is to escort crime boss Alex Montel to prison. It seems routine, but when Montel offers a huge reward to anyone who can break him free, criminals of various stripes step up for the prize.", + "release_date": "2003-08-08", + "characters": [ + { + "actor": "Samuel L. Jackson", + "character": "Sgt. Dan 'Hondo' Harrelson" + }, + { + "actor": "Jeremy Renner", + "character": "Brian Gamble" + } + ] + }, + { + "title": "Iron Man 2", + "overview": "With the world now aware of his dual life as the armored superhero Iron Man, billionaire inventor Tony Stark faces pressure from the government, the press and the public to share his technology with the military. Unwilling to let go of his invention, Stark, with Pepper Potts and James 'Rhodey' Rhodes at his side, must forge new alliances – and confront powerful enemies.", + "release_date": "2010-04-28", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + }, + { + "actor": "Scarlett Johansson", + "character": "Natalie Rushman / Natasha Romanoff / Black Widow" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + } + ] + }, + { + "title": "Thor", + "overview": "Against his father Odin's will, The Mighty Thor - a powerful but arrogant warrior god - recklessly reignites an ancient war. Thor is cast down to Earth and forced to live among humans as punishment. Once here, Thor learns what it takes to be a true hero when the most dangerous villain of his world sends the darkest forces of Asgard to invade Earth.", + "release_date": "2011-04-21", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye (uncredited)" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury (uncredited)" + } + ] + }, + { + "title": "View from the Top", + "overview": "A small-town woman tries to achieve her goal of becoming a flight attendant.", + "release_date": "2003-03-21", + "characters": [ + { + "actor": "Gwyneth Paltrow", + "character": "Donna" + }, + { + "actor": "Mark Ruffalo", + "character": "Ted Stewart" + } + ] + }, + { + "title": "The Nanny Diaries", + "overview": "A college graduate goes to work as a nanny for a rich New York family. Ensconced in their home, she has to juggle their dysfunction, a new romance, and the spoiled brat in her charge.", + "release_date": "2007-08-24", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Annie Braddock" + }, + { + "actor": "Chris Evans", + "character": "Hayden \"Harvard Hottie\"" + } + ] + }, + { + "title": "The Perfect Score", + "overview": "Six high school seniors decide to break into the Princeton Testing Center so they can steal the answers to their upcoming SAT tests and all get perfect scores.", + "release_date": "2004-01-30", + "characters": [ + { + "actor": "Chris Evans", + "character": "Kyle" + }, + { + "actor": "Scarlett Johansson", + "character": "Francesca Curtis" + } + ] + }, + { + "title": "The Avengers", + "overview": "When an unexpected enemy emerges and threatens global safety and security, Nick Fury, director of the international peacekeeping agency known as S.H.I.E.L.D., finds himself in need of a team to pull the world back from the brink of disaster. Spanning the globe, a daring recruitment effort begins!", + "release_date": "2012-04-25", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + } + ] + }, + { + "title": "Iron Man 3", + "overview": "When Tony Stark's world is torn apart by a formidable terrorist called the Mandarin, he starts an odyssey of rebuilding and retribution.", + "release_date": "2013-04-18", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / Iron Patriot" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner (uncredited)" + } + ] + }, + { + "title": "Marvel One-Shot: The Consultant", + "overview": "Agent Coulson informs Agent Sitwell that the World Security Council wishes Emil Blonsky to be released from prison to join the Avengers Initiative. As Nick Fury doesn't want to release Blonsky, the two agents decide to send a patsy to sabotage the meeting...", + "release_date": "2011-09-12", + "characters": [ + { + "actor": "Clark Gregg", + "character": "Phil Coulson" + }, + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark (archive footage)" + } + ] + }, + { + "title": "Thor: The Dark World", + "overview": "Thor fights to restore order across the cosmos… but an ancient race led by the vengeful Malekith returns to plunge the universe back into darkness. Faced with an enemy that even Odin and Asgard cannot withstand, Thor must embark on his most perilous and personal journey yet, one that will reunite him with Jane Foster and force him to sacrifice everything to save us all.", + "release_date": "2013-10-29", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Chris Evans", + "character": "Loki as Captain America (uncredited)" + } + ] + }, + { + "title": "Avengers: Age of Ultron", + "overview": "When Tony Stark tries to jumpstart a dormant peacekeeping program, things go awry and Earth’s Mightiest Heroes are put to the ultimate test as the fate of the planet hangs in the balance. As the villainous Ultron emerges, it is up to The Avengers to stop him from enacting his terrible plans, and soon uneasy alliances and unexpected action pave the way for an epic and unique global adventure.", + "release_date": "2015-04-22", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + } + ] + }, + { + "title": "Captain America: The Winter Soldier", + "overview": "After the cataclysmic events in New York with The Avengers, Steve Rogers, aka Captain America is living quietly in Washington, D.C. and trying to adjust to the modern world. But when a S.H.I.E.L.D. colleague comes under attack, Steve becomes embroiled in a web of intrigue that threatens to put the world at risk. Joining forces with the Black Widow, Captain America struggles to expose the ever-widening conspiracy while fighting off professional assassins sent to silence him at every turn. When the full scope of the villainous plot is revealed, Captain America and the Black Widow enlist the help of a new ally, the Falcon. However, they soon find themselves up against an unexpected and formidable enemy—the Winter Soldier.", + "release_date": "2014-03-20", + "characters": [ + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + } + ] + }, + { + "title": "Thanks for Sharing", + "overview": "A romantic comedy that brings together three disparate characters who are learning to face a challenging and often confusing world as they struggle together against a common demon—sex addiction.", + "release_date": "2013-09-19", + "characters": [ + { + "actor": "Mark Ruffalo", + "character": "Adam" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Phoebe" + } + ] + }, + { + "title": "Chef", + "overview": "When Chef Carl Casper suddenly quits his job at a prominent Los Angeles restaurant after refusing to compromise his creative integrity for its controlling owner, he is left to figure out what's next. Finding himself in Miami, he teams up with his ex-wife, his friend and his son to launch a food truck. Taking to the road, Chef Carl goes back to his roots to reignite his passion for the kitchen -- and zest for life and love.", + "release_date": "2014-05-08", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Molly" + }, + { + "actor": "Robert Downey Jr.", + "character": "Marvin" + } + ] + }, + { + "title": "Marvel Studios: Assembling a Universe", + "overview": "A look at the story behind Marvel Studios and the Marvel Cinematic Universe, featuring interviews and behind-the-scenes footage from all of the Marvel films, the Marvel One-Shots and \"Marvel's Agents of S.H.I.E.L.D.\"", + "release_date": "2014-03-18", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Himself / Tony Stark / Iron Man" + }, + { + "actor": "Chris Hemsworth", + "character": "Himself / Thor" + }, + { + "actor": "Chris Evans", + "character": "Himself / Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Himself / Bruce Banner / Hulk" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Herself" + }, + { + "actor": "Clark Gregg", + "character": "Himself" + }, + { + "actor": "Samuel L. Jackson", + "character": "Himself" + }, + { + "actor": "Scarlett Johansson", + "character": "Herself" + }, + { + "actor": "Jeremy Renner", + "character": "Himself" + } + ] + }, + { + "title": "Captain America: Civil War", + "overview": "Following the events of Age of Ultron, the collective governments of the world pass an act designed to regulate all superhuman activity. This polarizes opinion amongst the Avengers, causing two factions to side with Iron Man or Captain America, which causes an epic battle between former allies.", + "release_date": "2016-04-27", + "characters": [ + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + } + ] + }, + { + "title": "Thor: Ragnarok", + "overview": "Thor is imprisoned on the other side of the universe and finds himself in a race against time to get back to Asgard to stop Ragnarok, the destruction of his home-world and the end of Asgardian civilization, at the hands of an all-powerful new threat, the ruthless Hela.", + "release_date": "2017-10-25", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / Hulk" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow (archive footage / uncredited)" + } + ] + }, + { + "title": "Avengers: Endgame", + "overview": "After the devastating events of Avengers: Infinity War, the universe is in ruins due to the efforts of the Mad Titan, Thanos. With the help of remaining allies, the Avengers must assemble once more in order to undo Thanos' actions and restore order to the universe once and for all, no matter what consequences may be in store.", + "release_date": "2019-04-24", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / Hulk" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Jeremy Renner", + "character": "Clint Barton / Hawkeye" + }, + { + "actor": "Don Cheadle", + "character": "James Rhodes / War Machine" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Pepper Potts" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + } + ] + }, + { + "title": "Avengers: Infinity War", + "overview": "As the Avengers and their allies have continued to protect the world from threats too large for any one hero to handle, a new danger has emerged from the cosmic shadows: Thanos. A despot of intergalactic infamy, his goal is to collect all six Infinity Stones, artifacts of unimaginable power, and use them to inflict his twisted will on all of reality. Everything the Avengers have fought for has led up to this moment - the fate of Earth and existence itself has never been more uncertain.", + "release_date": "2018-04-25", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Don Cheadle", + "character": "James \"Rhodey\" Rhodes / War Machine" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury (uncredited)" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + } + ] + }, + { + "title": "Captain Marvel", + "overview": "The story follows Carol Danvers as she becomes one of the universe’s most powerful heroes when Earth is caught in the middle of a galactic war between two alien races. Set in the 1990s, Captain Marvel is an all-new adventure from a previously unseen period in the history of the Marvel Cinematic Universe.", + "release_date": "2019-03-06", + "characters": [ + { + "actor": "Samuel L. Jackson", + "character": "Nick Fury" + }, + { + "actor": "Clark Gregg", + "character": "Agent Phil Coulson" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America (uncredited)" + }, + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow (uncredited)" + }, + { + "actor": "Don Cheadle", + "character": "James 'Rhodey' Rhodes / War Machine (uncredited)" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk (uncredited)" + } + ] + }, + { + "title": "Spider-Man: Homecoming", + "overview": "Following the events of Captain America: Civil War, Peter Parker, with the help of his mentor Tony Stark, tries to balance his life as an ordinary high school student in Queens, New York City, with fighting crime as his superhero alter ego Spider-Man as a new threat, the Vulture, emerges.", + "release_date": "2017-07-05", + "characters": [ + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Gwyneth Paltrow", + "character": "Virginia \"Pepper\" Potts" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + } + ] + }, + { + "title": "Team Thor", + "overview": "Discover what Thor was up to during the events of Captain America: Civil War.", + "release_date": "2016-08-28", + "characters": [ + { + "actor": "Chris Hemsworth", + "character": "Thor Odinson" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner" + } + ] + }, + { + "title": "Black Widow", + "overview": "Natasha Romanoff, also known as Black Widow, confronts the darker parts of her ledger when a dangerous conspiracy with ties to her past arises. Pursued by a force that will stop at nothing to bring her down, Natasha must deal with her history as a spy and the broken relationships left in her wake long before she became an Avenger.", + "release_date": "2020-10-28", + "characters": [ + { + "actor": "Scarlett Johansson", + "character": "Natasha Romanoff / Black Widow" + }, + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + } + ] + } ] ``` diff --git a/site/versioned_docs/version-4.5/developers/operations-api/bulk-operations.md b/site/versioned_docs/version-4.5/developers/operations-api/bulk-operations.md index 133bf9e8..372e5bb3 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/bulk-operations.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/bulk-operations.md @@ -5,132 +5,144 @@ title: Bulk Operations # Bulk Operations ## CSV Data Load + Ingests CSV data, provided directly in the operation as an `insert`, `update` or `upsert` into the specified database table. -* operation _(required)_ - must always be `csv_data_load` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* data _(required)_ - csv data to import into Harper +- operation _(required)_ - must always be `csv_data_load` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- data _(required)_ - csv data to import into Harper ### Body + ```json { - "operation": "csv_data_load", - "database": "dev", - "action": "insert", - "table": "breed", - "data": "id,name,section,country,image\n1,ENGLISH POINTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/001g07.jpg\n2,ENGLISH SETTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/002g07.jpg\n3,KERRY BLUE TERRIER,Large and medium sized Terriers,IRELAND,\n" + "operation": "csv_data_load", + "database": "dev", + "action": "insert", + "table": "breed", + "data": "id,name,section,country,image\n1,ENGLISH POINTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/001g07.jpg\n2,ENGLISH SETTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/002g07.jpg\n3,KERRY BLUE TERRIER,Large and medium sized Terriers,IRELAND,\n" } ``` ### Response: 200 + ```json - { - "message": "Starting job with id 2fe25039-566e-4670-8bb3-2db3d4e07e69", - "job_id": "2fe25039-566e-4670-8bb3-2db3d4e07e69" - } +{ + "message": "Starting job with id 2fe25039-566e-4670-8bb3-2db3d4e07e69", + "job_id": "2fe25039-566e-4670-8bb3-2db3d4e07e69" +} ``` --- ## CSV File Load -Ingests CSV data, provided via a path on the local filesystem, as an `insert`, `update` or `upsert` into the specified database table. + +Ingests CSV data, provided via a path on the local filesystem, as an `insert`, `update` or `upsert` into the specified database table. _Note: The CSV file must reside on the same machine on which Harper is running. For example, the path to a CSV on your computer will produce an error if your Harper instance is a cloud instance._ -* operation _(required)_ - must always be `csv_file_load` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* file_path _(required)_ - path to the csv file on the host running Harper +- operation _(required)_ - must always be `csv_file_load` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- file*path *(required)\_ - path to the csv file on the host running Harper ### Body + ```json { - "operation": "csv_file_load", - "action": "insert", - "database": "dev", - "table": "breed", - "file_path": "/home/user/imports/breeds.csv" + "operation": "csv_file_load", + "action": "insert", + "database": "dev", + "table": "breed", + "file_path": "/home/user/imports/breeds.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 3994d8e2-ec6a-43c4-8563-11c1df81870e", - "job_id": "3994d8e2-ec6a-43c4-8563-11c1df81870e" + "message": "Starting job with id 3994d8e2-ec6a-43c4-8563-11c1df81870e", + "job_id": "3994d8e2-ec6a-43c4-8563-11c1df81870e" } ``` --- ## CSV URL Load + Ingests CSV data, provided via URL, as an `insert`, `update` or `upsert` into the specified database table. -* operation _(required)_ - must always be `csv_url_load` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* csv_url _(required)_ - URL to the csv +- operation _(required)_ - must always be `csv_url_load` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- csv*url *(required)\_ - URL to the csv ### Body + ```json { - "operation": "csv_url_load", - "action": "insert", - "database": "dev", - "table": "breed", - "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" + "operation": "csv_url_load", + "action": "insert", + "database": "dev", + "table": "breed", + "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" } ``` ### Response: 200 + ```json { - "message": "Starting job with id 332aa0a2-6833-46cd-88a6-ae375920436a", - "job_id": "332aa0a2-6833-46cd-88a6-ae375920436a" + "message": "Starting job with id 332aa0a2-6833-46cd-88a6-ae375920436a", + "job_id": "332aa0a2-6833-46cd-88a6-ae375920436a" } ``` --- ## Import from S3 + This operation allows users to import CSV or JSON files from an AWS S3 bucket as an `insert`, `update` or `upsert`. -* operation _(required)_ - must always be `import_from_s3` -* action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` -* database _(optional)_ - name of the database where you are loading your data. The default is `data` -* table _(required)_ - name of the table where you are loading your data -* s3 _(required)_ - object containing required AWS S3 bucket info for operation: - * aws_access_key_id - AWS access key for authenticating into your S3 bucket - * aws_secret_access_key - AWS secret for authenticating into your S3 bucket - * bucket - AWS S3 bucket to import from - * key - the name of the file to import - _the file must include a valid file extension ('.csv' or '.json')_ - * region - the region of the bucket +- operation _(required)_ - must always be `import_from_s3` +- action _(optional)_ - type of action you want to perform - `insert`, `update` or `upsert`. The default is `insert` +- database _(optional)_ - name of the database where you are loading your data. The default is `data` +- table _(required)_ - name of the table where you are loading your data +- s3 _(required)_ - object containing required AWS S3 bucket info for operation: + - aws_access_key_id - AWS access key for authenticating into your S3 bucket + - aws_secret_access_key - AWS secret for authenticating into your S3 bucket + - bucket - AWS S3 bucket to import from + - key - the name of the file to import - _the file must include a valid file extension ('.csv' or '.json')_ + - region - the region of the bucket ### Body + ```json { - "operation": "import_from_s3", - "action": "insert", - "database": "dev", - "table": "dog", - "s3": { - "aws_access_key_id": "YOUR_KEY", - "aws_secret_access_key": "YOUR_SECRET_KEY", - "bucket": "BUCKET_NAME", - "key": "OBJECT_NAME", - "region": "BUCKET_REGION" - } + "operation": "import_from_s3", + "action": "insert", + "database": "dev", + "table": "dog", + "s3": { + "aws_access_key_id": "YOUR_KEY", + "aws_secret_access_key": "YOUR_SECRET_KEY", + "bucket": "BUCKET_NAME", + "key": "OBJECT_NAME", + "region": "BUCKET_REGION" + } } ``` ### Response: 200 + ```json { - "message": "Starting job with id 062a1892-6a0a-4282-9791-0f4c93b12e16", - "job_id": "062a1892-6a0a-4282-9791-0f4c93b12e16" + "message": "Starting job with id 062a1892-6a0a-4282-9791-0f4c93b12e16", + "job_id": "062a1892-6a0a-4282-9791-0f4c93b12e16" } -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.5/developers/operations-api/clustering-nats.md b/site/versioned_docs/version-4.5/developers/operations-api/clustering-nats.md index a1157bea..a45c593e 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/clustering-nats.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/clustering-nats.md @@ -5,425 +5,453 @@ title: Clustering using NATS # Clustering using NATS ## Cluster Set Routes + Adds a route/routes to either the hub or leaf server cluster configuration. This operation behaves as a PATCH/upsert, meaning it will add new routes to the configuration while leaving existing routes untouched. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_set_routes` -* server _(required)_ - must always be `hub` or `leaf`, in most cases you should use `hub` here -* routes _(required)_ - must always be an objects array with a host and port: - * host - the host of the remote instance you are clustering to - * port - the clustering port of the remote instance you are clustering to, in most cases this is the value in `clustering.hubServer.cluster.network.port` on the remote instance `harperdb-config.yaml` +- operation _(required)_ - must always be `cluster_set_routes` +- server _(required)_ - must always be `hub` or `leaf`, in most cases you should use `hub` here +- routes _(required)_ - must always be an objects array with a host and port: + - host - the host of the remote instance you are clustering to + - port - the clustering port of the remote instance you are clustering to, in most cases this is the value in `clustering.hubServer.cluster.network.port` on the remote instance `harperdb-config.yaml` ### Body + ```json { - "operation": "cluster_set_routes", - "server": "hub", - "routes": [ - { - "host": "3.22.181.22", - "port": 12345 - }, - { - "host": "3.137.184.8", - "port": 12345 - }, - { - "host": "18.223.239.195", - "port": 12345 - }, - { - "host": "18.116.24.71", - "port": 12345 - } - ] + "operation": "cluster_set_routes", + "server": "hub", + "routes": [ + { + "host": "3.22.181.22", + "port": 12345 + }, + { + "host": "3.137.184.8", + "port": 12345 + }, + { + "host": "18.223.239.195", + "port": 12345 + }, + { + "host": "18.116.24.71", + "port": 12345 + } + ] } ``` ### Response: 200 + ```json { - "message": "cluster routes successfully set", - "set": [ - { - "host": "3.22.181.22", - "port": 12345 - }, - { - "host": "3.137.184.8", - "port": 12345 - }, - { - "host": "18.223.239.195", - "port": 12345 - }, - { - "host": "18.116.24.71", - "port": 12345 - } - ], - "skipped": [] + "message": "cluster routes successfully set", + "set": [ + { + "host": "3.22.181.22", + "port": 12345 + }, + { + "host": "3.137.184.8", + "port": 12345 + }, + { + "host": "18.223.239.195", + "port": 12345 + }, + { + "host": "18.116.24.71", + "port": 12345 + } + ], + "skipped": [] } ``` --- ## Cluster Get Routes + Gets all the hub and leaf server routes from the config file. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_get_routes` +- operation _(required)_ - must always be `cluster_get_routes` ### Body + ```json { - "operation": "cluster_get_routes" + "operation": "cluster_get_routes" } ``` ### Response: 200 + ```json { - "hub": [ - { - "host": "3.22.181.22", - "port": 12345 - }, - { - "host": "3.137.184.8", - "port": 12345 - }, - { - "host": "18.223.239.195", - "port": 12345 - }, - { - "host": "18.116.24.71", - "port": 12345 - } - ], - "leaf": [] + "hub": [ + { + "host": "3.22.181.22", + "port": 12345 + }, + { + "host": "3.137.184.8", + "port": 12345 + }, + { + "host": "18.223.239.195", + "port": 12345 + }, + { + "host": "18.116.24.71", + "port": 12345 + } + ], + "leaf": [] } ``` --- ## Cluster Delete Routes + Removes route(s) from hub and/or leaf server routes array in config file. Returns a deletion success message and arrays of deleted and skipped records. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_delete_routes` -* routes _required_ - Must be an array of route object(s) +- operation _(required)_ - must always be `cluster_delete_routes` +- routes _required_ - Must be an array of route object(s) ### Body ```json { - "operation": "cluster_delete_routes", - "routes": [ - { - "host": "18.116.24.71", - "port": 12345 - } - ] + "operation": "cluster_delete_routes", + "routes": [ + { + "host": "18.116.24.71", + "port": 12345 + } + ] } ``` ### Response: 200 + ```json { - "message": "cluster routes successfully deleted", - "deleted": [ - { - "host": "18.116.24.71", - "port": 12345 - } - ], - "skipped": [] + "message": "cluster routes successfully deleted", + "deleted": [ + { + "host": "18.116.24.71", + "port": 12345 + } + ], + "skipped": [] } ``` - --- ## Add Node + Registers an additional Harper instance with associated subscriptions. Learn more about [Harper clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_node` -* node_name _(required)_ - the node name of the remote node -* subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: - * schema - the schema to replicate from - * table - the table to replicate from - * subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish - a boolean which determines if transactions on the local table should be replicated on the remote table - * start_time _(optional)_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format - +- operation _(required)_ - must always be `add_node` +- node*name *(required)\_ - the node name of the remote node +- subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: + - schema - the schema to replicate from + - table - the table to replicate from + - subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish - a boolean which determines if transactions on the local table should be replicated on the remote table + - start*time *(optional)\_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format + ### Body + ```json { - "operation": "add_node", - "node_name": "ec2-3-22-181-22", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": false, - "publish": true, - "start_time": "2022-09-02T20:06:35.993Z" - } - ] + "operation": "add_node", + "node_name": "ec2-3-22-181-22", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": false, + "publish": true, + "start_time": "2022-09-02T20:06:35.993Z" + } + ] } ``` ### Response: 200 + ```json { - "message": "Successfully added 'ec2-3-22-181-22' to manifest" + "message": "Successfully added 'ec2-3-22-181-22' to manifest" } ``` --- ## Update Node -Modifies an existing Harper instance registration and associated subscriptions. This operation behaves as a PATCH/upsert, meaning it will insert or update the specified replication configurations while leaving other table replication configuration untouched. Learn more about [Harper clustering here](../clustering/). + +Modifies an existing Harper instance registration and associated subscriptions. This operation behaves as a PATCH/upsert, meaning it will insert or update the specified replication configurations while leaving other table replication configuration untouched. Learn more about [Harper clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `update_node` -* node_name _(required)_ - the node name of the remote node you are updating -* subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: - * schema - the schema to replicate from - * table - the table to replicate from - * subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish - a boolean which determines if transactions on the local table should be replicated on the remote table - * start_time _(optional)_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format +- operation _(required)_ - must always be `update_node` +- node*name *(required)\_ - the node name of the remote node you are updating +- subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `schema`, `table`, `subscribe` and `publish`: + - schema - the schema to replicate from + - table - the table to replicate from + - subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish - a boolean which determines if transactions on the local table should be replicated on the remote table + - start*time *(optional)\_ - How far back to go to get transactions from node being added. Must be in UTC YYYY-MM-DDTHH:mm:ss.sssZ format ### Body + ```json { - "operation": "update_node", - "node_name": "ec2-18-223-239-195", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": false, - "start_time": "2022-09-02T20:06:35.993Z" - } - ] + "operation": "update_node", + "node_name": "ec2-18-223-239-195", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": false, + "start_time": "2022-09-02T20:06:35.993Z" + } + ] } ``` ### Response: 200 + ```json { - "message": "Successfully updated 'ec2-3-22-181-22'" + "message": "Successfully updated 'ec2-3-22-181-22'" } ``` --- ## Set Node Replication + A more adeptly named alias for add and update node. This operation behaves as a PATCH/upsert, meaning it will insert or update the specified replication configurations while leaving other table replication configuration untouched. The `database` (aka `schema`) parameter is optional, it will default to `data`. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_node_replication` -* node_name _(required)_ - the node name of the remote node you are updating -* subscriptions _(required)_ - The relationship created between nodes. Must be an object array and `table`, `subscribe` and `publish`: - * database *(optional)* - the database to replicate from - * table *(required)* - the table to replicate from - * subscribe *(required)* - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish *(required)* - a boolean which determines if transactions on the local table should be replicated on the remote table -* +- operation _(required)_ - must always be `set_node_replication` +- node*name *(required)\_ - the node name of the remote node you are updating +- subscriptions _(required)_ - The relationship created between nodes. Must be an object array and `table`, `subscribe` and `publish`: + - database _(optional)_ - the database to replicate from + - table _(required)_ - the table to replicate from + - subscribe _(required)_ - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish _(required)_ - a boolean which determines if transactions on the local table should be replicated on the remote table +- + ### Body + ```json { - "operation": "set_node_replication", - "node_name": "node1", - "subscriptions": [ - { - "table": "dog", - "subscribe": true, - "publish": true - } - ] + "operation": "set_node_replication", + "node_name": "node1", + "subscriptions": [ + { + "table": "dog", + "subscribe": true, + "publish": true + } + ] } ``` + ### Response: 200 + ```json { - "message": "Successfully updated 'ec2-3-22-181-22'" + "message": "Successfully updated 'ec2-3-22-181-22'" } ``` --- ## Cluster Status + Returns an array of status objects from a cluster. A status object will contain the clustering node name, whether or not clustering is enabled, and a list of possible connections. Learn more about [Harper clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_status` +- operation _(required)_ - must always be `cluster_status` ### Body + ```json { - "operation": "cluster_status" + "operation": "cluster_status" } ``` ### Response: 200 + ```json { - "node_name": "ec2-18-221-143-69", - "is_enabled": true, - "connections": [ - { - "node_name": "ec2-3-22-181-22", - "status": "open", - "ports": { - "clustering": 12345, - "operations_api": 9925 - }, - "latency_ms": 13, - "uptime": "30d 1h 18m 8s", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "publish": true, - "subscribe": true - } - ] - } - ] + "node_name": "ec2-18-221-143-69", + "is_enabled": true, + "connections": [ + { + "node_name": "ec2-3-22-181-22", + "status": "open", + "ports": { + "clustering": 12345, + "operations_api": 9925 + }, + "latency_ms": 13, + "uptime": "30d 1h 18m 8s", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "publish": true, + "subscribe": true + } + ] + } + ] } ``` - --- ## Cluster Network + Returns an object array of enmeshed nodes. Each node object will contain the name of the node, the amount of time (in milliseconds) it took for it to respond, the names of the nodes it is enmeshed with and the routes set in its config file. Learn more about [Harper clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_- must always be `cluster_network` -* timeout (_optional_) - the amount of time in milliseconds to wait for a response from the network. Must be a number -* connected_nodes (_optional_) - omit `connected_nodes` from the response. Must be a boolean. Defaults to `false` -* routes (_optional_) - omit `routes` from the response. Must be a boolean. Defaults to `false` +- operation _(required)_- must always be `cluster_network` +- timeout (_optional_) - the amount of time in milliseconds to wait for a response from the network. Must be a number +- connected*nodes (\_optional*) - omit `connected_nodes` from the response. Must be a boolean. Defaults to `false` +- routes (_optional_) - omit `routes` from the response. Must be a boolean. Defaults to `false` ### Body ```json { - "operation": "cluster_network" + "operation": "cluster_network" } ``` ### Response: 200 + ```json { - "nodes": [ - { - "name": "local_node", - "response_time": 4, - "connected_nodes": ["ec2-3-142-255-78"], - "routes": [ - { - "host": "3.142.255.78", - "port": 9932 - } - ] - }, - { - "name": "ec2-3-142-255-78", - "response_time": 57, - "connected_nodes": ["ec2-3-12-153-124", "ec2-3-139-236-138", "local_node"], - "routes": [] - } - ] + "nodes": [ + { + "name": "local_node", + "response_time": 4, + "connected_nodes": ["ec2-3-142-255-78"], + "routes": [ + { + "host": "3.142.255.78", + "port": 9932 + } + ] + }, + { + "name": "ec2-3-142-255-78", + "response_time": 57, + "connected_nodes": ["ec2-3-12-153-124", "ec2-3-139-236-138", "local_node"], + "routes": [] + } + ] } ``` --- ## Remove Node + Removes a Harper instance and associated subscriptions from the cluster. Learn more about [Harper clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `remove_node` -* name _(required)_ - The name of the node you are de-registering +- operation _(required)_ - must always be `remove_node` +- name _(required)_ - The name of the node you are de-registering ### Body + ```json { - "operation": "remove_node", - "node_name": "ec2-3-22-181-22" + "operation": "remove_node", + "node_name": "ec2-3-22-181-22" } ``` ### Response: 200 + ```json { - "message": "Successfully removed 'ec2-3-22-181-22' from manifest" + "message": "Successfully removed 'ec2-3-22-181-22' from manifest" } ``` --- ## Configure Cluster + Bulk create/remove subscriptions for any number of remote nodes. Resets and replaces any existing clustering setup. Learn more about [Harper clustering here](../clustering/). _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `configure_cluster` -* connections _(required)_ - must be an object array with each object containing `node_name` and `subscriptions` for that node +- operation _(required)_ - must always be `configure_cluster` +- connections _(required)_ - must be an object array with each object containing `node_name` and `subscriptions` for that node ### Body + ```json { - "operation": "configure_cluster", - "connections": [ - { - "node_name": "ec2-3-137-184-8", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": false - } - ] - }, - { - "node_name": "ec2-18-223-239-195", - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": true - } - ] - } - ] + "operation": "configure_cluster", + "connections": [ + { + "node_name": "ec2-3-137-184-8", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": false + } + ] + }, + { + "node_name": "ec2-18-223-239-195", + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": true + } + ] + } + ] } ``` ### Response: 200 + ```json { - "message": "Cluster successfully configured." + "message": "Cluster successfully configured." } ``` @@ -435,23 +463,24 @@ Will purge messages from a stream _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `purge_stream` -* database _(required)_ - the name of the database where the streams table resides -* table _(required)_ - the name of the table that belongs to the stream -* options _(optional)_ - control how many messages get purged. Options are: - * `keep` - purge will keep this many most recent messages - * `seq` - purge all messages up to, but not including, this sequence +- operation _(required)_ - must always be `purge_stream` +- database _(required)_ - the name of the database where the streams table resides +- table _(required)_ - the name of the table that belongs to the stream +- options _(optional)_ - control how many messages get purged. Options are: + - `keep` - purge will keep this many most recent messages + - `seq` - purge all messages up to, but not including, this sequence ### Body + ```json { - "operation": "purge_stream", - "database": "dev", - "table": "dog", - "options": { - "keep": 100 - } + "operation": "purge_stream", + "database": "dev", + "table": "dog", + "options": { + "keep": 100 + } } ``` ---- \ No newline at end of file +--- diff --git a/site/versioned_docs/version-4.5/developers/operations-api/clustering.md b/site/versioned_docs/version-4.5/developers/operations-api/clustering.md index b2e614d6..8f905f18 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/clustering.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/clustering.md @@ -6,39 +6,38 @@ title: Clustering The following operations are available for configuring and managing [Harper replication](../replication/).\ - _**If you are using NATS for clustering, please see the**_ [_**NATS Clustering Operations**_](./clustering-nats) _**documentation.**_ ## Add Node Adds a new Harper instance to the cluster. If `subscriptions` are provided, it will also create the replication relationships between the nodes. If they are not provided a fully replicating system will be created. [Learn more about adding nodes here](../replication/). -_Operation is restricted to super\_user roles only_ - -* operation _(required)_ - must always be `add_node` -* hostname or url _(required)_ - one of these fields is required. You must provide either the `hostname` or the `url` of the node you want to add -* verify\_tls _(optional)_ - a boolean which determines if the TLS certificate should be verified. This will allow the Harper default self-signed certificates to be accepted. Defaults to `true` -* authorization _(optional)_ - an object or a string which contains the authorization information for the node being added. If it is an object, it should contain `username` and `password` fields. If it is a string, it should use HTTP `Authorization` style credentials -* retain_authorization _(optional)_ - a boolean which determines if the authorization credentials should be retained/stored and used everytime a connection is made to this node. If `true`, the authorization will be stored on the node record. Generally this should not be used, as mTLS/certificate based authorization is much more secure and safe, and avoids the need for storing credentials. Defaults to `false`. -* revoked_certificates _(optional)_ - an array of revoked certificates serial numbers. If a certificate is revoked, it will not be accepted for any connections. -* shard _(optional)_ - a number which can be used to indicate which shard this node belongs to. This is only needed if you are using sharding. -* subscriptions _(optional)_ - The relationship created between nodes. If not provided a fully replicated cluster will be setup. Must be an object array and include `database`, `table`, `subscribe` and `publish`: - * database - the database to replicate - * table - the table to replicate - * subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish - a boolean which determines if transactions on the local table should be replicated on the remote table +_Operation is restricted to super_user roles only_ + +- operation _(required)_ - must always be `add_node` +- hostname or url _(required)_ - one of these fields is required. You must provide either the `hostname` or the `url` of the node you want to add +- verify_tls _(optional)_ - a boolean which determines if the TLS certificate should be verified. This will allow the Harper default self-signed certificates to be accepted. Defaults to `true` +- authorization _(optional)_ - an object or a string which contains the authorization information for the node being added. If it is an object, it should contain `username` and `password` fields. If it is a string, it should use HTTP `Authorization` style credentials +- retain*authorization *(optional)\_ - a boolean which determines if the authorization credentials should be retained/stored and used everytime a connection is made to this node. If `true`, the authorization will be stored on the node record. Generally this should not be used, as mTLS/certificate based authorization is much more secure and safe, and avoids the need for storing credentials. Defaults to `false`. +- revoked*certificates *(optional)\_ - an array of revoked certificates serial numbers. If a certificate is revoked, it will not be accepted for any connections. +- shard _(optional)_ - a number which can be used to indicate which shard this node belongs to. This is only needed if you are using sharding. +- subscriptions _(optional)_ - The relationship created between nodes. If not provided a fully replicated cluster will be setup. Must be an object array and include `database`, `table`, `subscribe` and `publish`: + - database - the database to replicate + - table - the table to replicate + - subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish - a boolean which determines if transactions on the local table should be replicated on the remote table ### Body ```json { - "operation": "add_node", - "hostname": "server-two", - "verify_tls": false, - "authorization": { - "username": "admin", - "password": "password" - } + "operation": "add_node", + "hostname": "server-two", + "verify_tls": false, + "authorization": { + "username": "admin", + "password": "password" + } } ``` @@ -46,44 +45,44 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Successfully added 'server-two' to cluster" + "message": "Successfully added 'server-two' to cluster" } ``` -*** +--- ## Update Node Modifies an existing Harper instance in the cluster. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ _Note: will attempt to add the node if it does not exist_ -* operation _(required)_ - must always be `update_node` -* hostname _(required)_ - the `hostname` of the remote node you are updating -* revoked_certificates _(optional)_ - an array of revoked certificates serial numbers. If a certificate is revoked, it will not be accepted for any connections. -* shard _(optional)_ - a number which can be used to indicate which shard this node belongs to. This is only needed if you are using sharding. -* subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `database`, `table`, `subscribe` and `publish`: - * database - the database to replicate from - * table - the table to replicate from - * subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table - * publish - a boolean which determines if transactions on the local table should be replicated on the remote table +- operation _(required)_ - must always be `update_node` +- hostname _(required)_ - the `hostname` of the remote node you are updating +- revoked*certificates *(optional)\_ - an array of revoked certificates serial numbers. If a certificate is revoked, it will not be accepted for any connections. +- shard _(optional)_ - a number which can be used to indicate which shard this node belongs to. This is only needed if you are using sharding. +- subscriptions _(required)_ - The relationship created between nodes. Must be an object array and include `database`, `table`, `subscribe` and `publish`: + - database - the database to replicate from + - table - the table to replicate from + - subscribe - a boolean which determines if transactions on the remote table should be replicated on the local table + - publish - a boolean which determines if transactions on the local table should be replicated on the remote table ### Body ```json { - "operation": "update_node", - "hostname": "server-two", - "subscriptions": [ - { - "database": "dev", - "table": "my-table", - "subscribe": true, - "publish": true - } - ] + "operation": "update_node", + "hostname": "server-two", + "subscriptions": [ + { + "database": "dev", + "table": "my-table", + "subscribe": true, + "publish": true + } + ] } ``` @@ -91,27 +90,27 @@ _Note: will attempt to add the node if it does not exist_ ```json { - "message": "Successfully updated 'server-two'" + "message": "Successfully updated 'server-two'" } ``` -*** +--- ## Remove Node Removes a Harper node from the cluster and stops replication, [Learn more about remove node here](../replication/). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `remove_node` -* name _(required)_ - The name of the node you are removing +- operation _(required)_ - must always be `remove_node` +- name _(required)_ - The name of the node you are removing ### Body ```json { - "operation": "remove_node", - "hostname": "server-two" + "operation": "remove_node", + "hostname": "server-two" } ``` @@ -119,11 +118,11 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Successfully removed 'server-two' from cluster" + "message": "Successfully removed 'server-two' from cluster" } ``` -*** +--- ## Cluster Status @@ -131,15 +130,15 @@ Returns an array of status objects from a cluster. `database_sockets` shows the actual websocket connections that exist between nodes. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_status` +- operation _(required)_ - must always be `cluster_status` ### Body ```json { - "operation": "cluster_status" + "operation": "cluster_status" } ``` @@ -175,62 +174,64 @@ _Operation is restricted to super\_user roles only_ "is_enabled": true } ``` + There is a separate socket for each database for each node. Each node is represented in the connections array, and each database connection to that node is represented in the `database_sockets` array. Additional timing statistics include: -* `lastCommitConfirmed`: When a commit is sent out, it should receive a confirmation from the remote server; this is the last receipt of confirmation of an outgoing commit. -* `lastReceivedRemoteTime`: This is the timestamp of the transaction that was last received. The timestamp is from when the original transaction occurred. -* `lastReceivedLocalTime`: This is local time when the last transaction was received. If there is a different between this and `lastReceivedRemoteTime`, it means there is a delay from the original transaction to * receiving it and so it is probably catching-up/behind. -* `sendingMessage`: The timestamp of transaction is actively being sent. This won't exist if the replicator is waiting for the next transaction to send. -*** +- `lastCommitConfirmed`: When a commit is sent out, it should receive a confirmation from the remote server; this is the last receipt of confirmation of an outgoing commit. +- `lastReceivedRemoteTime`: This is the timestamp of the transaction that was last received. The timestamp is from when the original transaction occurred. +- `lastReceivedLocalTime`: This is local time when the last transaction was received. If there is a different between this and `lastReceivedRemoteTime`, it means there is a delay from the original transaction to \* receiving it and so it is probably catching-up/behind. +- `sendingMessage`: The timestamp of transaction is actively being sent. This won't exist if the replicator is waiting for the next transaction to send. + +--- ## Configure Cluster Bulk create/remove subscriptions for any number of remote nodes. Resets and replaces any existing clustering setup. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `configure_cluster` -* connections _(required)_ - must be an object array with each object following the `add_node` schema. +- operation _(required)_ - must always be `configure_cluster` +- connections _(required)_ - must be an object array with each object following the `add_node` schema. ### Body ```json { - "operation": "configure_cluster", - "connections": [ - { - "hostname": "server-two", - "verify_tls": false, - "authorization": { - "username": "admin", - "password": "password2" - }, - "subscriptions": [ - { - "schema": "dev", - "table": "my-table", - "subscribe": true, - "publish": false - } - ] - }, - { - "hostname": "server-three", - "verify_tls": false, - "authorization": { - "username": "admin", - "password": "password3" - }, - "subscriptions": [ - { - "schema": "dev", - "table": "dog", - "subscribe": true, - "publish": true - } - ] - } - ] + "operation": "configure_cluster", + "connections": [ + { + "hostname": "server-two", + "verify_tls": false, + "authorization": { + "username": "admin", + "password": "password2" + }, + "subscriptions": [ + { + "schema": "dev", + "table": "my-table", + "subscribe": true, + "publish": false + } + ] + }, + { + "hostname": "server-three", + "verify_tls": false, + "authorization": { + "username": "admin", + "password": "password3" + }, + "subscriptions": [ + { + "schema": "dev", + "table": "dog", + "subscribe": true, + "publish": true + } + ] + } + ] } ``` @@ -238,33 +239,33 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Cluster successfully configured." + "message": "Cluster successfully configured." } ``` -*** +--- ## Cluster Set Routes Adds a route/routes to the `replication.routes` configuration. This operation behaves as a PATCH/upsert, meaning it will add new routes to the configuration while leaving existing routes untouched. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_set_routes` -* routes _(required)_ - the routes field is an array that specifies the routes for clustering. Each element in the array can be either a string or an object with `hostname` and `port` properties. +- operation _(required)_ - must always be `cluster_set_routes` +- routes _(required)_ - the routes field is an array that specifies the routes for clustering. Each element in the array can be either a string or an object with `hostname` and `port` properties. ### Body ```json { - "operation": "cluster_set_routes", - "routes": [ - "wss://server-two:9925", - { - "hostname": "server-three", - "port": 9930 - } - ] + "operation": "cluster_set_routes", + "routes": [ + "wss://server-two:9925", + { + "hostname": "server-three", + "port": 9930 + } + ] } ``` @@ -272,33 +273,33 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "cluster routes successfully set", - "set": [ - "wss://server-two:9925", - { - "hostname": "server-three", - "port": 9930 - } - ], - "skipped": [] + "message": "cluster routes successfully set", + "set": [ + "wss://server-two:9925", + { + "hostname": "server-three", + "port": 9930 + } + ], + "skipped": [] } ``` -*** +--- ## Cluster Get Routes Gets the replication routes from the Harper config file. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_get_routes` +- operation _(required)_ - must always be `cluster_get_routes` ### Body ```json { - "operation": "cluster_get_routes" + "operation": "cluster_get_routes" } ``` @@ -306,36 +307,36 @@ _Operation is restricted to super\_user roles only_ ```json [ - "wss://server-two:9925", - { - "hostname": "server-three", - "port": 9930 - } + "wss://server-two:9925", + { + "hostname": "server-three", + "port": 9930 + } ] ``` -*** +--- ## Cluster Delete Routes Removes route(s) from the Harper config file. Returns a deletion success message and arrays of deleted and skipped records. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `cluster_delete_routes` -* routes _required_ - Must be an array of route object(s) +- operation _(required)_ - must always be `cluster_delete_routes` +- routes _required_ - Must be an array of route object(s) ### Body ```json { - "operation": "cluster_delete_routes", - "routes": [ - { - "hostname": "server-three", - "port": 9930 - } - ] + "operation": "cluster_delete_routes", + "routes": [ + { + "hostname": "server-three", + "port": 9930 + } + ] } ``` @@ -343,13 +344,13 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "cluster routes successfully deleted", - "deleted": [ - { - "hostname": "server-three", - "port": 9930 - } - ], - "skipped": [] + "message": "cluster routes successfully deleted", + "deleted": [ + { + "hostname": "server-three", + "port": 9930 + } + ], + "skipped": [] } ``` diff --git a/site/versioned_docs/version-4.5/developers/operations-api/components.md b/site/versioned_docs/version-4.5/developers/operations-api/components.md index 73a61706..69de35bb 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/components.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/components.md @@ -8,18 +8,18 @@ title: Components Creates a new component project in the component root directory using a predefined template. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_component` -* project _(required)_ - the name of the project you wish to create -* replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - must always be `add_component` +- project _(required)_ - the name of the project you wish to create +- replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. ### Body ```json { - "operation": "add_component", - "project": "my-component" + "operation": "add_component", + "project": "my-component" } ``` @@ -27,11 +27,11 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Successfully added project: my-component" + "message": "Successfully added project: my-component" } ``` -*** +--- ## Deploy Component @@ -69,36 +69,36 @@ Or you can use a GitLab Project Access Token: https://my-project:@gitlab.com/my-group/my-project#semver:v1.0.0 ``` -Note that your component will be installed by NPM. If your component has dependencies, NPM will attempt to download and install these as well. NPM normally uses the public registry.npmjs.org registry. If you are installing without network access to this, you may wish to define [custom registry locations](https://docs.npmjs.com/cli/v8/configuring-npm/npmrc) if you have any dependencies that need to be installed. NPM will install the deployed component and any dependencies in node\_modules in the hdb root directory (typically `~/hdb/node_modules`). +Note that your component will be installed by NPM. If your component has dependencies, NPM will attempt to download and install these as well. NPM normally uses the public registry.npmjs.org registry. If you are installing without network access to this, you may wish to define [custom registry locations](https://docs.npmjs.com/cli/v8/configuring-npm/npmrc) if you have any dependencies that need to be installed. NPM will install the deployed component and any dependencies in node_modules in the hdb root directory (typically `~/hdb/node_modules`). _Note: After deploying a component a restart may be required_ -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `deploy_component` -* project _(required)_ - the name of the project you wish to deploy -* package _(optional)_ - this can be any valid GitHub or NPM reference -* payload _(optional)_ - a base64-encoded string representation of the .tar file. Must be a string -* restart _(optional)_ - must be either a boolean or the string `rolling`. If set to `rolling`, a rolling restart will be triggered after the component is deployed, meaning that each node in the cluster will be sequentially restarted (waiting for the last restart to start the next). If set to `true`, the restart will not be rolling, all nodes will be restarted in parallel. If `replicated` is `true`, the restart operations will be replicated across the cluster. -* replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. -* install\_command _(optional)_ - A command to use when installing the component. Must be a string. This can be used to install dependencies with pnpm or yarn, for example, like: `"install_command": "npm install -g pnpm && pnpm install"` +- operation _(required)_ - must always be `deploy_component` +- project _(required)_ - the name of the project you wish to deploy +- package _(optional)_ - this can be any valid GitHub or NPM reference +- payload _(optional)_ - a base64-encoded string representation of the .tar file. Must be a string +- restart _(optional)_ - must be either a boolean or the string `rolling`. If set to `rolling`, a rolling restart will be triggered after the component is deployed, meaning that each node in the cluster will be sequentially restarted (waiting for the last restart to start the next). If set to `true`, the restart will not be rolling, all nodes will be restarted in parallel. If `replicated` is `true`, the restart operations will be replicated across the cluster. +- replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. +- install_command _(optional)_ - A command to use when installing the component. Must be a string. This can be used to install dependencies with pnpm or yarn, for example, like: `"install_command": "npm install -g pnpm && pnpm install"` ### Body ```json { - "operation": "deploy_component", - "project": "my-component", - "payload": "A very large base64-encoded string representation of the .tar file" + "operation": "deploy_component", + "project": "my-component", + "payload": "A very large base64-encoded string representation of the .tar file" } ``` ```json { - "operation": "deploy_component", - "project": "my-component", - "package": "HarperDB/application-template", - "replicated": true + "operation": "deploy_component", + "project": "my-component", + "package": "HarperDB/application-template", + "replicated": true } ``` @@ -106,29 +106,29 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Successfully deployed: my-component" + "message": "Successfully deployed: my-component" } ``` -*** +--- ## Package Component Creates a temporary `.tar` file of the specified project folder, then reads it into a base64-encoded string and returns an object with the string and the payload. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `package_component` -* project _(required)_ - the name of the project you wish to package -* skip\_node\_modules _(optional)_ - if true, creates option for tar module that will exclude the project's node\_modules directory. Must be a boolean +- operation _(required)_ - must always be `package_component` +- project _(required)_ - the name of the project you wish to package +- skip_node_modules _(optional)_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean ### Body ```json { - "operation": "package_component", - "project": "my-component", - "skip_node_modules": true + "operation": "package_component", + "project": "my-component", + "skip_node_modules": true } ``` @@ -136,12 +136,12 @@ _Operation is restricted to super\_user roles only_ ```json { - "project": "my-component", - "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + "project": "my-component", + "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" } ``` -*** +--- ## Drop Component @@ -149,21 +149,21 @@ Deletes a file from inside the component project or deletes the complete project **If just `project` is provided it will delete all that projects local files and folders** -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_component` -* project _(required)_ - the name of the project you wish to delete or to delete from if using the `file` parameter -* file _(optional)_ - the path relative to your project folder of the file you wish to delete -* replicated _(optional)_ - if true, Harper will replicate the component deletion to all nodes in the cluster. Must be a boolean. -* restart _(optional)_ - if true, Harper will restart after dropping the component. Must be a boolean. +- operation _(required)_ - must always be `drop_component` +- project _(required)_ - the name of the project you wish to delete or to delete from if using the `file` parameter +- file _(optional)_ - the path relative to your project folder of the file you wish to delete +- replicated _(optional)_ - if true, Harper will replicate the component deletion to all nodes in the cluster. Must be a boolean. +- restart _(optional)_ - if true, Harper will restart after dropping the component. Must be a boolean. ### Body ```json { - "operation": "drop_component", - "project": "my-component", - "file": "utils/myUtils.js" + "operation": "drop_component", + "project": "my-component", + "file": "utils/myUtils.js" } ``` @@ -171,25 +171,25 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Successfully dropped: my-component/utils/myUtils.js" + "message": "Successfully dropped: my-component/utils/myUtils.js" } ``` -*** +--- ## Get Components Gets all local component files and folders and any component config from `harperdb-config.yaml` -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_components` +- operation _(required)_ - must always be `get_components` ### Body ```json { - "operation": "get_components" + "operation": "get_components" } ``` @@ -197,85 +197,85 @@ _Operation is restricted to super\_user roles only_ ```json { - "name": "components", - "entries": [ - { - "package": "HarperDB/application-template", - "name": "deploy-test-gh" - }, - { - "package": "@fastify/compress", - "name": "fast-compress" - }, - { - "name": "my-component", - "entries": [ - { - "name": "LICENSE", - "mtime": "2023-08-22T16:00:40.286Z", - "size": 1070 - }, - { - "name": "index.md", - "mtime": "2023-08-22T16:00:40.287Z", - "size": 1207 - }, - { - "name": "config.yaml", - "mtime": "2023-08-22T16:00:40.287Z", - "size": 1069 - }, - { - "name": "package.json", - "mtime": "2023-08-22T16:00:40.288Z", - "size": 145 - }, - { - "name": "resources.js", - "mtime": "2023-08-22T16:00:40.289Z", - "size": 583 - }, - { - "name": "schema.graphql", - "mtime": "2023-08-22T16:00:40.289Z", - "size": 466 - }, - { - "name": "utils", - "entries": [ - { - "name": "commonUtils.js", - "mtime": "2023-08-22T16:00:40.289Z", - "size": 583 - } - ] - } - ] - } - ] + "name": "components", + "entries": [ + { + "package": "HarperDB/application-template", + "name": "deploy-test-gh" + }, + { + "package": "@fastify/compress", + "name": "fast-compress" + }, + { + "name": "my-component", + "entries": [ + { + "name": "LICENSE", + "mtime": "2023-08-22T16:00:40.286Z", + "size": 1070 + }, + { + "name": "index.md", + "mtime": "2023-08-22T16:00:40.287Z", + "size": 1207 + }, + { + "name": "config.yaml", + "mtime": "2023-08-22T16:00:40.287Z", + "size": 1069 + }, + { + "name": "package.json", + "mtime": "2023-08-22T16:00:40.288Z", + "size": 145 + }, + { + "name": "resources.js", + "mtime": "2023-08-22T16:00:40.289Z", + "size": 583 + }, + { + "name": "schema.graphql", + "mtime": "2023-08-22T16:00:40.289Z", + "size": 466 + }, + { + "name": "utils", + "entries": [ + { + "name": "commonUtils.js", + "mtime": "2023-08-22T16:00:40.289Z", + "size": 583 + } + ] + } + ] + } + ] } ``` -*** +--- ## Get Component File Gets the contents of a file inside a component project. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_component_file` -* project _(required)_ - the name of the project where the file is located -* file _(required)_ - the path relative to your project folder of the file you wish to view -* encoding _(optional)_ - the encoding that will be passed to the read file call. Defaults to `utf8` +- operation _(required)_ - must always be `get_component_file` +- project _(required)_ - the name of the project where the file is located +- file _(required)_ - the path relative to your project folder of the file you wish to view +- encoding _(optional)_ - the encoding that will be passed to the read file call. Defaults to `utf8` ### Body ```json { - "operation": "get_component_file", - "project": "my-component", - "file": "resources.js" + "operation": "get_component_file", + "project": "my-component", + "file": "resources.js" } ``` @@ -283,33 +283,33 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "/**export class MyCustomResource extends tables.TableName {\n\t/ we can define our own custom POST handler\n\tpost(content) {\n\t\t/ do something with the incoming content;\n\t\treturn super.post(content);\n\t}\n\t/ or custom GET handler\n\tget() {\n\t\t/ we can modify this resource before returning\n\t\treturn super.get();\n\t}\n}\n */\n/ we can also define a custom resource without a specific table\nexport class Greeting extends Resource {\n\t/ a \"Hello, world!\" handler\n\tget() {\n\t\treturn { greeting: 'Hello, world!' };\n\t}\n}" + "message": "/**export class MyCustomResource extends tables.TableName {\n\t/ we can define our own custom POST handler\n\tpost(content) {\n\t\t/ do something with the incoming content;\n\t\treturn super.post(content);\n\t}\n\t/ or custom GET handler\n\tget() {\n\t\t/ we can modify this resource before returning\n\t\treturn super.get();\n\t}\n}\n */\n/ we can also define a custom resource without a specific table\nexport class Greeting extends Resource {\n\t/ a \"Hello, world!\" handler\n\tget() {\n\t\treturn { greeting: 'Hello, world!' };\n\t}\n}" } ``` -*** +--- ## Set Component File Creates or updates a file inside a component project. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_component_file` -* project _(required)_ - the name of the project the file is located in -* file _(required)_ - the path relative to your project folder of the file you wish to set -* payload _(required)_ - what will be written to the file -* encoding _(optional)_ - the encoding that will be passed to the write file call. Defaults to `utf8` -* replicated _(optional)_ - if true, Harper will replicate the component update to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - must always be `set_component_file` +- project _(required)_ - the name of the project the file is located in +- file _(required)_ - the path relative to your project folder of the file you wish to set +- payload _(required)_ - what will be written to the file +- encoding _(optional)_ - the encoding that will be passed to the write file call. Defaults to `utf8` +- replicated _(optional)_ - if true, Harper will replicate the component update to all nodes in the cluster. Must be a boolean. ### Body ```json { - "operation": "set_component_file", - "project": "my-component", - "file": "test.js", - "payload": "console.log('hello world')" + "operation": "set_component_file", + "project": "my-component", + "file": "test.js", + "payload": "console.log('hello world')" } ``` @@ -317,7 +317,7 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Successfully set component: test.js" + "message": "Successfully set component: test.js" } ``` @@ -332,27 +332,27 @@ _Operation is restricted to super_user roles only_ - key _(required)_ - the private key contents. Must be an ed25519 key. Line breaks must be delimited with `\n` and have a trailing `\n` - host _(required)_ - the host for the ssh config (see below). Used as part of the `package` url when deploying a component using this key - hostname _(required)_ - the hostname for the ssh config (see below). Used to map `host` to an actual domain (e.g. `github.com`) -- known_hosts _(optional)_ - the public SSH keys of the host your component will be retrieved from. If `hostname` is `github.com` this will be retrieved automatically. Line breaks must be delimited with `\n` +- known*hosts *(optional)\_ - the public SSH keys of the host your component will be retrieved from. If `hostname` is `github.com` this will be retrieved automatically. Line breaks must be delimited with `\n` - replicated _(optional)_ - if true, HarperDB will replicate the key to all nodes in the cluster. Must be a boolean. -_Operation is restricted to super\_user roles only_ + _Operation is restricted to super_user roles only_ * operation _(required)_ - must always be `add_ssh_key` * name _(required)_ - the name of the key * key _(required)_ - the private key contents. Line breaks must be delimited with * host _(required)_ - the host for the ssh config (see below). Used as part of the `package` url when deploying a component using this key * hostname _(required)_ - the hostname for the ssh config (see below). Used to map `host` to an actual domain (e.g. `github.com`) -* known\_hosts _(optional)_ - the public SSH keys of the host your component will be retrieved from. If `hostname` is `github.com` this will be retrieved automatically. Line breaks must be delimited with +* known_hosts _(optional)_ - the public SSH keys of the host your component will be retrieved from. If `hostname` is `github.com` this will be retrieved automatically. Line breaks must be delimited with * replicated _(optional)_ - if true, Harper will replicate the key to all nodes in the cluster. Must be a boolean. ### Body ```json { - "operation": "add_ssh_key", - "name": "harperdb-private-component", - "key": "-----BEGIN OPENSSH PRIVATE KEY-----\nthis\nis\na\nfake\nkey\n-----END OPENSSH PRIVATE KEY-----\n", - "host": "harperdb-private-component.github.com", - "hostname": "github.com" + "operation": "add_ssh_key", + "name": "harperdb-private-component", + "key": "-----BEGIN OPENSSH PRIVATE KEY-----\nthis\nis\na\nfake\nkey\n-----END OPENSSH PRIVATE KEY-----\n", + "host": "harperdb-private-component.github.com", + "hostname": "github.com" } ``` @@ -360,7 +360,7 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Added ssh key: harperdb-private-component" + "message": "Added ssh key: harperdb-private-component" } ``` @@ -387,7 +387,7 @@ Note that `deploy_component` with a package uses `npm install` so the url must b Updates the private key contents of an existing SSH key. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `update_ssh_key` - name _(required)_ - the name of the key to be updated @@ -398,11 +398,11 @@ _Operation is restricted to super\_user roles only_ ```json { - "operation": "update_ssh_key", - "name": "harperdb-private-component", - "key": "-----BEGIN OPENSSH PRIVATE KEY-----\nthis\nis\na\nNEWFAKE\nkey\n-----END OPENSSH PRIVATE KEY-----\n", - "host": "harperdb-private-component.github.com", - "hostname": "github.com" + "operation": "update_ssh_key", + "name": "harperdb-private-component", + "key": "-----BEGIN OPENSSH PRIVATE KEY-----\nthis\nis\na\nNEWFAKE\nkey\n-----END OPENSSH PRIVATE KEY-----\n", + "host": "harperdb-private-component.github.com", + "hostname": "github.com" } ``` @@ -410,7 +410,7 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Updated ssh key: harperdb-private-component" + "message": "Updated ssh key: harperdb-private-component" } ``` @@ -418,17 +418,17 @@ _Operation is restricted to super\_user roles only_ Deletes a SSH key. This will also remove it from the generated SSH config. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_ssh_key` -* name _(required)_ - the name of the key to be deleted -* replicated _(optional)_ - if true, Harper will replicate the key deletion to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - must always be `delete_ssh_key` +- name _(required)_ - the name of the key to be deleted +- replicated _(optional)_ - if true, Harper will replicate the key deletion to all nodes in the cluster. Must be a boolean. ### Body ```json { - "name": "harperdb-private-component" + "name": "harperdb-private-component" } ``` @@ -436,7 +436,7 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Deleted ssh key: harperdb-private-component" + "message": "Deleted ssh key: harperdb-private-component" } ``` @@ -444,15 +444,15 @@ _Operation is restricted to super\_user roles only_ List off the names of added SSH keys -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `list_ssh_keys` +- operation _(required)_ - must always be `list_ssh_keys` ### Body ```json { - "operation": "list_ssh_keys" + "operation": "list_ssh_keys" } ``` @@ -469,20 +469,20 @@ _Operation is restricted to super\_user roles only_ ## Set SSH Known Hosts -Sets the SSH known\_hosts file. This will overwrite the file. +Sets the SSH known_hosts file. This will overwrite the file. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_ssh_known_hosts` -* known\_hosts _(required)_ - The contents to set the known\_hosts to. Line breaks must be delimite d with -* replicated _(optional)_ - if true, Harper will replicate the known hosts to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - must always be `set_ssh_known_hosts` +- known_hosts _(required)_ - The contents to set the known_hosts to. Line breaks must be delimite d with +- replicated _(optional)_ - if true, Harper will replicate the known hosts to all nodes in the cluster. Must be a boolean. ### Body ```json { - "operation": "set_ssh_known_hosts", - "known_hosts": "github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=\ngithub.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl\ngithub.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=\n" + "operation": "set_ssh_known_hosts", + "known_hosts": "github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=\ngithub.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl\ngithub.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=\n" } ``` @@ -490,23 +490,23 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Known hosts successfully set" + "message": "Known hosts successfully set" } ``` ## Get SSH Known Hosts -Gets the contents of the known\_hosts file +Gets the contents of the known_hosts file -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_ssh_known_hosts` +- operation _(required)_ - must always be `get_ssh_known_hosts` ### Body ```json { - "operation": "get_ssh_known_hosts" + "operation": "get_ssh_known_hosts" } ``` @@ -514,6 +514,6 @@ _Operation is restricted to super\_user roles only_ ```json { - "known_hosts": "github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=\ngithub.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl\ngithub.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=\n" + "known_hosts": "github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=\ngithub.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl\ngithub.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=\n" } ``` diff --git a/site/versioned_docs/version-4.5/developers/operations-api/custom-functions.md b/site/versioned_docs/version-4.5/developers/operations-api/custom-functions.md index a1508219..0b2261e0 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/custom-functions.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/custom-functions.md @@ -4,7 +4,7 @@ title: Custom Functions # Custom Functions -*These operations are deprecated.* +_These operations are deprecated._ ## Custom Functions Status @@ -12,21 +12,23 @@ Returns the state of the Custom functions server. This includes whether it is en _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `custom_function_status` +- operation _(required)_ - must always be `custom_function_status` ### Body + ```json { - "operation": "custom_functions_status" + "operation": "custom_functions_status" } ``` ### Response: 200 + ```json { - "is_enabled": true, - "port": 9926, - "directory": "/Users/myuser/hdb/custom_functions" + "is_enabled": true, + "port": 9926, + "directory": "/Users/myuser/hdb/custom_functions" } ``` @@ -38,13 +40,13 @@ Returns an array of projects within the Custom Functions root project directory. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_custom_functions` +- operation _(required)_ - must always be `get_custom_functions` ### Body ```json { - "operation": "get_custom_functions" + "operation": "get_custom_functions" } ``` @@ -52,11 +54,11 @@ _Operation is restricted to super_user roles only_ ```json { - "dogs": { - "routes": ["examples"], - "helpers":["example"], - "static":3 - } + "dogs": { + "routes": ["examples"], + "helpers": ["example"], + "static": 3 + } } ``` @@ -68,19 +70,19 @@ Returns the content of the specified file as text. HarperDStudio uses this call _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_custom_function` -* project _(required)_ - the name of the project containing the file for which you wish to get content -* type _(required)_ - the name of the sub-folder containing the file for which you wish to get content - must be either routes or helpers -* file _(required)_ - The name of the file for which you wish to get content - should not include the file extension (which is always .js) +- operation _(required)_ - must always be `get_custom_function` +- project _(required)_ - the name of the project containing the file for which you wish to get content +- type _(required)_ - the name of the sub-folder containing the file for which you wish to get content - must be either routes or helpers +- file _(required)_ - The name of the file for which you wish to get content - should not include the file extension (which is always .js) ### Body ```json { - "operation": "get_custom_function", - "project": "dogs", - "type": "helpers", - "file": "example" + "operation": "get_custom_function", + "project": "dogs", + "type": "helpers", + "file": "example" } ``` @@ -88,7 +90,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" + "message": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" } ``` @@ -100,21 +102,21 @@ Updates the content of the specified file. Harper Studio uses this call to save _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_custom_function` -* project _(required)_ - the name of the project containing the file for which you wish to set content -* type _(required)_ - the name of the sub-folder containing the file for which you wish to set content - must be either routes or helpers -* file _(required)_ - the name of the file for which you wish to set content - should not include the file extension (which is always .js) -* function_content _(required)_ - the content you wish to save into the specified file +- operation _(required)_ - must always be `set_custom_function` +- project _(required)_ - the name of the project containing the file for which you wish to set content +- type _(required)_ - the name of the sub-folder containing the file for which you wish to set content - must be either routes or helpers +- file _(required)_ - the name of the file for which you wish to set content - should not include the file extension (which is always .js) +- function*content *(required)\_ - the content you wish to save into the specified file ### Body ```json { - "operation": "set_custom_function", - "project": "dogs", - "type": "helpers", - "file": "example", - "function_content": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" + "operation": "set_custom_function", + "project": "dogs", + "type": "helpers", + "file": "example", + "function_content": "'use strict';\n\nconst https = require('https');\n\nconst authRequest = (options) => {\n return new Promise((resolve, reject) => {\n const req = https.request(options, (res) => {\n res.setEncoding('utf8');\n let responseBody = '';\n\n res.on('data', (chunk) => {\n responseBody += chunk;\n });\n\n res.on('end', () => {\n resolve(JSON.parse(responseBody));\n });\n });\n\n req.on('error', (err) => {\n reject(err);\n });\n\n req.end();\n });\n};\n\nconst customValidation = async (request,logger) => {\n const options = {\n hostname: 'jsonplaceholder.typicode.com',\n port: 443,\n path: '/todos/1',\n method: 'GET',\n headers: { authorization: request.headers.authorization },\n };\n\n const result = await authRequest(options);\n\n /*\n * throw an authentication error based on the response body or statusCode\n */\n if (result.error) {\n const errorString = result.error || 'Sorry, there was an error authenticating your request';\n logger.error(errorString);\n throw new Error(errorString);\n }\n return request;\n};\n\nmodule.exports = customValidation;\n" } ``` @@ -122,7 +124,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully updated custom function: example.js" + "message": "Successfully updated custom function: example.js" } ``` @@ -134,19 +136,19 @@ Deletes the specified file. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_custom_function` -* project _(required)_ - the name of the project containing the file you wish to delete -* type _(required)_ - the name of the sub-folder containing the file you wish to delete. Must be either routes or helpers -* file _(required)_ - the name of the file you wish to delete. Should not include the file extension (which is always .js) +- operation _(required)_ - must always be `drop_custom_function` +- project _(required)_ - the name of the project containing the file you wish to delete +- type _(required)_ - the name of the sub-folder containing the file you wish to delete. Must be either routes or helpers +- file _(required)_ - the name of the file you wish to delete. Should not include the file extension (which is always .js) ### Body ```json { - "operation": "drop_custom_function", - "project": "dogs", - "type": "helpers", - "file": "example" + "operation": "drop_custom_function", + "project": "dogs", + "type": "helpers", + "file": "example" } ``` @@ -154,7 +156,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message":"Successfully deleted custom function: example.js" + "message": "Successfully deleted custom function: example.js" } ``` @@ -166,15 +168,15 @@ Creates a new project folder in the Custom Functions root project directory. It _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_custom_function_project` -* project _(required)_ - the name of the project you wish to create +- operation _(required)_ - must always be `add_custom_function_project` +- project _(required)_ - the name of the project you wish to create ### Body ```json { - "operation": "add_custom_function_project", - "project": "dogs" + "operation": "add_custom_function_project", + "project": "dogs" } ``` @@ -182,7 +184,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message":"Successfully created custom function project: dogs" + "message": "Successfully created custom function project: dogs" } ``` @@ -194,15 +196,15 @@ Deletes the specified project folder and all of its contents. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_custom_function_project` -* project _(required)_ - the name of the project you wish to delete +- operation _(required)_ - must always be `drop_custom_function_project` +- project _(required)_ - the name of the project you wish to delete ### Body ```json { - "operation": "drop_custom_function_project", - "project": "dogs" + "operation": "drop_custom_function_project", + "project": "dogs" } ``` @@ -210,7 +212,7 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully deleted project: dogs" + "message": "Successfully deleted project: dogs" } ``` @@ -222,17 +224,17 @@ Creates a .tar file of the specified project folder, then reads it into a base64 _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `package_custom_function_project` -* project _(required)_ - the name of the project you wish to package up for deployment -* skip_node_modules _(optional)_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean. +- operation _(required)_ - must always be `package_custom_function_project` +- project _(required)_ - the name of the project you wish to package up for deployment +- skip*node_modules *(optional)\_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean. ### Body ```json { - "operation": "package_custom_function_project", - "project": "dogs", - "skip_node_modules": true + "operation": "package_custom_function_project", + "project": "dogs", + "skip_node_modules": true } ``` @@ -240,9 +242,9 @@ _Operation is restricted to super_user roles only_ ```json { - "project": "dogs", - "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", - "file": "/tmp/d27f1154-5d82-43f0-a5fb-a3018f366081.tar" + "project": "dogs", + "payload": "LgAAAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "file": "/tmp/d27f1154-5d82-43f0-a5fb-a3018f366081.tar" } ``` @@ -254,18 +256,17 @@ Takes the output of package_custom_function_project, decrypts the base64-encoded _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `deploy_custom_function_project` -* project _(required)_ - the name of the project you wish to deploy. Must be a string -* payload _(required)_ - a base64-encoded string representation of the .tar file. Must be a string - +- operation _(required)_ - must always be `deploy_custom_function_project` +- project _(required)_ - the name of the project you wish to deploy. Must be a string +- payload _(required)_ - a base64-encoded string representation of the .tar file. Must be a string ### Body ```json { - "operation": "deploy_custom_function_project", - "project": "dogs", - "payload": "A very large base64-encoded string represenation of the .tar file" + "operation": "deploy_custom_function_project", + "project": "dogs", + "payload": "A very large base64-encoded string represenation of the .tar file" } ``` @@ -273,6 +274,6 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "Successfully deployed project: dogs" + "message": "Successfully deployed project: dogs" } ``` diff --git a/site/versioned_docs/version-4.5/developers/operations-api/databases-and-tables.md b/site/versioned_docs/version-4.5/developers/operations-api/databases-and-tables.md index 27ec954e..eea77222 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/databases-and-tables.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/databases-and-tables.md @@ -1,364 +1,388 @@ --- -title: Databases and Tables +title: Databases and Tables --- -# Databases and Tables +# Databases and Tables ## Describe All + Returns the definitions of all databases and tables within the database. Record counts about 5000 records are estimated, as determining the exact count can be expensive. When the record count is estimated, this is indicated by the inclusion of a confidence interval of `estimated_record_range`. If you need the exact count, you can include an `"exact_count": true` in the operation, but be aware that this requires a full table scan (may be expensive). -* operation _(required)_ - must always be `describe_all` +- operation _(required)_ - must always be `describe_all` ### Body + ```json { - "operation": "describe_all" + "operation": "describe_all" } ``` ### Response: 200 + ```json { - "dev": { - "dog": { - "schema": "dev", - "name": "dog", - "hash_attribute": "id", - "audit": true, - "schema_defined": false, - "attributes": [ - { - "attribute": "id", - "indexed": true, - "is_primary_key": true - }, - { - "attribute": "__createdtime__", - "indexed": true - }, - { - "attribute": "__updatedtime__", - "indexed": true - }, - { - "attribute": "type", - "indexed": true - } - ], - "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", - "record_count": 4000, - "estimated_record_range": [3976, 4033], - "last_updated_record": 1697658683698.4504 - } - } + "dev": { + "dog": { + "schema": "dev", + "name": "dog", + "hash_attribute": "id", + "audit": true, + "schema_defined": false, + "attributes": [ + { + "attribute": "id", + "indexed": true, + "is_primary_key": true + }, + { + "attribute": "__createdtime__", + "indexed": true + }, + { + "attribute": "__updatedtime__", + "indexed": true + }, + { + "attribute": "type", + "indexed": true + } + ], + "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", + "record_count": 4000, + "estimated_record_range": [3976, 4033], + "last_updated_record": 1697658683698.4504 + } + } } ``` --- ## Describe database + Returns the definitions of all tables within the specified database. -* operation _(required)_ - must always be `describe_database` -* database _(optional)_ - database where the table you wish to describe lives. The default is `data` +- operation _(required)_ - must always be `describe_database` +- database _(optional)_ - database where the table you wish to describe lives. The default is `data` ### Body + ```json { - "operation": "describe_database", - "database": "dev" + "operation": "describe_database", + "database": "dev" } ``` ### Response: 200 + ```json { - "dog": { - "schema": "dev", - "name": "dog", - "hash_attribute": "id", - "audit": true, - "schema_defined": false, - "attributes": [ - { - "attribute": "id", - "indexed": true, - "is_primary_key": true - }, - { - "attribute": "__createdtime__", - "indexed": true - }, - { - "attribute": "__updatedtime__", - "indexed": true - }, - { - "attribute": "type", - "indexed": true - } - ], - "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", - "record_count": 4000, - "estimated_record_range": [3976, 4033], - "last_updated_record": 1697658683698.4504 - } + "dog": { + "schema": "dev", + "name": "dog", + "hash_attribute": "id", + "audit": true, + "schema_defined": false, + "attributes": [ + { + "attribute": "id", + "indexed": true, + "is_primary_key": true + }, + { + "attribute": "__createdtime__", + "indexed": true + }, + { + "attribute": "__updatedtime__", + "indexed": true + }, + { + "attribute": "type", + "indexed": true + } + ], + "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", + "record_count": 4000, + "estimated_record_range": [3976, 4033], + "last_updated_record": 1697658683698.4504 + } } ``` --- ## Describe Table + Returns the definition of the specified table. -* operation _(required)_ - must always be `describe_table` -* table _(required)_ - table you wish to describe -* database _(optional)_ - database where the table you wish to describe lives. The default is `data` +- operation _(required)_ - must always be `describe_table` +- table _(required)_ - table you wish to describe +- database _(optional)_ - database where the table you wish to describe lives. The default is `data` ### Body + ```json { - "operation": "describe_table", - "table": "dog" + "operation": "describe_table", + "table": "dog" } ``` ### Response: 200 + ```json { - "schema": "dev", - "name": "dog", - "hash_attribute": "id", - "audit": true, - "schema_defined": false, - "attributes": [ - { - "attribute": "id", - "indexed": true, - "is_primary_key": true - }, - { - "attribute": "__createdtime__", - "indexed": true - }, - { - "attribute": "__updatedtime__", - "indexed": true - }, - { - "attribute": "type", - "indexed": true - } - ], - "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", - "record_count": 4000, - "estimated_record_range": [3976, 4033], - "last_updated_record": 1697658683698.4504 + "schema": "dev", + "name": "dog", + "hash_attribute": "id", + "audit": true, + "schema_defined": false, + "attributes": [ + { + "attribute": "id", + "indexed": true, + "is_primary_key": true + }, + { + "attribute": "__createdtime__", + "indexed": true + }, + { + "attribute": "__updatedtime__", + "indexed": true + }, + { + "attribute": "type", + "indexed": true + } + ], + "clustering_stream_name": "dd9e90c2689151ab812e0f2d98816bff", + "record_count": 4000, + "estimated_record_range": [3976, 4033], + "last_updated_record": 1697658683698.4504 } ``` --- ## Create database + Create a new database. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `create_database` -* database _(optional)_ - name of the database you are creating. The default is `data` +- operation _(required)_ - must always be `create_database` +- database _(optional)_ - name of the database you are creating. The default is `data` ### Body + ```json { - "operation": "create_database", - "database": "dev" + "operation": "create_database", + "database": "dev" } ``` ### Response: 200 + ```json { - "message": "database 'dev' successfully created" + "message": "database 'dev' successfully created" } ``` --- ## Drop database + Drop an existing database. NOTE: Dropping a database will delete all tables and all of their records in that database. _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `drop_database` -* database _(required)_ - name of the database you are dropping -* replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - this should always be `drop_database` +- database _(required)_ - name of the database you are dropping +- replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. ### Body + ```json { - "operation": "drop_database", - "database": "dev" + "operation": "drop_database", + "database": "dev" } ``` ### Response: 200 + ```json { - "message": "successfully deleted 'dev'" + "message": "successfully deleted 'dev'" } ``` --- ## Create Table + Create a new table within a database. _Operation is restricted to super_user roles only_ - -* operation _(required)_ - must always be `create_table` -* database _(optional)_ - name of the database where you want your table to live. If the database does not exist, it will be created. If the `database` property is not provided it will default to `data`. -* table _(required)_ - name of the table you are creating -* primary_key _(required)_ - primary key for the table -* attributes _(optional)_ - an array of attributes that specifies the schema for the table, that is the set of attributes for the table. When attributes are supplied the table will not be considered a "dynamic schema" table, and attributes will not be auto-added when records with new properties are inserted. Each attribute is specified as: - * name _(required)_ - the name of the attribute - * indexed _(optional)_ - indicates if the attribute should be indexed - * type _(optional)_ - specifies the data type of the attribute (can be String, Int, Float, Date, ID, Any) -* expiration _(optional)_ - specifies the time-to-live or expiration of records in the table before they are evicted (records are not evicted on any timer if not specified). This is specified in seconds. +- operation _(required)_ - must always be `create_table` +- database _(optional)_ - name of the database where you want your table to live. If the database does not exist, it will be created. If the `database` property is not provided it will default to `data`. +- table _(required)_ - name of the table you are creating +- primary*key *(required)\_ - primary key for the table +- attributes _(optional)_ - an array of attributes that specifies the schema for the table, that is the set of attributes for the table. When attributes are supplied the table will not be considered a "dynamic schema" table, and attributes will not be auto-added when records with new properties are inserted. Each attribute is specified as: + - name _(required)_ - the name of the attribute + - indexed _(optional)_ - indicates if the attribute should be indexed + - type _(optional)_ - specifies the data type of the attribute (can be String, Int, Float, Date, ID, Any) +- expiration _(optional)_ - specifies the time-to-live or expiration of records in the table before they are evicted (records are not evicted on any timer if not specified). This is specified in seconds. ### Body + ```json { - "operation": "create_table", - "database": "dev", - "table": "dog", - "primary_key": "id" + "operation": "create_table", + "database": "dev", + "table": "dog", + "primary_key": "id" } ``` ### Response: 200 + ```json { - "message": "table 'dev.dog' successfully created." + "message": "table 'dev.dog' successfully created." } ``` --- ## Drop Table + Drop an existing database table. NOTE: Dropping a table will delete all associated records in that table. _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `drop_table` -* database _(optional)_ - database where the table you are dropping lives. The default is `data` -* table _(required)_ - name of the table you are dropping -* replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. +- operation _(required)_ - this should always be `drop_table` +- database _(optional)_ - database where the table you are dropping lives. The default is `data` +- table _(required)_ - name of the table you are dropping +- replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. ### Body ```json { - "operation": "drop_table", - "database": "dev", - "table": "dog" + "operation": "drop_table", + "database": "dev", + "table": "dog" } ``` ### Response: 200 + ```json { - "message": "successfully deleted table 'dev.dog'" + "message": "successfully deleted table 'dev.dog'" } ``` --- -## Create Attribute +## Create Attribute + Create a new attribute within the specified table. **The create_attribute operation can be used for admins wishing to pre-define database values for setting role-based permissions or for any other reason.** _Note: Harper will automatically create new attributes on insert and update if they do not already exist within the database._ -* operation _(required)_ - must always be `create_attribute` -* database _(optional)_ - name of the database of the table you want to add your attribute. The default is `data` -* table _(required)_ - name of the table where you want to add your attribute to live -* attribute _(required)_ - name for the attribute +- operation _(required)_ - must always be `create_attribute` +- database _(optional)_ - name of the database of the table you want to add your attribute. The default is `data` +- table _(required)_ - name of the table where you want to add your attribute to live +- attribute _(required)_ - name for the attribute ### Body + ```json { - "operation": "create_attribute", - "database": "dev", - "table": "dog", - "attribute": "is_adorable" + "operation": "create_attribute", + "database": "dev", + "table": "dog", + "attribute": "is_adorable" } ``` ### Response: 200 + ```json { - "message": "inserted 1 of 1 records", - "skipped_hashes": [], - "inserted_hashes": [ - "383c0bef-5781-4e1c-b5c8-987459ad0831" - ] + "message": "inserted 1 of 1 records", + "skipped_hashes": [], + "inserted_hashes": ["383c0bef-5781-4e1c-b5c8-987459ad0831"] } ``` --- ## Drop Attribute + Drop an existing attribute from the specified table. NOTE: Dropping an attribute will delete all associated attribute values in that table. _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `drop_attribute` -* database _(optional)_ - database where the table you are dropping lives. The default is `data` -* table _(required)_ - table where the attribute you are dropping lives -* attribute _(required)_ - attribute that you intend to drop +- operation _(required)_ - this should always be `drop_attribute` +- database _(optional)_ - database where the table you are dropping lives. The default is `data` +- table _(required)_ - table where the attribute you are dropping lives +- attribute _(required)_ - attribute that you intend to drop ### Body ```json { - "operation": "drop_attribute", - "database": "dev", - "table": "dog", - "attribute": "is_adorable" + "operation": "drop_attribute", + "database": "dev", + "table": "dog", + "attribute": "is_adorable" } ``` ### Response: 200 + ```json { - "message": "successfully deleted attribute 'is_adorable'" + "message": "successfully deleted attribute 'is_adorable'" } ``` --- ## Get Backup + This will return a snapshot of the requested database. This provides a means for backing up the database through the operations API. The response will be the raw database file (in binary format), which can later be restored as a database file by copying into the appropriate hdb/databases directory (with Harper not running). The returned file is a snapshot of the database at the moment in time that the get_backup operation begins. This also supports backing up individual tables in a database. However, this is a more expensive operation than backing up a database in whole, and will lose any transactional atomicity between writes across tables, so generally it is recommended that you backup the entire database. It is important to note that trying to copy a database file that is in use (Harper actively running and writing to the file) using standard file copying tools is not safe (the copied file will likely be corrupt), which is why using this snapshot operation is recommended for backups (volume snapshots are also a good way to backup Harper databases). _Operation is restricted to super_user roles only_ -* operation _(required)_ - this should always be `get_backup` -* database _(required)_ - this is the database that will be snapshotted and returned -* table _(optional)_ - this will specify a specific table to backup -* tables _(optional)_ - this will specify a specific set of tables to backup +- operation _(required)_ - this should always be `get_backup` +- database _(required)_ - this is the database that will be snapshotted and returned +- table _(optional)_ - this will specify a specific table to backup +- tables _(optional)_ - this will specify a specific set of tables to backup ### Body ```json { - "operation": "get_backup", - "database": "dev" + "operation": "get_backup", + "database": "dev" } ``` ### Response: 200 + ``` The database in raw binary data format ``` diff --git a/site/versioned_docs/version-4.5/developers/operations-api/index.md b/site/versioned_docs/version-4.5/developers/operations-api/index.md index 5d63fb68..a032f81a 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/index.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/index.md @@ -19,21 +19,21 @@ Content-Type: application/json The operations API reference is available below and categorized by topic: -* [Quick Start Examples](./quickstart-examples) -* [Databases and Tables](./databases-and-tables) -* [NoSQL Operations](./nosql-operations) -* [Bulk Operations](./bulk-operations) -* [Users and Roles](./users-and-roles) -* [Clustering](./clustering) -* [Clustering with NATS](./clustering-nats) -* [Components](./components) -* [Registration](./registration) -* [Jobs](./jobs) -* [Logs](./logs) -* [Utilities](./utilities) -* [Token Authentication](./token-authentication) -* [SQL Operations](./sql-operations) -* [Advanced JSON SQL Examples](./advanced-json-sql-examples) +- [Quick Start Examples](./quickstart-examples) +- [Databases and Tables](./databases-and-tables) +- [NoSQL Operations](./nosql-operations) +- [Bulk Operations](./bulk-operations) +- [Users and Roles](./users-and-roles) +- [Clustering](./clustering) +- [Clustering with NATS](./clustering-nats) +- [Components](./components) +- [Registration](./registration) +- [Jobs](./jobs) +- [Logs](./logs) +- [Utilities](./utilities) +- [Token Authentication](./token-authentication) +- [SQL Operations](./sql-operations) +- [Advanced JSON SQL Examples](./advanced-json-sql-examples) • [Past Release API Documentation](https://olddocs.harperdb.io) diff --git a/site/versioned_docs/version-4.5/developers/operations-api/jobs.md b/site/versioned_docs/version-4.5/developers/operations-api/jobs.md index 8b05357f..173125a1 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/jobs.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/jobs.md @@ -1,82 +1,87 @@ --- -title: Jobs +title: Jobs --- -# Jobs +# Jobs ## Get Job + Returns job status, metrics, and messages for the specified job ID. -* operation _(required)_ - must always be `get_job` -* id _(required)_ - the id of the job you wish to view +- operation _(required)_ - must always be `get_job` +- id _(required)_ - the id of the job you wish to view ### Body ```json { - "operation": "get_job", - "id": "4a982782-929a-4507-8794-26dae1132def" + "operation": "get_job", + "id": "4a982782-929a-4507-8794-26dae1132def" } ``` ### Response: 200 + ```json [ - { - "__createdtime__": 1611615798782, - "__updatedtime__": 1611615801207, - "created_datetime": 1611615798774, - "end_datetime": 1611615801206, - "id": "4a982782-929a-4507-8794-26dae1132def", - "job_body": null, - "message": "successfully loaded 350 of 350 records", - "start_datetime": 1611615798805, - "status": "COMPLETE", - "type": "csv_url_load", - "user": "HDB_ADMIN", - "start_datetime_converted": "2021-01-25T23:03:18.805Z", - "end_datetime_converted": "2021-01-25T23:03:21.206Z" - } + { + "__createdtime__": 1611615798782, + "__updatedtime__": 1611615801207, + "created_datetime": 1611615798774, + "end_datetime": 1611615801206, + "id": "4a982782-929a-4507-8794-26dae1132def", + "job_body": null, + "message": "successfully loaded 350 of 350 records", + "start_datetime": 1611615798805, + "status": "COMPLETE", + "type": "csv_url_load", + "user": "HDB_ADMIN", + "start_datetime_converted": "2021-01-25T23:03:18.805Z", + "end_datetime_converted": "2021-01-25T23:03:21.206Z" + } ] ``` --- ## Search Jobs By Start Date + Returns a list of job statuses, metrics, and messages for all jobs executed within the specified time window. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `search_jobs_by_start_date` -* from_date _(required)_ - the date you wish to start the search -* to_date _(required)_ - the date you wish to end the search +- operation _(required)_ - must always be `search_jobs_by_start_date` +- from*date *(required)\_ - the date you wish to start the search +- to*date *(required)\_ - the date you wish to end the search ### Body + ```json { - "operation": "search_jobs_by_start_date", - "from_date": "2021-01-25T22:05:27.464+0000", - "to_date": "2021-01-25T23:05:27.464+0000" + "operation": "search_jobs_by_start_date", + "from_date": "2021-01-25T22:05:27.464+0000", + "to_date": "2021-01-25T23:05:27.464+0000" } ``` ### Response: 200 + ```json [ - { - "id": "942dd5cb-2368-48a5-8a10-8770ff7eb1f1", - "user": "HDB_ADMIN", - "type": "csv_url_load", - "status": "COMPLETE", - "start_datetime": 1611613284781, - "end_datetime": 1611613287204, - "job_body": null, - "message": "successfully loaded 350 of 350 records", - "created_datetime": 1611613284764, - "__createdtime__": 1611613284767, - "__updatedtime__": 1611613287207, - "start_datetime_converted": "2021-01-25T22:21:24.781Z", - "end_datetime_converted": "2021-01-25T22:21:27.204Z" - } + { + "id": "942dd5cb-2368-48a5-8a10-8770ff7eb1f1", + "user": "HDB_ADMIN", + "type": "csv_url_load", + "status": "COMPLETE", + "start_datetime": 1611613284781, + "end_datetime": 1611613287204, + "job_body": null, + "message": "successfully loaded 350 of 350 records", + "created_datetime": 1611613284764, + "__createdtime__": 1611613284767, + "__updatedtime__": 1611613287207, + "start_datetime_converted": "2021-01-25T22:21:24.781Z", + "end_datetime_converted": "2021-01-25T22:21:27.204Z" + } ] -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.5/developers/operations-api/logs.md b/site/versioned_docs/version-4.5/developers/operations-api/logs.md index b2b0e2b6..17eba72f 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/logs.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/logs.md @@ -8,27 +8,27 @@ title: Logs Returns log outputs from the primary Harper log based on the provided search criteria. [Read more about Harper logging here](../../administration/logging/standard-logging#read-logs-via-the-api). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_Log` -* start _(optional)_ - result to start with. Default is 0, the first log in `hdb.log`. Must be a number -* limit _(optional)_ - number of results returned. Default behavior is 1000. Must be a number -* level _(optional)_ - error level to filter on. Default behavior is all levels. Must be `notify`, `error`, `warn`, `info`, `debug` or `trace` -* from _(optional)_ - date to begin showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss`. Default is first log in `hdb.log` -* until _(optional)_ - date to end showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss`. Default is last log in `hdb.log` -* order _(optional)_ - order to display logs desc or asc by timestamp. By default, will maintain `hdb.log` order +- operation _(required)_ - must always be `read_Log` +- start _(optional)_ - result to start with. Default is 0, the first log in `hdb.log`. Must be a number +- limit _(optional)_ - number of results returned. Default behavior is 1000. Must be a number +- level _(optional)_ - error level to filter on. Default behavior is all levels. Must be `notify`, `error`, `warn`, `info`, `debug` or `trace` +- from _(optional)_ - date to begin showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss`. Default is first log in `hdb.log` +- until _(optional)_ - date to end showing log results. Must be `YYYY-MM-DD` or `YYYY-MM-DD hh:mm:ss`. Default is last log in `hdb.log` +- order _(optional)_ - order to display logs desc or asc by timestamp. By default, will maintain `hdb.log` order ### Body ```json { - "operation": "read_log", - "start": 0, - "limit": 1000, - "level": "error", - "from": "2021-01-25T22:05:27.464+0000", - "until": "2021-01-25T23:05:27.464+0000", - "order": "desc" + "operation": "read_log", + "start": 0, + "limit": 1000, + "level": "error", + "from": "2021-01-25T22:05:27.464+0000", + "until": "2021-01-25T23:05:27.464+0000", + "order": "desc" } ``` @@ -36,56 +36,55 @@ _Operation is restricted to super\_user roles only_ ```json [ - { - "level": "notify", - "message": "Connected to cluster server.", - "timestamp": "2021-01-25T23:03:20.710Z", - "thread": "main/0", - "tags": [] - }, - { - "level": "warn", - "message": "Login failed", - "timestamp": "2021-01-25T22:24:45.113Z", - "thread": "http/9", - "tags": [] - }, - { - "level": "error", - "message": "unknown attribute 'name and breed'", - "timestamp": "2021-01-25T22:23:24.167Z", - "thread": "http/9", - "tags": [] - } + { + "level": "notify", + "message": "Connected to cluster server.", + "timestamp": "2021-01-25T23:03:20.710Z", + "thread": "main/0", + "tags": [] + }, + { + "level": "warn", + "message": "Login failed", + "timestamp": "2021-01-25T22:24:45.113Z", + "thread": "http/9", + "tags": [] + }, + { + "level": "error", + "message": "unknown attribute 'name and breed'", + "timestamp": "2021-01-25T22:23:24.167Z", + "thread": "http/9", + "tags": [] + } ] - ``` -*** +--- ## Read Transaction Log Returns all transactions logged for the specified database table. You may filter your results with the optional from, to, and limit fields. [Read more about Harper transaction logs here](./logs#read-transaction-log). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_transaction_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* from _(optional)_ - time format must be millisecond-based epoch in UTC -* to _(optional)_ - time format must be millisecond-based epoch in UTC -* limit _(optional)_ - max number of logs you want to receive. Must be a number +- operation _(required)_ - must always be `read_transaction_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- from _(optional)_ - time format must be millisecond-based epoch in UTC +- to _(optional)_ - time format must be millisecond-based epoch in UTC +- limit _(optional)_ - max number of logs you want to receive. Must be a number ### Body ```json { - "operation": "read_transaction_log", - "schema": "dev", - "table": "dog", - "from": 1560249020865, - "to": 1660585656639, - "limit": 10 + "operation": "read_transaction_log", + "schema": "dev", + "table": "dog", + "from": 1560249020865, + "to": 1660585656639, + "limit": 10 } ``` @@ -93,198 +92,198 @@ _Operation is restricted to super\_user roles only_ ```json [ - { - "operation": "insert", - "user": "admin", - "timestamp": 1660165619736, - "records": [ - { - "id": 1, - "dog_name": "Penny", - "owner_name": "Kyle", - "breed_id": 154, - "age": 7, - "weight_lbs": 38, - "__updatedtime__": 1660165619688, - "__createdtime__": 1660165619688 - } - ] - }, - { - "operation": "insert", - "user": "admin", - "timestamp": 1660165619813, - "records": [ - { - "id": 2, - "dog_name": "Harper", - "owner_name": "Stephen", - "breed_id": 346, - "age": 7, - "weight_lbs": 55, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 3, - "dog_name": "Alby", - "owner_name": "Kaylan", - "breed_id": 348, - "age": 7, - "weight_lbs": 84, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 4, - "dog_name": "Billy", - "owner_name": "Zach", - "breed_id": 347, - "age": 6, - "weight_lbs": 60, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 5, - "dog_name": "Rose Merry", - "owner_name": "Zach", - "breed_id": 348, - "age": 8, - "weight_lbs": 15, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 6, - "dog_name": "Kato", - "owner_name": "Kyle", - "breed_id": 351, - "age": 6, - "weight_lbs": 32, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 7, - "dog_name": "Simon", - "owner_name": "Fred", - "breed_id": 349, - "age": 3, - "weight_lbs": 35, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 8, - "dog_name": "Gemma", - "owner_name": "Stephen", - "breed_id": 350, - "age": 5, - "weight_lbs": 55, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 9, - "dog_name": "Yeti", - "owner_name": "Jaxon", - "breed_id": 200, - "age": 5, - "weight_lbs": 55, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 10, - "dog_name": "Monkey", - "owner_name": "Aron", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 11, - "dog_name": "Bode", - "owner_name": "Margo", - "breed_id": 104, - "age": 8, - "weight_lbs": 75, - "adorable": true, - "__updatedtime__": 1660165619797, - "__createdtime__": 1660165619797 - }, - { - "id": 12, - "dog_name": "Tucker", - "owner_name": "David", - "breed_id": 346, - "age": 2, - "weight_lbs": 60, - "adorable": true, - "__updatedtime__": 1660165619798, - "__createdtime__": 1660165619798 - }, - { - "id": 13, - "dog_name": "Jagger", - "owner_name": "Margo", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true, - "__updatedtime__": 1660165619798, - "__createdtime__": 1660165619798 - } - ] - }, - { - "operation": "update", - "user": "admin", - "timestamp": 1660165620040, - "records": [ - { - "id": 1, - "dog_name": "Penny B", - "__updatedtime__": 1660165620036 - } - ] - } + { + "operation": "insert", + "user": "admin", + "timestamp": 1660165619736, + "records": [ + { + "id": 1, + "dog_name": "Penny", + "owner_name": "Kyle", + "breed_id": 154, + "age": 7, + "weight_lbs": 38, + "__updatedtime__": 1660165619688, + "__createdtime__": 1660165619688 + } + ] + }, + { + "operation": "insert", + "user": "admin", + "timestamp": 1660165619813, + "records": [ + { + "id": 2, + "dog_name": "Harper", + "owner_name": "Stephen", + "breed_id": 346, + "age": 7, + "weight_lbs": 55, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 3, + "dog_name": "Alby", + "owner_name": "Kaylan", + "breed_id": 348, + "age": 7, + "weight_lbs": 84, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 4, + "dog_name": "Billy", + "owner_name": "Zach", + "breed_id": 347, + "age": 6, + "weight_lbs": 60, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 5, + "dog_name": "Rose Merry", + "owner_name": "Zach", + "breed_id": 348, + "age": 8, + "weight_lbs": 15, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 6, + "dog_name": "Kato", + "owner_name": "Kyle", + "breed_id": 351, + "age": 6, + "weight_lbs": 32, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 7, + "dog_name": "Simon", + "owner_name": "Fred", + "breed_id": 349, + "age": 3, + "weight_lbs": 35, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 8, + "dog_name": "Gemma", + "owner_name": "Stephen", + "breed_id": 350, + "age": 5, + "weight_lbs": 55, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 9, + "dog_name": "Yeti", + "owner_name": "Jaxon", + "breed_id": 200, + "age": 5, + "weight_lbs": 55, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 10, + "dog_name": "Monkey", + "owner_name": "Aron", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 11, + "dog_name": "Bode", + "owner_name": "Margo", + "breed_id": 104, + "age": 8, + "weight_lbs": 75, + "adorable": true, + "__updatedtime__": 1660165619797, + "__createdtime__": 1660165619797 + }, + { + "id": 12, + "dog_name": "Tucker", + "owner_name": "David", + "breed_id": 346, + "age": 2, + "weight_lbs": 60, + "adorable": true, + "__updatedtime__": 1660165619798, + "__createdtime__": 1660165619798 + }, + { + "id": 13, + "dog_name": "Jagger", + "owner_name": "Margo", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true, + "__updatedtime__": 1660165619798, + "__createdtime__": 1660165619798 + } + ] + }, + { + "operation": "update", + "user": "admin", + "timestamp": 1660165620040, + "records": [ + { + "id": 1, + "dog_name": "Penny B", + "__updatedtime__": 1660165620036 + } + ] + } ] ``` -*** +--- ## Delete Transaction Logs Before Deletes transaction log data for the specified database table that is older than the specified timestamp. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_transaction_log_before` -* schema _(required)_ - schema under which the transaction log resides. Must be a string -* table _(required)_ - table under which the transaction log resides. Must be a string -* timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC +- operation _(required)_ - must always be `delete_transaction_log_before` +- schema _(required)_ - schema under which the transaction log resides. Must be a string +- table _(required)_ - table under which the transaction log resides. Must be a string +- timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC ### Body ```json { - "operation": "delete_transaction_logs_before", - "schema": "dev", - "table": "dog", - "timestamp": 1598290282817 + "operation": "delete_transaction_logs_before", + "schema": "dev", + "table": "dog", + "timestamp": 1598290282817 } ``` @@ -292,31 +291,31 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Starting job with id 26a6d3a6-6d77-40f9-bee7-8d6ef479a126" + "message": "Starting job with id 26a6d3a6-6d77-40f9-bee7-8d6ef479a126" } ``` -*** +--- ## Read Audit Log -AuditLog must be enabled in the Harper configuration file to make this request. Returns a verbose history of all transactions logged for the specified database table, including original data records. You may filter your results with the optional search\_type and search\_values fields. [Read more about Harper transaction logs here.](../../administration/logging/transaction-logging#read_transaction_log) +AuditLog must be enabled in the Harper configuration file to make this request. Returns a verbose history of all transactions logged for the specified database table, including original data records. You may filter your results with the optional search_type and search_values fields. [Read more about Harper transaction logs here.](../../administration/logging/transaction-logging#read_transaction_log) -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search\_type _(optional)_ - possibilities are `hash_value`, `timestamp` and `username` -* search\_values _(optional)_ - an array of string or numbers relating to search\_type +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search_type _(optional)_ - possibilities are `hash_value`, `timestamp` and `username` +- search_values _(optional)_ - an array of string or numbers relating to search_type ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog" + "operation": "read_audit_log", + "schema": "dev", + "table": "dog" } ``` @@ -324,110 +323,99 @@ _Operation is restricted to super\_user roles only_ ```json [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585716133.01, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660585740558.415, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "fur_type": "coarse", - "__updatedtime__": 1660585740556 - } - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "delete", - "user_name": "admin", - "timestamp": 1660585759710.56, - "hash_values": [ - 444 - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585740556, - "__createdtime__": 1660585716128, - "fur_type": "coarse" - } - ] - } + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "hash_values": [318], + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585716133.01, + "hash_values": [444], + "records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660585740558.415, + "hash_values": [444], + "records": [ + { + "id": 444, + "fur_type": "coarse", + "__updatedtime__": 1660585740556 + } + ], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "delete", + "user_name": "admin", + "timestamp": 1660585759710.56, + "hash_values": [444], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585740556, + "__createdtime__": 1660585716128, + "fur_type": "coarse" + } + ] + } ] ``` -*** +--- ## Read Audit Log by timestamp AuditLog must be enabled in the Harper configuration file to make this request. Returns the transactions logged for the specified database table between the specified time window. [Read more about Harper transaction logs here](./logs#read-transaction-log). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search\_type _(optional)_ - timestamp -* search\_values _(optional)_ - an array containing a maximum of two values \[`from_timestamp`, `to_timestamp`] defining the range of transactions you would like to view. - * Timestamp format is millisecond-based epoch in UTC - * If no items are supplied then all transactions are returned - * If only one entry is supplied then all transactions after the supplied timestamp will be returned +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search_type _(optional)_ - timestamp +- search_values _(optional)_ - an array containing a maximum of two values \[`from_timestamp`, `to_timestamp`] defining the range of transactions you would like to view. + - Timestamp format is millisecond-based epoch in UTC + - If no items are supplied then all transactions are returned + - If only one entry is supplied then all transactions after the supplied timestamp will be returned ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "timestamp", - "search_values": [ - 1660585740558, - 1660585759710.56 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "timestamp", + "search_values": [1660585740558, 1660585759710.56] } ``` @@ -435,129 +423,117 @@ _Operation is restricted to super\_user roles only_ ```json [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585716133.01, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660585740558.415, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "fur_type": "coarse", - "__updatedtime__": 1660585740556 - } - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "delete", - "user_name": "admin", - "timestamp": 1660585759710.56, - "hash_values": [ - 444 - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585740556, - "__createdtime__": 1660585716128, - "fur_type": "coarse" - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660586298457.224, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "fur_type": "super fluffy", - "__updatedtime__": 1660586298455 - } - ], - "original_records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - } + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "hash_values": [318], + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585716133.01, + "hash_values": [444], + "records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660585740558.415, + "hash_values": [444], + "records": [ + { + "id": 444, + "fur_type": "coarse", + "__updatedtime__": 1660585740556 + } + ], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "delete", + "user_name": "admin", + "timestamp": 1660585759710.56, + "hash_values": [444], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585740556, + "__createdtime__": 1660585716128, + "fur_type": "coarse" + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660586298457.224, + "hash_values": [318], + "records": [ + { + "id": 318, + "fur_type": "super fluffy", + "__updatedtime__": 1660586298455 + } + ], + "original_records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + } ] ``` -*** +--- ## Read Audit Log by username AuditLog must be enabled in the Harper configuration file to make this request. Returns the transactions logged for the specified database table which were committed by the specified user. [Read more about Harper transaction logs here](../../administration/logging/transaction-logging#read_transaction_log). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search\_type _(optional)_ - username -* search\_values _(optional)_ - the Harper user for whom you would like to view transactions +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search_type _(optional)_ - username +- search_values _(optional)_ - the Harper user for whom you would like to view transactions ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "username", - "search_values": [ - "admin" - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "username", + "search_values": ["admin"] } ``` @@ -565,131 +541,119 @@ _Operation is restricted to super\_user roles only_ ```json { - "admin": [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585716133.01, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660585740558.415, - "hash_values": [ - 444 - ], - "records": [ - { - "id": 444, - "fur_type": "coarse", - "__updatedtime__": 1660585740556 - } - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585716128, - "__createdtime__": 1660585716128 - } - ] - }, - { - "operation": "delete", - "user_name": "admin", - "timestamp": 1660585759710.56, - "hash_values": [ - 444 - ], - "original_records": [ - { - "id": 444, - "dog_name": "Davis", - "__updatedtime__": 1660585740556, - "__createdtime__": 1660585716128, - "fur_type": "coarse" - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660586298457.224, - "hash_values": [ - 318 - ], - "records": [ - { - "id": 318, - "fur_type": "super fluffy", - "__updatedtime__": 1660586298455 - } - ], - "original_records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - } - ] + "admin": [ + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "hash_values": [318], + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585716133.01, + "hash_values": [444], + "records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660585740558.415, + "hash_values": [444], + "records": [ + { + "id": 444, + "fur_type": "coarse", + "__updatedtime__": 1660585740556 + } + ], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585716128, + "__createdtime__": 1660585716128 + } + ] + }, + { + "operation": "delete", + "user_name": "admin", + "timestamp": 1660585759710.56, + "hash_values": [444], + "original_records": [ + { + "id": 444, + "dog_name": "Davis", + "__updatedtime__": 1660585740556, + "__createdtime__": 1660585716128, + "fur_type": "coarse" + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660586298457.224, + "hash_values": [318], + "records": [ + { + "id": 318, + "fur_type": "super fluffy", + "__updatedtime__": 1660586298455 + } + ], + "original_records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + } + ] } ``` -*** +--- -## Read Audit Log by hash\_value +## Read Audit Log by hash_value AuditLog must be enabled in the Harper configuration file to make this request. Returns the transactions logged for the specified database table which were committed to the specified hash value(s). [Read more about Harper transaction logs here](../../administration/logging/transaction-logging#read_transaction_log). -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `read_audit_log` -* schema _(required)_ - schema under which the transaction log resides -* table _(required)_ - table under which the transaction log resides -* search\_type _(optional)_ - hash\_value -* search\_values _(optional)_ - an array of hash\_attributes for which you wish to see transaction logs +- operation _(required)_ - must always be `read_audit_log` +- schema _(required)_ - schema under which the transaction log resides +- table _(required)_ - table under which the transaction log resides +- search_type _(optional)_ - hash_value +- search_values _(optional)_ - an array of hash_attributes for which you wish to see transaction logs ### Body ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog", - "search_type": "hash_value", - "search_values": [ - 318 - ] + "operation": "read_audit_log", + "schema": "dev", + "table": "dog", + "search_type": "hash_value", + "search_values": [318] } ``` @@ -697,65 +661,65 @@ _Operation is restricted to super\_user roles only_ ```json { - "318": [ - { - "operation": "insert", - "user_name": "admin", - "timestamp": 1660585635882.288, - "records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - }, - { - "operation": "update", - "user_name": "admin", - "timestamp": 1660586298457.224, - "records": [ - { - "id": 318, - "fur_type": "super fluffy", - "__updatedtime__": 1660586298455 - } - ], - "original_records": [ - { - "id": 318, - "dog_name": "Polliwog", - "__updatedtime__": 1660585635876, - "__createdtime__": 1660585635876 - } - ] - } - ] + "318": [ + { + "operation": "insert", + "user_name": "admin", + "timestamp": 1660585635882.288, + "records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + }, + { + "operation": "update", + "user_name": "admin", + "timestamp": 1660586298457.224, + "records": [ + { + "id": 318, + "fur_type": "super fluffy", + "__updatedtime__": 1660586298455 + } + ], + "original_records": [ + { + "id": 318, + "dog_name": "Polliwog", + "__updatedtime__": 1660585635876, + "__createdtime__": 1660585635876 + } + ] + } + ] } ``` -*** +--- ## Delete Audit Logs Before AuditLog must be enabled in the Harper configuration file to make this request. Deletes audit log data for the specified database table that is older than the specified timestamp. -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_audit_logs_before` -* schema _(required)_ - schema under which the transaction log resides. Must be a string -* table _(required)_ - table under which the transaction log resides. Must be a string -* timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC +- operation _(required)_ - must always be `delete_audit_logs_before` +- schema _(required)_ - schema under which the transaction log resides. Must be a string +- table _(required)_ - table under which the transaction log resides. Must be a string +- timestamp _(required)_ - records older than this date will be deleted. Format is millisecond-based epoch in UTC ### Body ```json { - "operation": "delete_audit_logs_before", - "schema": "dev", - "table": "dog", - "timestamp": 1660585759710.56 + "operation": "delete_audit_logs_before", + "schema": "dev", + "table": "dog", + "timestamp": 1660585759710.56 } ``` @@ -763,6 +727,6 @@ _Operation is restricted to super\_user roles only_ ```json { - "message": "Starting job with id 7479e5f8-a86e-4fc9-add7-749493bc100f" + "message": "Starting job with id 7479e5f8-a86e-4fc9-add7-749493bc100f" } ``` diff --git a/site/versioned_docs/version-4.5/developers/operations-api/nosql-operations.md b/site/versioned_docs/version-4.5/developers/operations-api/nosql-operations.md index 77959204..099ebbcd 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/nosql-operations.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/nosql-operations.md @@ -8,32 +8,32 @@ title: NoSQL Operations Adds one or more rows of data to a database table. Primary keys of the inserted JSON record may be supplied on insert. If a primary key is not provided, then a GUID or incremented number (depending on type) will be generated for each record. -* operation _(required)_ - must always be `insert` -* database _(optional)_ - database where the table you are inserting records into lives. The default is `data` -* table _(required)_ - table where you want to insert records -* records _(required)_ - array of one or more records for insert +- operation _(required)_ - must always be `insert` +- database _(optional)_ - database where the table you are inserting records into lives. The default is `data` +- table _(required)_ - table where you want to insert records +- records _(required)_ - array of one or more records for insert ### Body ```json { - "operation": "insert", - "database": "dev", - "table": "dog", - "records": [ - { - "id": 8, - "dog_name": "Harper", - "breed_id": 346, - "age": 7 - }, - { - "id": 9, - "dog_name": "Penny", - "breed_id": 154, - "age": 7 - } - ] + "operation": "insert", + "database": "dev", + "table": "dog", + "records": [ + { + "id": 8, + "dog_name": "Harper", + "breed_id": 346, + "age": 7 + }, + { + "id": 9, + "dog_name": "Penny", + "breed_id": 154, + "age": 7 + } + ] } ``` @@ -41,12 +41,9 @@ Adds one or more rows of data to a database table. Primary keys of the inserted ```json { - "message": "inserted 2 of 2 records", - "inserted_hashes": [ - 8, - 9 - ], - "skipped_hashes": [] + "message": "inserted 2 of 2 records", + "inserted_hashes": [8, 9], + "skipped_hashes": [] } ``` @@ -56,29 +53,29 @@ Adds one or more rows of data to a database table. Primary keys of the inserted Changes the values of specified attributes in one or more rows in a database table as identified by the primary key. NOTE: Primary key of the updated JSON record(s) MUST be supplied on update. -* operation _(required)_ - must always be `update` -* database _(optional)_ - database of the table you are updating records in. The default is `data` -* table _(required)_ - table where you want to update records -* records _(required)_ - array of one or more records for update +- operation _(required)_ - must always be `update` +- database _(optional)_ - database of the table you are updating records in. The default is `data` +- table _(required)_ - table where you want to update records +- records _(required)_ - array of one or more records for update ### Body ```json { - "operation": "update", - "database": "dev", - "table": "dog", - "records": [ - { - "id": 1, - "weight_lbs": 55 - }, - { - "id": 2, - "owner": "Kyle B", - "weight_lbs": 35 - } - ] + "operation": "update", + "database": "dev", + "table": "dog", + "records": [ + { + "id": 1, + "weight_lbs": 55 + }, + { + "id": 2, + "owner": "Kyle B", + "weight_lbs": 35 + } + ] } ``` @@ -86,12 +83,9 @@ Changes the values of specified attributes in one or more rows in a database tab ```json { - "message": "updated 2 of 2 records", - "update_hashes": [ - 1, - 3 - ], - "skipped_hashes": [] + "message": "updated 2 of 2 records", + "update_hashes": [1, 3], + "skipped_hashes": [] } ``` @@ -101,37 +95,37 @@ Changes the values of specified attributes in one or more rows in a database tab Changes the values of specified attributes for rows with matching primary keys that exist in the table. Adds rows to the database table for primary keys that do not exist or are not provided. -* operation _(required)_ - must always be `upsert` -* database _(optional)_ - database of the table you are updating records in. The default is `data` -* table _(required)_ - table where you want to update records -* records _(required)_ - array of one or more records for update +- operation _(required)_ - must always be `upsert` +- database _(optional)_ - database of the table you are updating records in. The default is `data` +- table _(required)_ - table where you want to update records +- records _(required)_ - array of one or more records for update ### Body ```json { - "operation": "upsert", - "database": "dev", - "table": "dog", - "records": [ - { - "id": 8, - "weight_lbs": 155 - }, - { - "name": "Bill", - "breed": "Pit Bull", - "id": 10, - "Age": 11, - "weight_lbs": 155 - }, - { - "name": "Harper", - "breed": "Mutt", - "age": 5, - "weight_lbs": 155 - } - ] + "operation": "upsert", + "database": "dev", + "table": "dog", + "records": [ + { + "id": 8, + "weight_lbs": 155 + }, + { + "name": "Bill", + "breed": "Pit Bull", + "id": 10, + "Age": 11, + "weight_lbs": 155 + }, + { + "name": "Harper", + "breed": "Mutt", + "age": 5, + "weight_lbs": 155 + } + ] } ``` @@ -139,12 +133,8 @@ Changes the values of specified attributes for rows with matching primary keys t ```json { - "message": "upserted 3 of 3 records", - "upserted_hashes": [ - 8, - 10, - "ea06fc8e-717b-4c6c-b69d-b29014054ab7" - ] + "message": "upserted 3 of 3 records", + "upserted_hashes": [8, 10, "ea06fc8e-717b-4c6c-b69d-b29014054ab7"] } ``` @@ -154,22 +144,19 @@ Changes the values of specified attributes for rows with matching primary keys t Removes one or more rows of data from a specified table. -* operation _(required)_ - must always be `delete` -* database _(optional)_ - database where the table you are deleting records lives. The default is `data` -* table _(required)_ - table where you want to deleting records -* ids _(required)_ - array of one or more primary key values, which identifies records to delete +- operation _(required)_ - must always be `delete` +- database _(optional)_ - database where the table you are deleting records lives. The default is `data` +- table _(required)_ - table where you want to deleting records +- ids _(required)_ - array of one or more primary key values, which identifies records to delete ### Body ```json { - "operation": "delete", - "database": "dev", - "table": "dog", - "ids": [ - 1, - 2 - ] + "operation": "delete", + "database": "dev", + "table": "dog", + "ids": [1, 2] } ``` @@ -177,12 +164,9 @@ Removes one or more rows of data from a specified table. ```json { - "message": "2 of 2 records successfully deleted", - "deleted_hashes": [ - 1, - 2 - ], - "skipped_hashes": [] + "message": "2 of 2 records successfully deleted", + "deleted_hashes": [1, 2], + "skipped_hashes": [] } ``` @@ -192,27 +176,21 @@ Removes one or more rows of data from a specified table. Returns data from a table for one or more primary keys. -* operation _(required)_ - must always be `search_by_id` -* database _(optional)_ - database where the table you are searching lives. The default is `data` -* table _(required)_ - table you wish to search -* ids _(required)_ - array of primary keys to retrieve -* get_attributes _(required)_ - define which attributes you want returned. _Use `['*']` to return all attributes_ +- operation _(required)_ - must always be `search_by_id` +- database _(optional)_ - database where the table you are searching lives. The default is `data` +- table _(required)_ - table you wish to search +- ids _(required)_ - array of primary keys to retrieve +- get*attributes *(required)_ - define which attributes you want returned. \_Use `['*']` to return all attributes_ ### Body ```json { - "operation": "search_by_id", - "database": "dev", - "table": "dog", - "ids": [ - 1, - 2 - ], - "get_attributes": [ - "dog_name", - "breed_id" - ] + "operation": "search_by_id", + "database": "dev", + "table": "dog", + "ids": [1, 2], + "get_attributes": ["dog_name", "breed_id"] } ``` @@ -220,14 +198,14 @@ Returns data from a table for one or more primary keys. ```json [ - { - "dog_name": "Penny", - "breed_id": 154 - }, - { - "dog_name": "Harper", - "breed_id": 346 - } + { + "dog_name": "Penny", + "breed_id": 154 + }, + { + "dog_name": "Harper", + "breed_id": 346 + } ] ``` @@ -237,26 +215,23 @@ Returns data from a table for one or more primary keys. Returns data from a table for a matching value. -* operation _(required)_ - must always be `search_by_value` -* database _(optional)_ - database where the table you are searching lives. The default is `data` -* table _(required)_ - table you wish to search -* search_attribute _(required)_ - attribute you wish to search can be any attribute -* search_value _(required)_ - value you wish to search - wild cards are allowed -* get_attributes _(required)_ - define which attributes you want returned. Use `['*']` to return all attributes +- operation _(required)_ - must always be `search_by_value` +- database _(optional)_ - database where the table you are searching lives. The default is `data` +- table _(required)_ - table you wish to search +- search*attribute *(required)\_ - attribute you wish to search can be any attribute +- search*value *(required)\_ - value you wish to search - wild cards are allowed +- get*attributes *(required)\_ - define which attributes you want returned. Use `['*']` to return all attributes ### Body ```json { - "operation": "search_by_value", - "database": "dev", - "table": "dog", - "search_attribute": "owner_name", - "search_value": "Ky*", - "get_attributes": [ - "id", - "dog_name" - ] + "operation": "search_by_value", + "database": "dev", + "table": "dog", + "search_attribute": "owner_name", + "search_value": "Ky*", + "get_attributes": ["id", "dog_name"] } ``` @@ -264,12 +239,12 @@ Returns data from a table for a matching value. ```json [ - { - "dog_name": "Penny" - }, - { - "dog_name": "Kato" - } + { + "dog_name": "Penny" + }, + { + "dog_name": "Kato" + } ] ``` @@ -279,74 +254,70 @@ Returns data from a table for a matching value. Returns data from a table for one or more matching conditions. This supports grouping of conditions to indicate order of operations as well. -* operation _(required)_ - must always be `search_by_conditions` -* database _(optional)_ - database where the table you are searching lives. The default is `data` -* table _(required)_ - table you wish to search -* operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` -* offset _(optional)_ - the number of records that the query results will skip. The default is `0` -* limit _(optional)_ - the number of records that the query results will include. The default is `null`, resulting in no limit -* sort _optional_ - This is an object that indicates the sort order. It has the following properties: - * attribute _(required)_ - The attribute to sort by - * descending _(optional)_ - If true, will sort in descending order (defaults to ascending order) - * next _(optional)_ - This can define the next sort object that will be used to break ties for sorting when there are multiple records with the same value for the first attribute (follows the same structure as `sort`, and can recursive additional attributes). -* get_attributes _(required)_ - define which attributes you want returned. Use `['*']` to return all attributes -* conditions _(required)_ - the array of conditions objects, specified below, to filter by. Must include one or more object in the array that are a condition or a grouped set of conditions. A condition has the following properties: - * search_attribute _(required)_ - the attribute you wish to search, can be any attribute - * search_type _(required)_ - the type of search to perform - `equals`, `contains`, `starts_with`, `ends_with`, `greater_than`, `greater_than_equal`, `less_than`, `less_than_equal`, `between` - * search_value _(required)_ - case-sensitive value you wish to search. If the `search_type` is `between` then use an array of two values to search between - Or a set of grouped conditions has the following properties: - * operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` - * conditions _(required)_ - the array of conditions objects as described above. +- operation _(required)_ - must always be `search_by_conditions` +- database _(optional)_ - database where the table you are searching lives. The default is `data` +- table _(required)_ - table you wish to search +- operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` +- offset _(optional)_ - the number of records that the query results will skip. The default is `0` +- limit _(optional)_ - the number of records that the query results will include. The default is `null`, resulting in no limit +- sort _optional_ - This is an object that indicates the sort order. It has the following properties: + - attribute _(required)_ - The attribute to sort by + - descending _(optional)_ - If true, will sort in descending order (defaults to ascending order) + - next _(optional)_ - This can define the next sort object that will be used to break ties for sorting when there are multiple records with the same value for the first attribute (follows the same structure as `sort`, and can recursive additional attributes). +- get*attributes *(required)\_ - define which attributes you want returned. Use `['*']` to return all attributes +- conditions _(required)_ - the array of conditions objects, specified below, to filter by. Must include one or more object in the array that are a condition or a grouped set of conditions. A condition has the following properties: + - search*attribute *(required)\_ - the attribute you wish to search, can be any attribute + - search*type *(required)\_ - the type of search to perform - `equals`, `contains`, `starts_with`, `ends_with`, `greater_than`, `greater_than_equal`, `less_than`, `less_than_equal`, `between` + - search*value *(required)\_ - case-sensitive value you wish to search. If the `search_type` is `between` then use an array of two values to search between + Or a set of grouped conditions has the following properties: + - operator _(optional)_ - the operator used between each condition - `and`, `or`. The default is `and` + - conditions _(required)_ - the array of conditions objects as described above. + ### Body ```json { - "operation": "search_by_conditions", - "database": "dev", - "table": "dog", - "operator": "and", - "offset": 0, - "limit": 10, - "sort": { - "attribute": "id", - "next": { - "dog_name": "age", - "descending": true - } - }, - "get_attributes": [ - "*" - ], - "conditions": [ - { - "search_attribute": "age", - "search_type": "between", - "search_value": [ - 5, - 8 - ] - }, - { - "search_attribute": "weight_lbs", - "search_type": "greater_than", - "search_value": 40 - }, - { - "operator": "or", - "conditions": [ - { - "search_attribute": "adorable", - "search_type": "equals", - "search_value": true - }, - { - "search_attribute": "lovable", - "search_type": "equals", - "search_value": true - } - ] - } - ] + "operation": "search_by_conditions", + "database": "dev", + "table": "dog", + "operator": "and", + "offset": 0, + "limit": 10, + "sort": { + "attribute": "id", + "next": { + "dog_name": "age", + "descending": true + } + }, + "get_attributes": ["*"], + "conditions": [ + { + "search_attribute": "age", + "search_type": "between", + "search_value": [5, 8] + }, + { + "search_attribute": "weight_lbs", + "search_type": "greater_than", + "search_value": 40 + }, + { + "operator": "or", + "conditions": [ + { + "search_attribute": "adorable", + "search_type": "equals", + "search_value": true + }, + { + "search_attribute": "lovable", + "search_type": "equals", + "search_value": true + } + ] + } + ] } ``` @@ -354,60 +325,60 @@ Returns data from a table for one or more matching conditions. This supports gro ```json [ - { - "__createdtime__": 1620227719791, - "__updatedtime__": 1620227719791, - "adorable": true, - "age": 7, - "breed_id": 346, - "dog_name": "Harper", - "id": 2, - "owner_name": "Stephen", - "weight_lbs": 55 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 7, - "breed_id": 348, - "dog_name": "Alby", - "id": 3, - "owner_name": "Kaylan", - "weight_lbs": 84 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 6, - "breed_id": 347, - "dog_name": "Billy", - "id": 4, - "owner_name": "Zach", - "weight_lbs": 60 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 5, - "breed_id": 250, - "dog_name": "Gemma", - "id": 8, - "owner_name": "Stephen", - "weight_lbs": 55 - }, - { - "__createdtime__": 1620227719792, - "__updatedtime__": 1620227719792, - "adorable": true, - "age": 8, - "breed_id": 104, - "dog_name": "Bode", - "id": 11, - "owner_name": "Margo", - "weight_lbs": 75 - } + { + "__createdtime__": 1620227719791, + "__updatedtime__": 1620227719791, + "adorable": true, + "age": 7, + "breed_id": 346, + "dog_name": "Harper", + "id": 2, + "owner_name": "Stephen", + "weight_lbs": 55 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 7, + "breed_id": 348, + "dog_name": "Alby", + "id": 3, + "owner_name": "Kaylan", + "weight_lbs": 84 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 6, + "breed_id": 347, + "dog_name": "Billy", + "id": 4, + "owner_name": "Zach", + "weight_lbs": 60 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 5, + "breed_id": 250, + "dog_name": "Gemma", + "id": 8, + "owner_name": "Stephen", + "weight_lbs": 55 + }, + { + "__createdtime__": 1620227719792, + "__updatedtime__": 1620227719792, + "adorable": true, + "age": 8, + "breed_id": 104, + "dog_name": "Bode", + "id": 11, + "owner_name": "Margo", + "weight_lbs": 75 + } ] ``` diff --git a/site/versioned_docs/version-4.5/developers/operations-api/quickstart-examples.md b/site/versioned_docs/version-4.5/developers/operations-api/quickstart-examples.md index 109d9cc8..a6c8f637 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/quickstart-examples.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/quickstart-examples.md @@ -4,13 +4,13 @@ title: Quick Start Examples # Quick Start Examples -Harper recommends utilizing [Harper Applications](../../developers/applications/) for defining databases, tables, and other functionality. However, this guide is a great way to get started using on the Harper Operations API. +Harper recommends utilizing [Harper Applications](../../developers/applications/) for defining databases, tables, and other functionality. However, this guide is a great way to get started using on the Harper Operations API. ## Create dog Table We first need to create a table. Since our company is named after our CEO's dog, lets create a table to store all our employees' dogs. We'll call this table, `dogs`. -Tables in Harper are schema-less, so we don't need to add any attributes other than a primary_key (in pre 4.2 versions this was referred to as the hash_attribute) to create this table. +Tables in Harper are schema-less, so we don't need to add any attributes other than a primary_key (in pre 4.2 versions this was referred to as the hash_attribute) to create this table. Harper does offer a `database` parameter that can be used to hold logical groupings of tables. The parameter is optional and if not provided the operation will default to using a database named `data`. @@ -20,9 +20,9 @@ If you receive an error response, make sure your Basic Authentication user and p ```json { - "operation": "create_table", - "table": "dog", - "primary_key": "id" + "operation": "create_table", + "table": "dog", + "primary_key": "id" } ``` @@ -30,22 +30,23 @@ If you receive an error response, make sure your Basic Authentication user and p ```json { - "message": "table 'data.dog' successfully created." + "message": "table 'data.dog' successfully created." } ``` --- ## Create breed Table + Now that we have a table to store our dog data, we also want to create a table to track known breeds. Just as with the dog table, the only attribute we need to specify is the `primary_key`. ### Body ```json { - "operation": "create_table", - "table": "breed", - "primary_key": "id" + "operation": "create_table", + "table": "breed", + "primary_key": "id" } ``` @@ -53,7 +54,7 @@ Now that we have a table to store our dog data, we also want to create a table t ```json { - "message": "table 'data.breed' successfully created." + "message": "table 'data.breed' successfully created." } ``` @@ -67,18 +68,18 @@ We're ready to add some dog data. Penny is our CTO's pup, so she gets ID 1 or we ```json { - "operation": "insert", - "table": "dog", - "records": [ - { - "id": 1, - "dog_name": "Penny", - "owner_name": "Kyle", - "breed_id": 154, - "age": 7, - "weight_lbs": 38 - } - ] + "operation": "insert", + "table": "dog", + "records": [ + { + "id": 1, + "dog_name": "Penny", + "owner_name": "Kyle", + "breed_id": 154, + "age": 7, + "weight_lbs": 38 + } + ] } ``` @@ -86,11 +87,9 @@ We're ready to add some dog data. Penny is our CTO's pup, so she gets ID 1 or we ```json { - "message": "inserted 1 of 1 records", - "inserted_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "inserted 1 of 1 records", + "inserted_hashes": [1], + "skipped_hashes": [] } ``` @@ -104,118 +103,118 @@ Let's add some more Harper doggies! We can add as many dog objects as we want in ```json { - "operation": "insert", - "table": "dog", - "records": [ - { - "id": 2, - "dog_name": "Harper", - "owner_name": "Stephen", - "breed_id": 346, - "age": 7, - "weight_lbs": 55, - "adorable": true - }, - { - "id": 3, - "dog_name": "Alby", - "owner_name": "Kaylan", - "breed_id": 348, - "age": 7, - "weight_lbs": 84, - "adorable": true - }, - { - "id": 4, - "dog_name": "Billy", - "owner_name": "Zach", - "breed_id": 347, - "age": 6, - "weight_lbs": 60, - "adorable": true - }, - { - "id": 5, - "dog_name": "Rose Merry", - "owner_name": "Zach", - "breed_id": 348, - "age": 8, - "weight_lbs": 15, - "adorable": true - }, - { - "id": 6, - "dog_name": "Kato", - "owner_name": "Kyle", - "breed_id": 351, - "age": 6, - "weight_lbs": 32, - "adorable": true - }, - { - "id": 7, - "dog_name": "Simon", - "owner_name": "Fred", - "breed_id": 349, - "age": 3, - "weight_lbs": 35, - "adorable": true - }, - { - "id": 8, - "dog_name": "Gemma", - "owner_name": "Stephen", - "breed_id": 350, - "age": 5, - "weight_lbs": 55, - "adorable": true - }, - { - "id": 9, - "dog_name": "Yeti", - "owner_name": "Jaxon", - "breed_id": 200, - "age": 5, - "weight_lbs": 55, - "adorable": true - }, - { - "id": 10, - "dog_name": "Monkey", - "owner_name": "Aron", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true - }, - { - "id": 11, - "dog_name": "Bode", - "owner_name": "Margo", - "breed_id": 104, - "age": 8, - "weight_lbs": 75, - "adorable": true - }, - { - "id": 12, - "dog_name": "Tucker", - "owner_name": "David", - "breed_id": 346, - "age": 2, - "weight_lbs": 60, - "adorable": true - }, - { - "id": 13, - "dog_name": "Jagger", - "owner_name": "Margo", - "breed_id": 271, - "age": 7, - "weight_lbs": 35, - "adorable": true - } - ] + "operation": "insert", + "table": "dog", + "records": [ + { + "id": 2, + "dog_name": "Harper", + "owner_name": "Stephen", + "breed_id": 346, + "age": 7, + "weight_lbs": 55, + "adorable": true + }, + { + "id": 3, + "dog_name": "Alby", + "owner_name": "Kaylan", + "breed_id": 348, + "age": 7, + "weight_lbs": 84, + "adorable": true + }, + { + "id": 4, + "dog_name": "Billy", + "owner_name": "Zach", + "breed_id": 347, + "age": 6, + "weight_lbs": 60, + "adorable": true + }, + { + "id": 5, + "dog_name": "Rose Merry", + "owner_name": "Zach", + "breed_id": 348, + "age": 8, + "weight_lbs": 15, + "adorable": true + }, + { + "id": 6, + "dog_name": "Kato", + "owner_name": "Kyle", + "breed_id": 351, + "age": 6, + "weight_lbs": 32, + "adorable": true + }, + { + "id": 7, + "dog_name": "Simon", + "owner_name": "Fred", + "breed_id": 349, + "age": 3, + "weight_lbs": 35, + "adorable": true + }, + { + "id": 8, + "dog_name": "Gemma", + "owner_name": "Stephen", + "breed_id": 350, + "age": 5, + "weight_lbs": 55, + "adorable": true + }, + { + "id": 9, + "dog_name": "Yeti", + "owner_name": "Jaxon", + "breed_id": 200, + "age": 5, + "weight_lbs": 55, + "adorable": true + }, + { + "id": 10, + "dog_name": "Monkey", + "owner_name": "Aron", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true + }, + { + "id": 11, + "dog_name": "Bode", + "owner_name": "Margo", + "breed_id": 104, + "age": 8, + "weight_lbs": 75, + "adorable": true + }, + { + "id": 12, + "dog_name": "Tucker", + "owner_name": "David", + "breed_id": 346, + "age": 2, + "weight_lbs": 60, + "adorable": true + }, + { + "id": 13, + "dog_name": "Jagger", + "owner_name": "Margo", + "breed_id": 271, + "age": 7, + "weight_lbs": 35, + "adorable": true + } + ] } ``` @@ -223,22 +222,9 @@ Let's add some more Harper doggies! We can add as many dog objects as we want in ```json { - "message": "inserted 12 of 12 records", - "inserted_hashes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13 - ], - "skipped_hashes": [] + "message": "inserted 12 of 12 records", + "inserted_hashes": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], + "skipped_hashes": [] } ``` @@ -254,9 +240,9 @@ Each header in a column will be considered as an attribute, and each row in the ```json { - "operation": "csv_url_load", - "table": "breed", - "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" + "operation": "csv_url_load", + "table": "breed", + "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" } ``` @@ -264,8 +250,8 @@ Each header in a column will be considered as an attribute, and each row in the ```json { - "message": "Starting job with id e77d63b9-70d5-499c-960f-6736718a4369", - "job_id": "e77d63b9-70d5-499c-960f-6736718a4369" + "message": "Starting job with id e77d63b9-70d5-499c-960f-6736718a4369", + "job_id": "e77d63b9-70d5-499c-960f-6736718a4369" } ``` @@ -279,14 +265,14 @@ Harper supports NoSQL and SQL commands. We're going to update the dog table to s ```json { - "operation": "update", - "table": "dog", - "records": [ - { - "id": 1, - "dog_name": "Penny B" - } - ] + "operation": "update", + "table": "dog", + "records": [ + { + "id": 1, + "dog_name": "Penny B" + } + ] } ``` @@ -294,11 +280,9 @@ Harper supports NoSQL and SQL commands. We're going to update the dog table to s ```json { - "message": "updated 1 of 1 records", - "update_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "updated 1 of 1 records", + "update_hashes": [1], + "skipped_hashes": [] } ``` @@ -312,8 +296,8 @@ Now we're going to use a simple SQL SELECT call to pull Penny's updated data. No ```json { - "operation": "sql", - "sql": "SELECT * FROM data.dog where id = 1" + "operation": "sql", + "sql": "SELECT * FROM data.dog where id = 1" } ``` @@ -321,17 +305,17 @@ Now we're going to use a simple SQL SELECT call to pull Penny's updated data. No ```json [ - { - "owner_name": "Kyle", - "adorable": null, - "breed_id": 154, - "__updatedtime__": 1610749428575, - "dog_name": "Penny B", - "weight_lbs": 38, - "id": 1, - "age": 7, - "__createdtime__": 1610749386566 - } + { + "owner_name": "Kyle", + "adorable": null, + "breed_id": 154, + "__updatedtime__": 1610749428575, + "dog_name": "Penny B", + "weight_lbs": 38, + "id": 1, + "age": 7, + "__createdtime__": 1610749386566 + } ] ``` @@ -345,8 +329,8 @@ Here's a more complex SQL command joining the breed table with the dog table. We ```json { - "operation": "sql", - "sql": "SELECT d.id, d.dog_name, d.owner_name, b.name, b.section FROM data.dog AS d INNER JOIN data.breed AS b ON d.breed_id = b.id WHERE d.owner_name IN ('Kyle', 'Zach', 'Stephen') AND b.section = 'Mutt' ORDER BY d.dog_name" + "operation": "sql", + "sql": "SELECT d.id, d.dog_name, d.owner_name, b.name, b.section FROM data.dog AS d INNER JOIN data.breed AS b ON d.breed_id = b.id WHERE d.owner_name IN ('Kyle', 'Zach', 'Stephen') AND b.section = 'Mutt' ORDER BY d.dog_name" } ``` @@ -354,34 +338,33 @@ Here's a more complex SQL command joining the breed table with the dog table. We ```json [ - { - "id": 4, - "dog_name": "Billy", - "owner_name": "Zach", - "name": "LABRADOR / GREAT DANE MIX", - "section": "Mutt" - }, - { - "id": 8, - "dog_name": "Gemma", - "owner_name": "Stephen", - "name": "SHORT HAIRED SETTER MIX", - "section": "Mutt" - }, - { - "id": 2, - "dog_name": "Harper", - "owner_name": "Stephen", - "name": "HUSKY MIX", - "section": "Mutt" - }, - { - "id": 5, - "dog_name": "Rose Merry", - "owner_name": "Zach", - "name": "TERRIER MIX", - "section": "Mutt" - } + { + "id": 4, + "dog_name": "Billy", + "owner_name": "Zach", + "name": "LABRADOR / GREAT DANE MIX", + "section": "Mutt" + }, + { + "id": 8, + "dog_name": "Gemma", + "owner_name": "Stephen", + "name": "SHORT HAIRED SETTER MIX", + "section": "Mutt" + }, + { + "id": 2, + "dog_name": "Harper", + "owner_name": "Stephen", + "name": "HUSKY MIX", + "section": "Mutt" + }, + { + "id": 5, + "dog_name": "Rose Merry", + "owner_name": "Zach", + "name": "TERRIER MIX", + "section": "Mutt" + } ] - ``` diff --git a/site/versioned_docs/version-4.5/developers/operations-api/registration.md b/site/versioned_docs/version-4.5/developers/operations-api/registration.md index 366b0189..56775c5d 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/registration.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/registration.md @@ -1,16 +1,17 @@ --- -title: Registration +title: Registration --- -# Registration - +# Registration ## Registration Info + Returns the registration data of the Harper instance. -* operation _(required)_ - must always be `registration_info` +- operation _(required)_ - must always be `registration_info` ### Body + ```json { "operation": "registration_info" @@ -18,50 +19,52 @@ Returns the registration data of the Harper instance. ``` ### Response: 200 + ```json { - "registered": true, - "version": "4.2.0", - "ram_allocation": 2048, - "license_expiration_date": "2022-01-15" + "registered": true, + "version": "4.2.0", + "ram_allocation": 2048, + "license_expiration_date": "2022-01-15" } ``` --- ## Get Fingerprint + Returns the Harper fingerprint, uniquely generated based on the machine, for licensing purposes. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_fingerprint` +- operation _(required)_ - must always be `get_fingerprint` ### Body ```json { - "operation": "get_fingerprint" + "operation": "get_fingerprint" } ``` --- ## Set License + Sets the Harper license as generated by Harper License Management software. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_license` -* key _(required)_ - your license key -* company _(required)_ - the company that was used in the license +- operation _(required)_ - must always be `set_license` +- key _(required)_ - your license key +- company _(required)_ - the company that was used in the license ### Body ```json { - "operation": "set_license", - "key": "", - "company": "" + "operation": "set_license", + "key": "", + "company": "" } ``` - diff --git a/site/versioned_docs/version-4.5/developers/operations-api/sql-operations.md b/site/versioned_docs/version-4.5/developers/operations-api/sql-operations.md index 9fcc6fb4..71dfa436 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/sql-operations.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/sql-operations.md @@ -1,122 +1,127 @@ --- -title: SQL Operations +title: SQL Operations --- :::warning Harper encourages developers to utilize other querying tools over SQL for performance purposes. Harper SQL is intended for data investigation purposes and uses cases where performance is not a priority. SQL optimizations are on our roadmap for the future. ::: -# SQL Operations +# SQL Operations ## Select + Executes the provided SQL statement. The SELECT statement is used to query data from the database. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body ```json { - "operation": "sql", - "sql": "SELECT * FROM dev.dog WHERE id = 1" + "operation": "sql", + "sql": "SELECT * FROM dev.dog WHERE id = 1" } ``` ### Response: 200 + ```json [ - { - "id": 1, - "age": 7, - "dog_name": "Penny", - "weight_lbs": 38, - "breed_id": 154, - "owner_name": "Kyle", - "adorable": true, - "__createdtime__": 1611614106043, - "__updatedtime__": 1611614119507 - } + { + "id": 1, + "age": 7, + "dog_name": "Penny", + "weight_lbs": 38, + "breed_id": 154, + "owner_name": "Kyle", + "adorable": true, + "__createdtime__": 1611614106043, + "__updatedtime__": 1611614119507 + } ] ``` --- ## Insert + Executes the provided SQL statement. The INSERT statement is used to add one or more rows to a database table. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body ```json { - "operation": "sql", - "sql": "INSERT INTO dev.dog (id, dog_name) VALUE (22, 'Simon')" + "operation": "sql", + "sql": "INSERT INTO dev.dog (id, dog_name) VALUE (22, 'Simon')" } ``` ### Response: 200 + ```json { - "message": "inserted 1 of 1 records", - "inserted_hashes": [ - 22 - ], - "skipped_hashes": [] + "message": "inserted 1 of 1 records", + "inserted_hashes": [22], + "skipped_hashes": [] } ``` + --- ## Update + Executes the provided SQL statement. The UPDATE statement is used to change the values of specified attributes in one or more rows in a database table. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body + ```json { - "operation": "sql", - "sql": "UPDATE dev.dog SET dog_name = 'penelope' WHERE id = 1" + "operation": "sql", + "sql": "UPDATE dev.dog SET dog_name = 'penelope' WHERE id = 1" } ``` ### Response: 200 + ```json { - "message": "updated 1 of 1 records", - "update_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "updated 1 of 1 records", + "update_hashes": [1], + "skipped_hashes": [] } ``` --- ## Delete + Executes the provided SQL statement. The DELETE statement is used to remove one or more rows of data from a database table. -* operation _(required)_ - must always be `sql` -* sql _(required)_ - use standard SQL +- operation _(required)_ - must always be `sql` +- sql _(required)_ - use standard SQL ### Body + ```json { - "operation": "sql", - "sql": "DELETE FROM dev.dog WHERE id = 1" + "operation": "sql", + "sql": "DELETE FROM dev.dog WHERE id = 1" } ``` ### Response: 200 + ```json { - "message": "1 of 1 record successfully deleted", - "deleted_hashes": [ - 1 - ], - "skipped_hashes": [] + "message": "1 of 1 record successfully deleted", + "deleted_hashes": [1], + "skipped_hashes": [] } ``` diff --git a/site/versioned_docs/version-4.5/developers/operations-api/token-authentication.md b/site/versioned_docs/version-4.5/developers/operations-api/token-authentication.md index 161c69b5..b9ff5b31 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/token-authentication.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/token-authentication.md @@ -1,54 +1,60 @@ --- -title: Token Authentication +title: Token Authentication --- -# Token Authentication +# Token Authentication ## Create Authentication Tokens + Creates the tokens needed for authentication: operation & refresh token. _Note - this operation does not require authorization to be set_ -* operation _(required)_ - must always be `create_authentication_tokens` -* username _(required)_ - username of user to generate tokens for -* password _(required)_ - password of user to generate tokens for +- operation _(required)_ - must always be `create_authentication_tokens` +- username _(required)_ - username of user to generate tokens for +- password _(required)_ - password of user to generate tokens for ### Body + ```json { - "operation": "create_authentication_tokens", - "username": "", - "password": "" + "operation": "create_authentication_tokens", + "username": "", + "password": "" } ``` ### Response: 200 + ```json { - "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA1MTUwMzQ5LCJzdWIiOiJvcGVyYXRpb24ifQ.TlV93BqavQVQntXTt_WeY5IjAuCshfd6RzhihLWFWhu1qEKLHdwg9o5Z4ASaNmfuyKBqbFw65IbOYKd348EXeC_T6d0GO3yUhICYWXkqhQnxVW_T-ECKc7m5Bty9HTgfeaJ2e2yW55nbZYWG_gLtNgObUjCziX20-gGGR25sNTRm78mLQPYQkBJph6WXwAuyQrX704h0NfvNqyAZSwjxgtjuuEftTJ7FutLrQSLGIBIYq9nsHrFkheiDSn-C8_WKJ_zATa4YIofjqn9g5wA6o_7kSNaU2-gWnCm_jbcAcfvOmXh6rd89z8pwPqnC0f131qHIBps9UHaC1oozzmu_C6bsg7905OoAdFFY42Vojs98SMbfRApRvwaS4SprBsam3izODNI64ZUBREu3l4SZDalUf2kN8XPVWkI1LKq_mZsdtqr1r11Z9xslI1wVdxjunYeanjBhs7_j2HTX7ieVGn1a23cWceUk8F1HDGe_KEuPQs03R73V8acq_freh-kPhIa4eLqmcHeBw3WcyNGW8GuP8kyQRkGuO5sQSzZqbr_YSbZdSShZWTWDE6RYYC9ZV9KJtHVxhs0hexUpcoqO8OtJocyltRjtDjhSm9oUxszYRaALu-h8YadZT9dEKzsyQIt30d7LS9ETmmGWx4nKSTME2bV21PnDv_rEc5R6gnE", - "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA3NjU1OTQ5LCJzdWIiOiJyZWZyZXNoIn0.znhJhkdSROBPP_GLRzAxYdjgQ3BuqpAbQB7zMSSOQJ3s83HnmZ10Bnpw_3L2aF-tOFgz_t6HUAvn26fNOLsspJD2aOvHPcVS4yLKS5nagpA6ar_pqng9f6Ebfs8ohguLCfHnHRJ8poLxuWRvWW9_9pIlDiwsj4yo3Mbxi3mW8Bbtnk2MwiNHFxTksD12Ne8EWz8q2jic5MjArqBBgR373oYoWU1oxpTM6gIsZCBRowXcc9XFy2vyRoggEUU4ISRFQ4ZY9ayJ-_jleSDCUamJSNQsdb1OUTvc6CxeYlLjCoV0ijRUB6p2XWNVezFhDu8yGqOeyGFJzArhxbVc_pl4UYd5aUVxhrO9DdhG29cY_mHV0FqfXphR9QllK--LJFTP4aFqkCxnVr7HSa17hL0ZVK1HaKrx21PAdCkVNZpD6J3RtRbTkfnIB_C3Be9jhOV3vpTf7ZGn_Bs3CPJi_sL313Z1yKSDAS5rXTPceEOcTPHjzkMP9Wz19KfFq_0kuiZdDmeYNqJeFPAgGJ-S0tO51krzyGqLyCCA32_W104GR8OoQi2gEED6HIx2G0-1rnLnefN6eHQiY5r-Q3Oj9e2y3EvqqgWOmEDw88-SjPTwQVnMbBHYN2RfluU7EmvDh6Saoe79Lhlu8ZeSJ1x6ZgA8-Cirraz1_526Tn8v5FGDfrc" + "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA1MTUwMzQ5LCJzdWIiOiJvcGVyYXRpb24ifQ.TlV93BqavQVQntXTt_WeY5IjAuCshfd6RzhihLWFWhu1qEKLHdwg9o5Z4ASaNmfuyKBqbFw65IbOYKd348EXeC_T6d0GO3yUhICYWXkqhQnxVW_T-ECKc7m5Bty9HTgfeaJ2e2yW55nbZYWG_gLtNgObUjCziX20-gGGR25sNTRm78mLQPYQkBJph6WXwAuyQrX704h0NfvNqyAZSwjxgtjuuEftTJ7FutLrQSLGIBIYq9nsHrFkheiDSn-C8_WKJ_zATa4YIofjqn9g5wA6o_7kSNaU2-gWnCm_jbcAcfvOmXh6rd89z8pwPqnC0f131qHIBps9UHaC1oozzmu_C6bsg7905OoAdFFY42Vojs98SMbfRApRvwaS4SprBsam3izODNI64ZUBREu3l4SZDalUf2kN8XPVWkI1LKq_mZsdtqr1r11Z9xslI1wVdxjunYeanjBhs7_j2HTX7ieVGn1a23cWceUk8F1HDGe_KEuPQs03R73V8acq_freh-kPhIa4eLqmcHeBw3WcyNGW8GuP8kyQRkGuO5sQSzZqbr_YSbZdSShZWTWDE6RYYC9ZV9KJtHVxhs0hexUpcoqO8OtJocyltRjtDjhSm9oUxszYRaALu-h8YadZT9dEKzsyQIt30d7LS9ETmmGWx4nKSTME2bV21PnDv_rEc5R6gnE", + "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkhEQl9BRE1JTiIsImlhdCI6MTYwNTA2Mzk0OSwiZXhwIjoxNjA3NjU1OTQ5LCJzdWIiOiJyZWZyZXNoIn0.znhJhkdSROBPP_GLRzAxYdjgQ3BuqpAbQB7zMSSOQJ3s83HnmZ10Bnpw_3L2aF-tOFgz_t6HUAvn26fNOLsspJD2aOvHPcVS4yLKS5nagpA6ar_pqng9f6Ebfs8ohguLCfHnHRJ8poLxuWRvWW9_9pIlDiwsj4yo3Mbxi3mW8Bbtnk2MwiNHFxTksD12Ne8EWz8q2jic5MjArqBBgR373oYoWU1oxpTM6gIsZCBRowXcc9XFy2vyRoggEUU4ISRFQ4ZY9ayJ-_jleSDCUamJSNQsdb1OUTvc6CxeYlLjCoV0ijRUB6p2XWNVezFhDu8yGqOeyGFJzArhxbVc_pl4UYd5aUVxhrO9DdhG29cY_mHV0FqfXphR9QllK--LJFTP4aFqkCxnVr7HSa17hL0ZVK1HaKrx21PAdCkVNZpD6J3RtRbTkfnIB_C3Be9jhOV3vpTf7ZGn_Bs3CPJi_sL313Z1yKSDAS5rXTPceEOcTPHjzkMP9Wz19KfFq_0kuiZdDmeYNqJeFPAgGJ-S0tO51krzyGqLyCCA32_W104GR8OoQi2gEED6HIx2G0-1rnLnefN6eHQiY5r-Q3Oj9e2y3EvqqgWOmEDw88-SjPTwQVnMbBHYN2RfluU7EmvDh6Saoe79Lhlu8ZeSJ1x6ZgA8-Cirraz1_526Tn8v5FGDfrc" } ``` --- ## Refresh Operation Token + This operation creates a new operation token. -* operation _(required)_ - must always be `refresh_operation_token` -* refresh_token _(required)_ - the refresh token that was provided when tokens were created +- operation _(required)_ - must always be `refresh_operation_token` +- refresh*token *(required)\_ - the refresh token that was provided when tokens were created ### Body + ```json { - "operation": "refresh_operation_token", - "refresh_token": "EXISTING_REFRESH_TOKEN" + "operation": "refresh_operation_token", + "refresh_token": "EXISTING_REFRESH_TOKEN" } ``` ### Response: 200 + ```json { - "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6eyJfX2NyZWF0ZWR0aW1lX18iOjE2MDQ1MTc4Nzk1MjMsIl9fdXBkYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMywiYWN0aXZlIjp0cnVlLCJhdXRoX3Rva2VuIjpudWxsLCJyb2xlIjp7Il9fY3JlYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMSwiX191cGRhdGVkdGltZV9fIjoxNjA0NTE3ODc5NTIxLCJpZCI6IjZhYmRjNGJhLWU5MjQtNDlhNi1iOGY0LWM1NWUxYmQ0OTYzZCIsInBlcm1pc3Npb24iOnsic3VwZXJfdXNlciI6dHJ1ZSwic3lzdGVtIjp7InRhYmxlcyI6eyJoZGJfdGFibGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9hdHRyaWJ1dGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9zY2hlbWEiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl91c2VyIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfcm9sZSI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2pvYiI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2xpY2Vuc2UiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9pbmZvIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfbm9kZXMiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl90ZW1wIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119fX19LCJyb2xlIjoic3VwZXJfdXNlciJ9LCJ1c2VybmFtZSI6IkhEQl9BRE1JTiJ9LCJpYXQiOjE2MDUwNjQ0MjMsImV4cCI6MTYwNTE1MDgyMywic3ViIjoib3BlcmF0aW9uIn0.VVZdhlh7_xFEaGPwhAh6VJ1d7eisiF3ok3ZwLTQAMWZB6umb2S7pPSTbXAmqAGHRlFAK3BYfnwT3YWt0gZbHvk24_0x3s_dej3PYJ8khIxzMjqpkR6qSjQIC2dhKqpwRPNtoqW_xnep9L-qf5iPtqkwsqWhF1c5VSN8nFouLWMZSuJ6Mag04soNhFvY0AF6QiTyzajMTb6uurRMWOnxk8hwMrY_5xtupabqtZheXP_0DV8l10B7GFi_oWf_lDLmwRmNbeUfW8ZyCIJMj36bjN3PsfVIxog87SWKKCwbWZWfJWw0KEph-HvU0ay35deyGWPIaDQmujuh2vtz-B0GoIAC58PJdXNyQRzES_nSb6Oqc_wGZsLM6EsNn_lrIp3mK_3a5jirZ8s6Z2SfcYKaLF2hCevdm05gRjFJ6ijxZrUSOR2S415wLxmqCCWCp_-sEUz8erUrf07_aj-Bv99GUub4b_znOsQF3uABKd4KKff2cNSMhAa-6sro5GDRRJg376dcLi2_9HOZbnSo90zrpVq8RNV900aydyzDdlXkZja8jdHBk4mxSSewYBvM7up6I0G4X-ZlzFOp30T7kjdLa6480Qp34iYRMMtq0Htpb5k2jPt8dNFnzW-Q2eRy1wNBbH3cCH0rd7_BIGuTCrl4hGU8QjlBiF7Gj0_-uJYhKnhg" + "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6eyJfX2NyZWF0ZWR0aW1lX18iOjE2MDQ1MTc4Nzk1MjMsIl9fdXBkYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMywiYWN0aXZlIjp0cnVlLCJhdXRoX3Rva2VuIjpudWxsLCJyb2xlIjp7Il9fY3JlYXRlZHRpbWVfXyI6MTYwNDUxNzg3OTUyMSwiX191cGRhdGVkdGltZV9fIjoxNjA0NTE3ODc5NTIxLCJpZCI6IjZhYmRjNGJhLWU5MjQtNDlhNi1iOGY0LWM1NWUxYmQ0OTYzZCIsInBlcm1pc3Npb24iOnsic3VwZXJfdXNlciI6dHJ1ZSwic3lzdGVtIjp7InRhYmxlcyI6eyJoZGJfdGFibGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9hdHRyaWJ1dGUiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9zY2hlbWEiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl91c2VyIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfcm9sZSI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2pvYiI6eyJyZWFkIjp0cnVlLCJpbnNlcnQiOmZhbHNlLCJ1cGRhdGUiOmZhbHNlLCJkZWxldGUiOmZhbHNlLCJhdHRyaWJ1dGVfcGVybWlzc2lvbnMiOltdfSwiaGRiX2xpY2Vuc2UiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl9pbmZvIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119LCJoZGJfbm9kZXMiOnsicmVhZCI6dHJ1ZSwiaW5zZXJ0IjpmYWxzZSwidXBkYXRlIjpmYWxzZSwiZGVsZXRlIjpmYWxzZSwiYXR0cmlidXRlX3Blcm1pc3Npb25zIjpbXX0sImhkYl90ZW1wIjp7InJlYWQiOnRydWUsImluc2VydCI6ZmFsc2UsInVwZGF0ZSI6ZmFsc2UsImRlbGV0ZSI6ZmFsc2UsImF0dHJpYnV0ZV9wZXJtaXNzaW9ucyI6W119fX19LCJyb2xlIjoic3VwZXJfdXNlciJ9LCJ1c2VybmFtZSI6IkhEQl9BRE1JTiJ9LCJpYXQiOjE2MDUwNjQ0MjMsImV4cCI6MTYwNTE1MDgyMywic3ViIjoib3BlcmF0aW9uIn0.VVZdhlh7_xFEaGPwhAh6VJ1d7eisiF3ok3ZwLTQAMWZB6umb2S7pPSTbXAmqAGHRlFAK3BYfnwT3YWt0gZbHvk24_0x3s_dej3PYJ8khIxzMjqpkR6qSjQIC2dhKqpwRPNtoqW_xnep9L-qf5iPtqkwsqWhF1c5VSN8nFouLWMZSuJ6Mag04soNhFvY0AF6QiTyzajMTb6uurRMWOnxk8hwMrY_5xtupabqtZheXP_0DV8l10B7GFi_oWf_lDLmwRmNbeUfW8ZyCIJMj36bjN3PsfVIxog87SWKKCwbWZWfJWw0KEph-HvU0ay35deyGWPIaDQmujuh2vtz-B0GoIAC58PJdXNyQRzES_nSb6Oqc_wGZsLM6EsNn_lrIp3mK_3a5jirZ8s6Z2SfcYKaLF2hCevdm05gRjFJ6ijxZrUSOR2S415wLxmqCCWCp_-sEUz8erUrf07_aj-Bv99GUub4b_znOsQF3uABKd4KKff2cNSMhAa-6sro5GDRRJg376dcLi2_9HOZbnSo90zrpVq8RNV900aydyzDdlXkZja8jdHBk4mxSSewYBvM7up6I0G4X-ZlzFOp30T7kjdLa6480Qp34iYRMMtq0Htpb5k2jPt8dNFnzW-Q2eRy1wNBbH3cCH0rd7_BIGuTCrl4hGU8QjlBiF7Gj0_-uJYhKnhg" } ``` diff --git a/site/versioned_docs/version-4.5/developers/operations-api/users-and-roles.md b/site/versioned_docs/version-4.5/developers/operations-api/users-and-roles.md index d95f3ad9..ecaa1117 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/users-and-roles.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/users-and-roles.md @@ -5,480 +5,504 @@ title: Users and Roles # Users and Roles ## List Roles + Returns a list of all roles. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `list_roles` +- operation _(required)_ - must always be `list_roles` ### Body + ```json { - "operation": "list_roles" + "operation": "list_roles" } ``` ### Response: 200 + ```json [ - { - "__createdtime__": 1611615061106, - "__updatedtime__": 1611615061106, - "id": "05c2ffcd-f780-40b1-9432-cfe8ba5ad890", - "permission": { - "super_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": true, - "insert": true, - "update": true - } - ] - } - } - } - }, - "role": "developer" - }, - { - "__createdtime__": 1610749235614, - "__updatedtime__": 1610749235614, - "id": "136f03fa-a0e9-46c3-bd5d-7f3e7dd5b564", - "permission": { - "cluster_user": true - }, - "role": "cluster_user" - }, - { - "__createdtime__": 1610749235609, - "__updatedtime__": 1610749235609, - "id": "745b3138-a7cf-455a-8256-ac03722eef12", - "permission": { - "super_user": true - }, - "role": "super_user" - } + { + "__createdtime__": 1611615061106, + "__updatedtime__": 1611615061106, + "id": "05c2ffcd-f780-40b1-9432-cfe8ba5ad890", + "permission": { + "super_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": true, + "insert": true, + "update": true + } + ] + } + } + } + }, + "role": "developer" + }, + { + "__createdtime__": 1610749235614, + "__updatedtime__": 1610749235614, + "id": "136f03fa-a0e9-46c3-bd5d-7f3e7dd5b564", + "permission": { + "cluster_user": true + }, + "role": "cluster_user" + }, + { + "__createdtime__": 1610749235609, + "__updatedtime__": 1610749235609, + "id": "745b3138-a7cf-455a-8256-ac03722eef12", + "permission": { + "super_user": true + }, + "role": "super_user" + } ] ``` --- ## Add Role + Creates a new role with the specified permissions. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_role` -* role _(required)_ - name of role you are defining -* permission _(required)_ - object defining permissions for users associated with this role: - * super_user _(optional)_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. - * structure_user (optional) - boolean OR array of database names (as strings). If boolean, user can create new databases and tables. If array of strings, users can only manage tables within the specified databases. This overrides any individual table permissions for specified databases, or for all databases if the value is true. +- operation _(required)_ - must always be `add_role` +- role _(required)_ - name of role you are defining +- permission _(required)_ - object defining permissions for users associated with this role: + - super*user *(optional)\_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. + - structure_user (optional) - boolean OR array of database names (as strings). If boolean, user can create new databases and tables. If array of strings, users can only manage tables within the specified databases. This overrides any individual table permissions for specified databases, or for all databases if the value is true. ### Body + ```json { - "operation": "add_role", - "role": "developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": true, - "insert": true, - "update": true - } - ] - } - } - } - } + "operation": "add_role", + "role": "developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": true, + "insert": true, + "update": true + } + ] + } + } + } + } } ``` ### Response: 200 + ```json { - "role": "developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": true, - "insert": true, - "update": true - } - ] - } - } - } - }, - "id": "0a9368b0-bd81-482f-9f5a-8722e3582f96", - "__updatedtime__": 1598549532897, - "__createdtime__": 1598549532897 + "role": "developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": true, + "insert": true, + "update": true + } + ] + } + } + } + }, + "id": "0a9368b0-bd81-482f-9f5a-8722e3582f96", + "__updatedtime__": 1598549532897, + "__createdtime__": 1598549532897 } ``` --- ## Alter Role + Modifies an existing role with the specified permissions. updates permissions from an existing role. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `alter_role` -* id _(required)_ - the id value for the role you are altering -* role _(optional)_ - name value to update on the role you are altering -* permission _(required)_ - object defining permissions for users associated with this role: - * super_user _(optional)_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. - * structure_user (optional) - boolean OR array of database names (as strings). If boolean, user can create new databases and tables. If array of strings, users can only manage tables within the specified databases. This overrides any individual table permissions for specified databases, or for all databases if the value is true. +- operation _(required)_ - must always be `alter_role` +- id _(required)_ - the id value for the role you are altering +- role _(optional)_ - name value to update on the role you are altering +- permission _(required)_ - object defining permissions for users associated with this role: + - super*user *(optional)\_ - boolean which, if set to true, gives users associated with this role full access to all operations and methods. If not included, value will be assumed to be false. + - structure_user (optional) - boolean OR array of database names (as strings). If boolean, user can create new databases and tables. If array of strings, users can only manage tables within the specified databases. This overrides any individual table permissions for specified databases, or for all databases if the value is true. ### Body ```json { - "operation": "alter_role", - "id": "f92162e2-cd17-450c-aae0-372a76859038", - "role": "another_developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": false, - "insert": true, - "update": true - } - ] - } - } - } - } + "operation": "alter_role", + "id": "f92162e2-cd17-450c-aae0-372a76859038", + "role": "another_developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": false, + "insert": true, + "update": true + } + ] + } + } + } + } } ``` ### Response: 200 + ```json { - "id": "a7cb91e9-32e4-4dbf-a327-fab4fa9191ea", - "role": "developer", - "permission": { - "super_user": false, - "structure_user": false, - "dev": { - "tables": { - "dog": { - "read": true, - "insert": true, - "update": true, - "delete": false, - "attribute_permissions": [ - { - "attribute_name": "name", - "read": false, - "insert": true, - "update": true - } - ] - } - } - } - }, - "__updatedtime__": 1598549996106 + "id": "a7cb91e9-32e4-4dbf-a327-fab4fa9191ea", + "role": "developer", + "permission": { + "super_user": false, + "structure_user": false, + "dev": { + "tables": { + "dog": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "name", + "read": false, + "insert": true, + "update": true + } + ] + } + } + } + }, + "__updatedtime__": 1598549996106 } ``` --- ## Drop Role + Deletes an existing role from the database. NOTE: Role with associated users cannot be dropped. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - this must always be `drop_role` -* id _(required)_ - this is the id of the role you are dropping +- operation _(required)_ - this must always be `drop_role` +- id _(required)_ - this is the id of the role you are dropping ### Body + ```json { - "operation": "drop_role", - "id": "developer" + "operation": "drop_role", + "id": "developer" } ``` ### Response: 200 + ```json { - "message": "developer successfully deleted" + "message": "developer successfully deleted" } ``` --- ## List Users + Returns a list of all users. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `list_users` +- operation _(required)_ - must always be `list_users` ### Body + ```json { - "operation": "list_users" + "operation": "list_users" } ``` ### Response: 200 + ```json [ - { - "__createdtime__": 1635520961165, - "__updatedtime__": 1635520961165, - "active": true, - "role": { - "__createdtime__": 1635520961161, - "__updatedtime__": 1635520961161, - "id": "7c78ef13-c1f3-4063-8ea3-725127a78279", - "permission": { - "super_user": true, - "system": { - "tables": { - "hdb_table": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_attribute": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_schema": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_user": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_role": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_job": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_license": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_info": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_nodes": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - }, - "hdb_temp": { - "read": true, - "insert": false, - "update": false, - "delete": false, - "attribute_permissions": [] - } - } - } - }, - "role": "super_user" - }, - "username": "HDB_ADMIN" - } + { + "__createdtime__": 1635520961165, + "__updatedtime__": 1635520961165, + "active": true, + "role": { + "__createdtime__": 1635520961161, + "__updatedtime__": 1635520961161, + "id": "7c78ef13-c1f3-4063-8ea3-725127a78279", + "permission": { + "super_user": true, + "system": { + "tables": { + "hdb_table": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_attribute": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_schema": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_user": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_role": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_job": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_license": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_info": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_nodes": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + }, + "hdb_temp": { + "read": true, + "insert": false, + "update": false, + "delete": false, + "attribute_permissions": [] + } + } + } + }, + "role": "super_user" + }, + "username": "HDB_ADMIN" + } ] ``` --- ## User Info + Returns user data for the associated user credentials. -* operation _(required)_ - must always be `user_info` +- operation _(required)_ - must always be `user_info` ### Body + ```json { - "operation": "user_info" + "operation": "user_info" } ``` ### Response: 200 + ```json { - "__createdtime__": 1610749235611, - "__updatedtime__": 1610749235611, - "active": true, - "role": { - "__createdtime__": 1610749235609, - "__updatedtime__": 1610749235609, - "id": "745b3138-a7cf-455a-8256-ac03722eef12", - "permission": { - "super_user": true - }, - "role": "super_user" - }, - "username": "HDB_ADMIN" + "__createdtime__": 1610749235611, + "__updatedtime__": 1610749235611, + "active": true, + "role": { + "__createdtime__": 1610749235609, + "__updatedtime__": 1610749235609, + "id": "745b3138-a7cf-455a-8256-ac03722eef12", + "permission": { + "super_user": true + }, + "role": "super_user" + }, + "username": "HDB_ADMIN" } ``` --- ## Add User + Creates a new user with the specified role and credentials. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_user` -* role _(required)_ - 'role' name value of the role you wish to assign to the user. See `add_role` for more detail -* username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash -* password _(required)_ - clear text for password. Harper will encrypt the password upon receipt -* active _(required)_ - boolean value for status of user's access to your Harper instance. If set to false, user will not be able to access your instance of Harper. +- operation _(required)_ - must always be `add_user` +- role _(required)_ - 'role' name value of the role you wish to assign to the user. See `add_role` for more detail +- username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash +- password _(required)_ - clear text for password. Harper will encrypt the password upon receipt +- active _(required)_ - boolean value for status of user's access to your Harper instance. If set to false, user will not be able to access your instance of Harper. ### Body + ```json { - "operation": "add_user", - "role": "role_name", - "username": "hdb_user", - "password": "password", - "active": true + "operation": "add_user", + "role": "role_name", + "username": "hdb_user", + "password": "password", + "active": true } ``` ### Response: 200 + ```json { - "message": "hdb_user successfully added" + "message": "hdb_user successfully added" } ``` --- ## Alter User + Modifies an existing user's role and/or credentials. [Learn more about Harper roles here.](../security/users-and-roles) -_Operation is restricted to super\_user roles only_ +_Operation is restricted to super_user roles only_ - * operation _(required)_ - must always be `alter_user` - * username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash. - * password _(optional)_ - clear text for password. Harper will encrypt the password upon receipt - * role _(optional)_ - `role` name value of the role you wish to assign to the user. See `add_role` for more detail - * active _(optional)_ - status of user's access to your Harper instance. See `add_role` for more detail +- operation _(required)_ - must always be `alter_user` +- username _(required)_ - username assigned to the user. It can not be altered after adding the user. It serves as the hash. +- password _(optional)_ - clear text for password. Harper will encrypt the password upon receipt +- role _(optional)_ - `role` name value of the role you wish to assign to the user. See `add_role` for more detail +- active _(optional)_ - status of user's access to your Harper instance. See `add_role` for more detail ### Body + ```json { - "operation": "alter_user", - "role": "role_name", - "username": "hdb_user", - "password": "password", - "active": true + "operation": "alter_user", + "role": "role_name", + "username": "hdb_user", + "password": "password", + "active": true } ``` ### Response: 200 + ```json { - "message": "updated 1 of 1 records", - "new_attributes": [], - "txn_time": 1611615114397.988, - "update_hashes": [ - "hdb_user" - ], - "skipped_hashes": [] + "message": "updated 1 of 1 records", + "new_attributes": [], + "txn_time": 1611615114397.988, + "update_hashes": ["hdb_user"], + "skipped_hashes": [] } ``` --- ## Drop User + Deletes an existing user by username. [Learn more about Harper roles here.](../security/users-and-roles) _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `drop_user` -* username _(required)_ - username assigned to the user +- operation _(required)_ - must always be `drop_user` +- username _(required)_ - username assigned to the user ### Body + ```json { - "operation": "drop_user", - "username": "sgoldberg" + "operation": "drop_user", + "username": "sgoldberg" } ``` ### Response: 200 + ```json { - "message": "sgoldberg successfully deleted" + "message": "sgoldberg successfully deleted" } ``` diff --git a/site/versioned_docs/version-4.5/developers/operations-api/utilities.md b/site/versioned_docs/version-4.5/developers/operations-api/utilities.md index 6cfec533..4259f507 100644 --- a/site/versioned_docs/version-4.5/developers/operations-api/utilities.md +++ b/site/versioned_docs/version-4.5/developers/operations-api/utilities.md @@ -5,64 +5,74 @@ title: Utilities # Utilities ## Restart + Restarts the Harper instance. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `restart` +- operation _(required)_ - must always be `restart` ### Body + ```json { - "operation": "restart" + "operation": "restart" } ``` ### Response: 200 + ```json { - "message": "Restarting HarperDB. This may take up to 60 seconds." + "message": "Restarting HarperDB. This may take up to 60 seconds." } ``` + --- ## Restart Service + Restarts servers for the specified Harper service. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `restart_service` -* service _(required)_ - must be one of: `http_workers`, `clustering_config` or `clustering` -* replicated _(optional)_ - must be a boolean. If set to `true`, Harper will replicate the restart service operation across all nodes in the cluster. The restart will occur as a rolling restart, ensuring that each node is fully restarted before the next node begins restarting. +- operation _(required)_ - must always be `restart_service` +- service _(required)_ - must be one of: `http_workers`, `clustering_config` or `clustering` +- replicated _(optional)_ - must be a boolean. If set to `true`, Harper will replicate the restart service operation across all nodes in the cluster. The restart will occur as a rolling restart, ensuring that each node is fully restarted before the next node begins restarting. ### Body + ```json { - "operation": "restart_service", - "service": "http_workers" + "operation": "restart_service", + "service": "http_workers" } ``` ### Response: 200 + ```json { - "message": "Restarting http_workers" + "message": "Restarting http_workers" } ``` --- + ## System Information + Returns detailed metrics on the host system. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `system_information` -* attributes _(optional)_ - string array of top level attributes desired in the response, if no value is supplied all attributes will be returned. Available attributes are: ['system', 'time', 'cpu', 'memory', 'disk', 'network', 'harperdb_processes', 'table_size', 'metrics', 'threads', 'replication'] +- operation _(required)_ - must always be `system_information` +- attributes _(optional)_ - string array of top level attributes desired in the response, if no value is supplied all attributes will be returned. Available attributes are: ['system', 'time', 'cpu', 'memory', 'disk', 'network', 'harperdb_processes', 'table_size', 'metrics', 'threads', 'replication'] ### Body + ```json { - "operation": "system_information" + "operation": "system_information" } ``` @@ -74,118 +84,125 @@ Delete data before the specified timestamp on the specified database table exclu _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `delete_records_before` -* date _(required)_ - records older than this date will be deleted. Supported format looks like: `YYYY-MM-DDThh:mm:ss.sZ` -* schema _(required)_ - name of the schema where you are deleting your data -* table _(required)_ - name of the table where you are deleting your data +- operation _(required)_ - must always be `delete_records_before` +- date _(required)_ - records older than this date will be deleted. Supported format looks like: `YYYY-MM-DDThh:mm:ss.sZ` +- schema _(required)_ - name of the schema where you are deleting your data +- table _(required)_ - name of the table where you are deleting your data ### Body + ```json { - "operation": "delete_records_before", - "date": "2021-01-25T23:05:27.464", - "schema": "dev", - "table": "breed" + "operation": "delete_records_before", + "date": "2021-01-25T23:05:27.464", + "schema": "dev", + "table": "breed" } ``` ### Response: 200 + ```json { - "message": "Starting job with id d3aed926-e9fe-4ec1-aea7-0fb4451bd373", - "job_id": "d3aed926-e9fe-4ec1-aea7-0fb4451bd373" + "message": "Starting job with id d3aed926-e9fe-4ec1-aea7-0fb4451bd373", + "job_id": "d3aed926-e9fe-4ec1-aea7-0fb4451bd373" } ``` --- ## Export Local + Exports data based on a given search operation to a local file in JSON or CSV format. -* operation _(required)_ - must always be `export_local` -* format _(required)_ - the format you wish to export the data, options are `json` & `csv` -* path _(required)_ - path local to the server to export the data -* search_operation _(required)_ - search_operation of `search_by_hash`, `search_by_value`, `search_by_conditions` or `sql` -* filename _(optional)_ - the name of the file where your export will be written to (do not include extension in filename). If one is not provided it will be autogenerated based on the epoch. +- operation _(required)_ - must always be `export_local` +- format _(required)_ - the format you wish to export the data, options are `json` & `csv` +- path _(required)_ - path local to the server to export the data +- search*operation *(required)\_ - search_operation of `search_by_hash`, `search_by_value`, `search_by_conditions` or `sql` +- filename _(optional)_ - the name of the file where your export will be written to (do not include extension in filename). If one is not provided it will be autogenerated based on the epoch. ### Body + ```json { - "operation": "export_local", - "format": "json", - "path": "/data/", - "search_operation": { - "operation": "sql", - "sql": "SELECT * FROM dev.breed" - } + "operation": "export_local", + "format": "json", + "path": "/data/", + "search_operation": { + "operation": "sql", + "sql": "SELECT * FROM dev.breed" + } } ``` ### Response: 200 + ```json { - "message": "Starting job with id 6fc18eaa-3504-4374-815c-44840a12e7e5" + "message": "Starting job with id 6fc18eaa-3504-4374-815c-44840a12e7e5" } ``` --- ## Export To S3 + Exports data based on a given search operation from table to AWS S3 in JSON or CSV format. -* operation _(required)_ - must always be `export_to_s3` -* format _(required)_ - the format you wish to export the data, options are `json` & `csv` -* s3 _(required)_ - details your access keys, bucket, bucket region and key for saving the data to S3 -* search_operation _(required)_ - search_operation of `search_by_hash`, `search_by_value`, `search_by_conditions` or `sql` +- operation _(required)_ - must always be `export_to_s3` +- format _(required)_ - the format you wish to export the data, options are `json` & `csv` +- s3 _(required)_ - details your access keys, bucket, bucket region and key for saving the data to S3 +- search*operation *(required)\_ - search_operation of `search_by_hash`, `search_by_value`, `search_by_conditions` or `sql` ### Body + ```json { - "operation": "export_to_s3", - "format": "json", - "s3": { - "aws_access_key_id": "YOUR_KEY", - "aws_secret_access_key": "YOUR_SECRET_KEY", - "bucket": "BUCKET_NAME", - "key": "OBJECT_NAME", - "region": "BUCKET_REGION" - }, - "search_operation": { - "operation": "sql", - "sql": "SELECT * FROM dev.dog" - } + "operation": "export_to_s3", + "format": "json", + "s3": { + "aws_access_key_id": "YOUR_KEY", + "aws_secret_access_key": "YOUR_SECRET_KEY", + "bucket": "BUCKET_NAME", + "key": "OBJECT_NAME", + "region": "BUCKET_REGION" + }, + "search_operation": { + "operation": "sql", + "sql": "SELECT * FROM dev.dog" + } } ``` ### Response: 200 + ```json { - "message": "Starting job with id 9fa85968-4cb1-4008-976e-506c4b13fc4a", - "job_id": "9fa85968-4cb1-4008-976e-506c4b13fc4a" + "message": "Starting job with id 9fa85968-4cb1-4008-976e-506c4b13fc4a", + "job_id": "9fa85968-4cb1-4008-976e-506c4b13fc4a" } ``` --- ## Install Node Modules + This operation is deprecated, as it is handled automatically by deploy_component and restart. Executes npm install against specified custom function projects. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `install_node_modules` -* projects _(required)_ - must ba an array of custom functions projects. -* dry_run _(optional)_ - refers to the npm --dry-run flag: [https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run](https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run). Defaults to false. +- operation _(required)_ - must always be `install_node_modules` +- projects _(required)_ - must ba an array of custom functions projects. +- dry*run *(optional)\_ - refers to the npm --dry-run flag: [https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run](https://docs.npmjs.com/cli/v8/commands/npm-install#dry-run). Defaults to false. ### Body + ```json { - "operation": "install_node_modules", - "projects": [ - "dogs", - "cats" - ], - "dry_run": true + "operation": "install_node_modules", + "projects": ["dogs", "cats"], + "dry_run": true } ``` @@ -197,126 +214,127 @@ Modifies the Harper configuration file parameters. Must follow with a restart or _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `set_configuration` -* logging_level _(example/optional)_ - one or more configuration keywords to be updated in the Harper configuration file -* clustering_enabled _(example/optional)_ - one or more configuration keywords to be updated in the Harper configuration file +- operation _(required)_ - must always be `set_configuration` +- logging*level *(example/optional)\_ - one or more configuration keywords to be updated in the Harper configuration file +- clustering*enabled *(example/optional)\_ - one or more configuration keywords to be updated in the Harper configuration file ### Body + ```json { - "operation": "set_configuration", - "logging_level": "trace", - "clustering_enabled": true + "operation": "set_configuration", + "logging_level": "trace", + "clustering_enabled": true } ``` ### Response: 200 + ```json { - "message": "Configuration successfully set. You must restart HarperDB for new config settings to take effect." + "message": "Configuration successfully set. You must restart HarperDB for new config settings to take effect." } ``` --- ## Get Configuration + Returns the Harper configuration parameters. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `get_configuration` +- operation _(required)_ - must always be `get_configuration` ### Body + ```json { - "operation": "get_configuration" + "operation": "get_configuration" } ``` ### Response: 200 + ```json { - "http": { - "compressionThreshold": 1200, - "cors": false, - "corsAccessList": [ - null - ], - "keepAliveTimeout": 30000, - "port": 9926, - "securePort": null, - "timeout": 120000 - }, - "threads": 11, - "authentication": { - "cacheTTL": 30000, - "enableSessions": true, - "operationTokenTimeout": "1d", - "refreshTokenTimeout": "30d" - }, - "analytics": { - "aggregatePeriod": 60 - }, - "replication": { - "hostname": "node1", - "databases": "*", - "routes": null, - "url": "wss://127.0.0.1:9925" - }, - "componentsRoot": "/Users/hdb/components", - "localStudio": { - "enabled": false - }, - "logging": { - "auditAuthEvents": { - "logFailed": false, - "logSuccessful": false - }, - "auditLog": true, - "auditRetention": "3d", - "file": true, - "level": "error", - "root": "/Users/hdb/log", - "rotation": { - "enabled": false, - "compress": false, - "interval": null, - "maxSize": null, - "path": "/Users/hdb/log" - }, - "stdStreams": false - }, - "mqtt": { - "network": { - "port": 1883, - "securePort": 8883 - }, - "webSocket": true, - "requireAuthentication": true - }, - "operationsApi": { - "network": { - "cors": true, - "corsAccessList": [ - "*" - ], - "domainSocket": "/Users/hdb/operations-server", - "port": 9925, - "securePort": null - } - }, - "rootPath": "/Users/hdb", - "storage": { - "writeAsync": false, - "caching": true, - "compression": false, - "noReadAhead": true, - "path": "/Users/hdb/database", - "prefetchWrites": true - }, - "tls": { - "privateKey": "/Users/hdb/keys/privateKey.pem" - } + "http": { + "compressionThreshold": 1200, + "cors": false, + "corsAccessList": [null], + "keepAliveTimeout": 30000, + "port": 9926, + "securePort": null, + "timeout": 120000 + }, + "threads": 11, + "authentication": { + "cacheTTL": 30000, + "enableSessions": true, + "operationTokenTimeout": "1d", + "refreshTokenTimeout": "30d" + }, + "analytics": { + "aggregatePeriod": 60 + }, + "replication": { + "hostname": "node1", + "databases": "*", + "routes": null, + "url": "wss://127.0.0.1:9925" + }, + "componentsRoot": "/Users/hdb/components", + "localStudio": { + "enabled": false + }, + "logging": { + "auditAuthEvents": { + "logFailed": false, + "logSuccessful": false + }, + "auditLog": true, + "auditRetention": "3d", + "file": true, + "level": "error", + "root": "/Users/hdb/log", + "rotation": { + "enabled": false, + "compress": false, + "interval": null, + "maxSize": null, + "path": "/Users/hdb/log" + }, + "stdStreams": false + }, + "mqtt": { + "network": { + "port": 1883, + "securePort": 8883 + }, + "webSocket": true, + "requireAuthentication": true + }, + "operationsApi": { + "network": { + "cors": true, + "corsAccessList": ["*"], + "domainSocket": "/Users/hdb/operations-server", + "port": 9925, + "securePort": null + } + }, + "rootPath": "/Users/hdb", + "storage": { + "writeAsync": false, + "caching": true, + "compression": false, + "noReadAhead": true, + "path": "/Users/hdb/database", + "prefetchWrites": true + }, + "tls": { + "privateKey": "/Users/hdb/keys/privateKey.pem" + } } ``` @@ -324,34 +342,36 @@ _Operation is restricted to super_user roles only_ ## Add Certificate -Adds or updates a certificate in the `hdb_certificate` system table. -If a `private_key` is provided it will __not__ be stored in `hdb_certificate`, it will be written to file in `/keys/`. +Adds or updates a certificate in the `hdb_certificate` system table. +If a `private_key` is provided it will **not** be stored in `hdb_certificate`, it will be written to file in `/keys/`. If a `private_key` is not passed the operation will search for one that matches the certificate. If one is not found an error will be returned. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `add_certificate` -* name _(required)_ - a unique name for the certificate -* certificate _(required)_ - a PEM formatted certificate string -* is_authority _(required)_ - a boolean indicating if the certificate is a certificate authority -* hosts _(optional)_ - an array of hostnames that the certificate is valid for -* private_key _(optional)_ - a PEM formatted private key string +- operation _(required)_ - must always be `add_certificate` +- name _(required)_ - a unique name for the certificate +- certificate _(required)_ - a PEM formatted certificate string +- is*authority *(required)\_ - a boolean indicating if the certificate is a certificate authority +- hosts _(optional)_ - an array of hostnames that the certificate is valid for +- private*key *(optional)\_ - a PEM formatted private key string ### Body + ```json { - "operation": "add_certificate", - "name": "my-cert", - "certificate": "-----BEGIN CERTIFICATE-----ZDFAay... -----END CERTIFICATE-----", - "is_authority": false, - "private_key": "-----BEGIN RSA PRIVATE KEY-----Y4dMpw5f... -----END RSA PRIVATE KEY-----" + "operation": "add_certificate", + "name": "my-cert", + "certificate": "-----BEGIN CERTIFICATE-----ZDFAay... -----END CERTIFICATE-----", + "is_authority": false, + "private_key": "-----BEGIN RSA PRIVATE KEY-----Y4dMpw5f... -----END RSA PRIVATE KEY-----" } ``` ### Response: 200 + ```json { - "message": "Successfully added certificate: my-cert" + "message": "Successfully added certificate: my-cert" } ``` @@ -363,21 +383,23 @@ Removes a certificate from the `hdb_certificate` system table and deletes the co _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `remove_certificate` -* name _(required)_ - the name of the certificate +- operation _(required)_ - must always be `remove_certificate` +- name _(required)_ - the name of the certificate ### Body + ```json { - "operation": "remove_certificate", - "name": "my-cert" + "operation": "remove_certificate", + "name": "my-cert" } ``` ### Response: 200 + ```json { - "message": "Successfully removed my-cert" + "message": "Successfully removed my-cert" } ``` @@ -389,54 +411,50 @@ Lists all certificates in the `hdb_certificate` system table. _Operation is restricted to super_user roles only_ -* operation _(required)_ - must always be `list_certificates` +- operation _(required)_ - must always be `list_certificates` ### Body + ```json { - "operation": "list_certificates" + "operation": "list_certificates" } ``` ### Response: 200 + ```json [ - { - "name": "HarperDB-Certificate-Authority-node1", - "certificate": "-----BEGIN CERTIFICATE-----\r\nTANBgkqhk... S34==\r\n-----END CERTIFICATE-----\r\n", - "private_key_name": "privateKey.pem", - "is_authority": true, - "details": { - "issuer": "CN=HarperDB-Certificate-Authority-node1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", - "subject": "CN=HarperDB-Certificate-Authority-node1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", - "serial_number": "5235345", - "valid_from": "Aug 27 15:00:00 2024 GMT", - "valid_to": "Aug 25 15:00:00 2034 GMT" - }, - "is_self_signed": true, - "uses": [ - "https", - "wss" - ] - }, - { - "name": "node1", - "certificate": "-----BEGIN CERTIFICATE-----\r\ngIEcSR1M... 5bv==\r\n-----END CERTIFICATE-----\r\n", - "private_key_name": "privateKey.pem", - "is_authority": false, - "details": { - "issuer": "CN=HarperDB-Certificate-Authority-node1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", - "subject": "CN=node.1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", - "subject_alt_name": "IP Address:127.0.0.1, DNS:localhost, IP Address:0:0:0:0:0:0:0:1, DNS:node.1", - "serial_number": "5243646", - "valid_from": "Aug 27 15:00:00 2024 GMT", - "valid_to": "Aug 25 15:00:00 2034 GMT" - }, - "is_self_signed": true, - "uses": [ - "https", - "wss" - ] - } + { + "name": "HarperDB-Certificate-Authority-node1", + "certificate": "-----BEGIN CERTIFICATE-----\r\nTANBgkqhk... S34==\r\n-----END CERTIFICATE-----\r\n", + "private_key_name": "privateKey.pem", + "is_authority": true, + "details": { + "issuer": "CN=HarperDB-Certificate-Authority-node1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", + "subject": "CN=HarperDB-Certificate-Authority-node1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", + "serial_number": "5235345", + "valid_from": "Aug 27 15:00:00 2024 GMT", + "valid_to": "Aug 25 15:00:00 2034 GMT" + }, + "is_self_signed": true, + "uses": ["https", "wss"] + }, + { + "name": "node1", + "certificate": "-----BEGIN CERTIFICATE-----\r\ngIEcSR1M... 5bv==\r\n-----END CERTIFICATE-----\r\n", + "private_key_name": "privateKey.pem", + "is_authority": false, + "details": { + "issuer": "CN=HarperDB-Certificate-Authority-node1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", + "subject": "CN=node.1 C=USA ST=Colorado L=Denver O=HarperDB\\, Inc.", + "subject_alt_name": "IP Address:127.0.0.1, DNS:localhost, IP Address:0:0:0:0:0:0:0:1, DNS:node.1", + "serial_number": "5243646", + "valid_from": "Aug 27 15:00:00 2024 GMT", + "valid_to": "Aug 25 15:00:00 2034 GMT" + }, + "is_self_signed": true, + "uses": ["https", "wss"] + } ] ``` diff --git a/site/versioned_docs/version-4.5/developers/real-time.md b/site/versioned_docs/version-4.5/developers/real-time.md index 639cfce4..9c5c79e4 100644 --- a/site/versioned_docs/version-4.5/developers/real-time.md +++ b/site/versioned_docs/version-4.5/developers/real-time.md @@ -9,9 +9,11 @@ title: Real-Time Harper provides real-time access to data and messaging. This allows clients to monitor and subscribe to data for changes in real-time as well as handling data-oriented messaging. Harper supports multiple standardized protocols to facilitate diverse standards-based client interaction. Harper real-time communication is based around database tables. Declared tables are the basis for monitoring data, and defining "topics" for publishing and subscribing to messages. Declaring a table that establishes a topic can be as simple as adding a table with no attributes to your [schema.graphql in a Harper application folder](./applications/): + ``` type MyTopic @table @export ``` + You can then subscribe to records or sub-topics in this topic/namespace, as well as save data and publish messages, with the protocols discussed below. ### Content Negotiation @@ -61,6 +63,7 @@ Harper supports QoS 0 and 1 for publishing and subscribing. Harper supports multi-level topics, both for subscribing and publishing. Harper also supports multi-level wildcards, so you can subscribe to /`my-resource/#` to receive notifications for `my-resource/some-id` as well as `my-resource/nested/id`, or you can subscribe to `my-resource/nested/#` and receive the latter, but not the former, topic messages. Harper currently only supports trailing multi-level wildcards (no single-level wildcards with '\*'). #### Events + JavaScript components can also listen for MQTT events. This is available on the server.mqtt.events object. For example, to set up a listener/callback for when MQTT clients connect and authorize, we can do: ```javascript @@ -68,11 +71,13 @@ server.mqtt.events.on('connected', (session, socket) => { console.log('client connected with id', session.clientId); }); ``` + The following MQTT events are available: -* `connection` - When a client initially establishes a TCP or WS connection to the server -* `connected` - When a client establishes an authorized MQTT connection -* `auth-failed` - When a client fails to authenticate -* `disconnected` - When a client disconnects from the server + +- `connection` - When a client initially establishes a TCP or WS connection to the server +- `connected` - When a client establishes an authorized MQTT connection +- `auth-failed` - When a client fails to authenticate +- `disconnected` - When a client disconnects from the server ### Ordering @@ -144,7 +149,7 @@ eventSource.onmessage = (event) => { ### MQTT Feature Support Matrix | Feature | Support | -|--------------------------------------------------------------------|----------------------------------------------------------------| +| ------------------------------------------------------------------ | -------------------------------------------------------------- | | Connections, protocol negotiation, and acknowledgement with v3.1.1 | :heavy_check_mark: | | Connections, protocol negotiation, and acknowledgement with v5 | :heavy_check_mark: | | Secure MQTTS | :heavy_check_mark: | diff --git a/site/versioned_docs/version-4.5/developers/replication/index.md b/site/versioned_docs/version-4.5/developers/replication/index.md index 37ec2b6c..7e38a02a 100644 --- a/site/versioned_docs/version-4.5/developers/replication/index.md +++ b/site/versioned_docs/version-4.5/developers/replication/index.md @@ -37,10 +37,9 @@ You can also use the [operations API](../operations-api/clustering) to dynamical ```json { - "operation": "add_node", - "hostname": "server-two" + "operation": "add_node", + "hostname": "server-two" } - ``` These operations will also dynamically generating certificates as needed, if there are no existing signed certificates, or if the existing certificates are not valid for the new node. @@ -60,8 +59,8 @@ By default, all tables within a replicated database will be replicated. Transact ```graphql type LocalTableForNode @table(replicate: false) { - id: ID! - name: String! + id: ID! + name: String! } ``` @@ -81,6 +80,7 @@ Harper supports the highest levels of security through public key infrastructure #### Provide your own certificates If you want to secure your Harper connections with your own signed certificates, you can easily do so. Whether you have certificates from a public authority (like Let's Encrypt or Digicert) or a corporate certificate authority, you can use them to authenticate nodes securely. You can then allow nodes to authorize each other by checking the certificate against the standard list of root certificate authorities by enabling the `enableRootCAs` option in the config: + ``` replication enableRootCAs: true @@ -125,13 +125,13 @@ Example configuration: ```json { - "operation": "add_node", - "hostname": "server-two", - "verify_tls": false, - "authorization": { - "username": "admin", - "password": "password" - } + "operation": "add_node", + "hostname": "server-two", + "verify_tls": false, + "authorization": { + "username": "admin", + "password": "password" + } } ``` @@ -139,8 +139,8 @@ When you connect to another node (e.g., `server-two`), Harper uses secure WebSoc If you’re working with a fresh install, you’ll need to set `verify_tls` to `false` temporarily, so the self-signed certificate is accepted. Once the connection is made, Harper will automatically handle the certificate signing process: -* It creates a certificate signing request (CSR), sends it to `server-two`, which then signs it and returns the signed certificate along with the certificate authority (CA). -* The signed certificate is stored for future connections between the nodes, ensuring secure communication. +- It creates a certificate signing request (CSR), sends it to `server-two`, which then signs it and returns the signed certificate along with the certificate authority (CA). +- The signed certificate is stored for future connections between the nodes, ensuring secure communication. **Important:** Your credentials are not stored—they are discarded immediately after use. @@ -156,9 +156,9 @@ To utilize the `revoked_certificates` attribute in the `hdb_nodes` table, you ca ```json { - "operation": "update_node", - "hostname": "server-two", - "revoked_certificates": ["1769F7D6A"] + "operation": "update_node", + "hostname": "server-two", + "revoked_certificates": ["1769F7D6A"] } ``` @@ -180,8 +180,8 @@ Nodes can be removed from the cluster using the [`remove_node` operation](../ope ```json { - "operation": "remove_node", - "hostname": "server-two" + "operation": "remove_node", + "hostname": "server-two" } ``` @@ -217,14 +217,16 @@ Example configuration: ```json { - "operation": "add_node", - "hostname": "server-two", - "subscriptions": [{ - "database": "dev", - "table": "my-table", - "publish": true, - "subscribe": false - }] + "operation": "add_node", + "hostname": "server-two", + "subscriptions": [ + { + "database": "dev", + "table": "my-table", + "publish": true, + "subscribe": false + } + ] } ``` @@ -234,14 +236,16 @@ Here we are updating the subscription to receive transactions on the `dev.my-tab ```json { - "operation": "update_node", - "hostname": "server-two", - "subscriptions": [{ - "database": "dev", - "table": "my-table", - "publish": true, - "subscribe": true - }] + "operation": "update_node", + "hostname": "server-two", + "subscriptions": [ + { + "database": "dev", + "table": "my-table", + "publish": true, + "subscribe": true + } + ] } ``` @@ -251,7 +255,7 @@ You can monitor the status of replication through the operations API. You can us ```json { - "operation": "cluster_status" + "operation": "cluster_status" } ``` @@ -263,14 +267,14 @@ You may also specify a `start_time` in the `add_node` to specify that when a dat **Advanced Configuration** -You can also check the configuration of the replication system, including the current known nodes and certificates, by querying the hdb\_nodes and hdb\_certificate table: +You can also check the configuration of the replication system, including the current known nodes and certificates, by querying the hdb_nodes and hdb_certificate table: ```json { - "operation": "search_by_value", - "database": "system", - "table": "hdb_nodes", - "search_attribute": "name", - "search_value": "*" + "operation": "search_by_value", + "database": "system", + "table": "hdb_nodes", + "search_attribute": "name", + "search_value": "*" } ``` diff --git a/site/versioned_docs/version-4.5/developers/replication/sharding.md b/site/versioned_docs/version-4.5/developers/replication/sharding.md index 869d353b..74242292 100644 --- a/site/versioned_docs/version-4.5/developers/replication/sharding.md +++ b/site/versioned_docs/version-4.5/developers/replication/sharding.md @@ -9,17 +9,22 @@ There are two main ways to setup sharding in Harper. The approach is to use dyna The second approach is define specific shards, where each node is assigned to a specific shard, and each record is replicated to the nodes in that shard based on the primary key, regardless of where the data was written or accessed, or content. This approach is more static, but can be more efficient for certain use cases, and means that the location of data can always be predictably determined based on the primary key. ## Configuration For Dynamic Sharding + By default, Harper will replicate all data to all nodes. However, replication can easily be configured for "sharding", or storing different data in different locations or nodes. The simplest way to configure sharding and limit replication to improve performance and efficiency is to configure a replication-to count. This will limit the number of nodes that data is replicated to. For example, to specify that writes should replicate to 2 other nodes besides the node that first stored the data, you can set the `replicateTo` to 2 in the `replication` section of the `harperdb-config.yaml` file: + ```yaml replication: replicateTo: 2 ``` + This will ensure that data is replicated to two other nodes, so that each record will be stored on three nodes in total. -With a sharding configuration (or customization below) in place, requests will for records that don't reside on the server handling requests will automatically be forwarded to the appropriate node. This will be done transparently, so that the client will not need to know where the data is stored. +With a sharding configuration (or customization below) in place, requests will for records that don't reside on the server handling requests will automatically be forwarded to the appropriate node. This will be done transparently, so that the client will not need to know where the data is stored. ## Replication Control with Headers -With the REST interface, replication levels and destinations can also specified with the `X-Replicate-To` header. This can be used to indicate the number of additional nodes that data should be replicated to, or to specify the nodes that data should be replicated to. The `X-Replicate-To` header can be used with the `POST` and `PUT` methods. This header can also specify if the response should wait for confirmation from other nodes, and how many, with the `confirm` parameter. For example, to specify that data should be replicated to two other nodes, and the response should be returned once confirmation is received from one other node, you can use the following header: + +With the REST interface, replication levels and destinations can also specified with the `X-Replicate-To` header. This can be used to indicate the number of additional nodes that data should be replicated to, or to specify the nodes that data should be replicated to. The `X-Replicate-To` header can be used with the `POST` and `PUT` methods. This header can also specify if the response should wait for confirmation from other nodes, and how many, with the `confirm` parameter. For example, to specify that data should be replicated to two other nodes, and the response should be returned once confirmation is received from one other node, you can use the following header: + ```http PUT /MyTable/3 X-Replicate-To: 2;confirm=1 @@ -28,35 +33,44 @@ X-Replicate-To: 2;confirm=1 ``` You can also explicitly specify destination nodes by providing a comma-separated list of node hostnames. For example, to specify that data should be replicated to nodes `node1` and `node2`, you can use the following header: + ```http PUT /MyTable/3 X-Replicate-To: node1,node2 ``` + (This can also be used with the `confirm` parameter.) ## Replication Control with Operations + Likewise, you can specify replicateTo and confirm parameters in the operation object when using the Harper API. For example, to specify that data should be replicated to two other nodes, and the response should be returned once confirmation is received from one other node, you can use the following operation object: + ```json { - "operation": "update", - "schema": "dev", - "table": "MyTable", - "hashValues": [3], - "record": { - "name": "John Doe" - }, - "replicateTo": 2, - "replicatedConfirmation": 1 + "operation": "update", + "schema": "dev", + "table": "MyTable", + "hashValues": [3], + "record": { + "name": "John Doe" + }, + "replicateTo": 2, + "replicatedConfirmation": 1 } ``` + or you can specify nodes: + ```json ..., "replicateTo": ["node-1", "node-2"] ... ``` + ## Programmatic Replication Control + Additionally, you can specify `replicateTo` and `replicatedConfirmation` parameters programmatically in the context of a resource. For example, you can define a put method: + ```javascript class MyTable extends tables.MyTable { put(record) { @@ -69,12 +83,16 @@ class MyTable extends tables.MyTable { ``` ## Configuration for Static Sharding + Alternatively, you can configure static sharding, where each node is assigned to a specific shard, and each record is replicated to the nodes in that shard based on the primary key. The `shard` is identified by a number. To configure the shard for each node, you can specify the shard number in the `replication`'s `shard` in the configuration: + ```yaml replication: shard: 1 ``` -Alternatively, you can configure the `shard` under the `replication` `routes`. This allows you to assign a specific shard id based on the routing configuration. + +Alternatively, you can configure the `shard` under the `replication` `routes`. This allows you to assign a specific shard id based on the routing configuration. + ```yaml replication: routes: @@ -83,52 +101,64 @@ replication: - hostname: node2 shard: 2 ``` + Or you can specify a `shard` number by including that property in an `add_node` operation or `set_node` operation, to dynamically assign a node to a shard. -You can then specify shard number in the `setResidency` or `setResidencyById` functions below. +You can then specify shard number in the `setResidency` or `setResidencyById` functions below. ## Custom Sharding -You can also define a custom sharding strategy by specifying a function to compute the "residency" or location of where records should be stored and reside. To do this we use the `setResidency` method, providing a function that will determine the residency of each record. The function you provide will be called with the record entry, and should return an array of nodes that the record should be replicated to (using their hostname). For example, to shard records based on the value of the `id` field, you can use the following code: + +You can also define a custom sharding strategy by specifying a function to compute the "residency" or location of where records should be stored and reside. To do this we use the `setResidency` method, providing a function that will determine the residency of each record. The function you provide will be called with the record entry, and should return an array of nodes that the record should be replicated to (using their hostname). For example, to shard records based on the value of the `id` field, you can use the following code: + ```javascript MyTable.setResidency((record) => { - return record.id % 2 === 0 ? ['node1'] : ['node2']; + return record.id % 2 === 0 ? ['node1'] : ['node2']; }); ``` + With this approach, the record metadata, which includes the residency information, and any indexed properties, will be replicated to all nodes, but the full record will only be replicated to the nodes specified by the residency function. The `setResidency` function can alternately return a shard number, which will replicate the data to all the nodes in that shard: + ```javascript MyTable.setResidency((record) => { - return record.id % 2 === 0 ? 1 : 2; + return record.id % 2 === 0 ? 1 : 2; }); ``` ### Custom Sharding By Primary Key -Alternately you can define a custom sharding strategy based on the primary key alone. This allows records to be retrieved without needing access to the record data or metadata. With this approach, data will only be replicated to the nodes specified by the residency function (the record metadata doesn't need to replicated to all nodes). To do this, you can use the `setResidencyById` method, providing a function that will determine the residency or shard of each record based on the primary key. The function you provide will be called with the primary key, and should return a `shard` number or an array of nodes that the record should be replicated to (using their hostname). For example, to shard records based on the value of the primary key, you can use the following code: + +Alternately you can define a custom sharding strategy based on the primary key alone. This allows records to be retrieved without needing access to the record data or metadata. With this approach, data will only be replicated to the nodes specified by the residency function (the record metadata doesn't need to replicated to all nodes). To do this, you can use the `setResidencyById` method, providing a function that will determine the residency or shard of each record based on the primary key. The function you provide will be called with the primary key, and should return a `shard` number or an array of nodes that the record should be replicated to (using their hostname). For example, to shard records based on the value of the primary key, you can use the following code: ```javascript MyTable.setResidencyById((id) => { - return id % 2 === 0 ? 1 : 2; // return shard number + return id % 2 === 0 ? 1 : 2; // return shard number }); ``` + or + ```javascript MyTable.setResidencyById((id) => { - return id % 2 === 0 ? ['node1'] : ['node2']; // return array of node hostnames + return id % 2 === 0 ? ['node1'] : ['node2']; // return array of node hostnames }); ``` ### Disabling Cross-Node Access -Normally sharding allows data to be stored in specific nodes, but still allows access to the data from any node. However, you can also disable cross-node access so that data is only returned if is stored on the node where it is accessed. To do this, you can set the `replicateFrom` property on the context of operation to `false`: + +Normally sharding allows data to be stored in specific nodes, but still allows access to the data from any node. However, you can also disable cross-node access so that data is only returned if is stored on the node where it is accessed. To do this, you can set the `replicateFrom` property on the context of operation to `false`: + ```json { - "operation": "search_by_id", - "table": "MyTable", - "ids": [3], - "replicateFrom": false + "operation": "search_by_id", + "table": "MyTable", + "ids": [3], + "replicateFrom": false } ``` + Or use a header with the REST API: + ```http GET /MyTable/3 X-Replicate-From: none diff --git a/site/versioned_docs/version-4.5/developers/rest.md b/site/versioned_docs/version-4.5/developers/rest.md index 200a90f8..815338b8 100644 --- a/site/versioned_docs/version-4.5/developers/rest.md +++ b/site/versioned_docs/version-4.5/developers/rest.md @@ -12,11 +12,11 @@ Resources, including tables, can be configured as RESTful endpoints. Make sure y The default path structure provides access to resources at several levels: -* `/my-resource` - The root path of a resource usually has a description of the resource (like a describe operation for a table). -* `/my-resource/` - The trailing slash in a path indicates it is a collection of the records. The root collection for a table represents all the records in a table, and usually you will append query parameters to query and search for more specific records. -* `/my-resource/record-id` - This resource locator represents a specific record, referenced by its id. This is typically how you can retrieve, update, and delete individual records. -* `/my-resource/record-id/` - Again, a trailing slash indicates a collection; here it is the collection of the records that begin with the specified id prefix. -* `/my-resource/record-id/with/multiple/parts` - A record id can consist of multiple path segments. +- `/my-resource` - The root path of a resource usually has a description of the resource (like a describe operation for a table). +- `/my-resource/` - The trailing slash in a path indicates it is a collection of the records. The root collection for a table represents all the records in a table, and usually you will append query parameters to query and search for more specific records. +- `/my-resource/record-id` - This resource locator represents a specific record, referenced by its id. This is typically how you can retrieve, update, and delete individual records. +- `/my-resource/record-id/` - Again, a trailing slash indicates a collection; here it is the collection of the records that begin with the specified id prefix. +- `/my-resource/record-id/with/multiple/parts` - A record id can consist of multiple path segments. ### GET @@ -81,13 +81,13 @@ Generally the POST method can be used for custom actions since POST has the broa This is handled by the Resource method `post(data)`, which is a good method to extend to make various other types of modifications. Also, with a table you can create a new record without specifying a primary key, for example: -````http +`````http ````http POST /MyTable/ Content-Type: application/json `{ "name": "some data" }` -```` +````` This will create a new record, auto-assigning a primary key, which will be returned in the `Location` header. @@ -334,7 +334,7 @@ PUT /Product/123 Content-Type: application/json { "id": "123", "resellerIds": ["first-reseller-id", "second-reseller-id", "last-reseller-id"], -...} +...} ``` #### Type Conversion @@ -402,3 +402,4 @@ Content-Type: image/gif ...image data... ``` +```` diff --git a/site/versioned_docs/version-4.5/developers/security/basic-auth.md b/site/versioned_docs/version-4.5/developers/security/basic-auth.md index 0faa7d4c..a4510b13 100644 --- a/site/versioned_docs/version-4.5/developers/security/basic-auth.md +++ b/site/versioned_docs/version-4.5/developers/security/basic-auth.md @@ -6,7 +6,7 @@ title: Basic Authentication Harper uses Basic Auth and JSON Web Tokens (JWTs) to secure our HTTP requests. In the context of an HTTP transaction, **basic access authentication** is a method for an HTTP user agent to provide a username and password when making a request. -** _**You do not need to log in separately. Basic Auth is added to each HTTP request like create\_database, create\_table, insert etc… via headers.**_ ** +** \_**You do not need to log in separately. Basic Auth is added to each HTTP request like create_database, create_table, insert etc… via headers.**\_ ** A header is added to each HTTP request. The header key is **“Authorization”** the header value is **“Basic <<your username and password buffer token>>”** @@ -17,46 +17,41 @@ In the below code sample, you can see where we add the authorization header to t _Note: This function uses btoa. Learn about_ [_btoa here_](https://developer.mozilla.org/en-US/docs/Web/API/btoa)_._ ```javascript -function callHarperDB(call_object, operation, callback){ - - const options = { - "method": "POST", - "hostname": call_object.endpoint_url, - "port": call_object.endpoint_port, - "path": "/", - "headers": { - "content-type": "application/json", - "authorization": "Basic " + btoa(call_object.username + ':' + call_object.password), - "cache-control": "no-cache" - - } - }; - - const http_req = http.request(options, function (hdb_res) { - let chunks = []; - - hdb_res.on("data", function (chunk) { - chunks.push(chunk); - }); - - hdb_res.on("end", function () { - const body = Buffer.concat(chunks); - if (isJson(body)) { - return callback(null, JSON.parse(body)); - } else { - return callback(body, null); - - } - - }); - }); - - http_req.on("error", function (chunk) { - return callback("Failed to connect", null); - }); - - http_req.write(JSON.stringify(operation)); - http_req.end(); - +function callHarperDB(call_object, operation, callback) { + const options = { + method: 'POST', + hostname: call_object.endpoint_url, + port: call_object.endpoint_port, + path: '/', + headers: { + 'content-type': 'application/json', + 'authorization': 'Basic ' + btoa(call_object.username + ':' + call_object.password), + 'cache-control': 'no-cache', + }, + }; + + const http_req = http.request(options, function (hdb_res) { + let chunks = []; + + hdb_res.on('data', function (chunk) { + chunks.push(chunk); + }); + + hdb_res.on('end', function () { + const body = Buffer.concat(chunks); + if (isJson(body)) { + return callback(null, JSON.parse(body)); + } else { + return callback(body, null); + } + }); + }); + + http_req.on('error', function (chunk) { + return callback('Failed to connect', null); + }); + + http_req.write(JSON.stringify(operation)); + http_req.end(); } ``` diff --git a/site/versioned_docs/version-4.5/developers/security/configuration.md b/site/versioned_docs/version-4.5/developers/security/configuration.md index 7638ef86..19251614 100644 --- a/site/versioned_docs/version-4.5/developers/security/configuration.md +++ b/site/versioned_docs/version-4.5/developers/security/configuration.md @@ -8,18 +8,19 @@ Harper was set up to require very minimal configuration to work out of the box. ## CORS -Harper allows for managing [cross-origin HTTP requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access\_control\_CORS). By default, Harper enables CORS for all domains if you need to disable CORS completely or set up an access list of domains you can do the following: +Harper allows for managing [cross-origin HTTP requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS). By default, Harper enables CORS for all domains if you need to disable CORS completely or set up an access list of domains you can do the following: 1. Open the harperdb-config.yaml file, which can be found in \, the location you specified during install. 1. In harperdb-config.yaml there should be 2 entries under `operationsApi.network`: cors and corsAccessList. - * `cors` + - `cors` 1. To turn off, change to: `cors: false` 1. To turn on, change to: `cors: true` - * `corsAccessList` + - `corsAccessList` 1. The `corsAccessList` will only be recognized by the system when `cors` is `true` 1. To create an access list you set `corsAccessList` to a comma-separated list of domains. - i.e. `corsAccessList` is `https://harpersystems.dev,https://products.harpersystems.dev` + i.e. `corsAccessList` is `https://harpersystems.dev,https://products.harpersystems.dev` + 1. To clear out the access list and allow all domains: `corsAccessList` is `[null]` ## SSL diff --git a/site/versioned_docs/version-4.5/developers/security/index.md b/site/versioned_docs/version-4.5/developers/security/index.md index 55897945..6539f007 100644 --- a/site/versioned_docs/version-4.5/developers/security/index.md +++ b/site/versioned_docs/version-4.5/developers/security/index.md @@ -6,8 +6,8 @@ title: Security Harper uses role-based, attribute-level security to ensure that users can only gain access to the data they’re supposed to be able to access. Our granular permissions allow for unparalleled flexibility and control, and can actually lower the total cost of ownership compared to other database solutions, since you no longer have to replicate subsets of your data to isolate use cases. -* [JWT Authentication](./jwt-auth) -* [Basic Authentication](./basic-auth) -* [mTLS Authentication](./mtls-auth) -* [Configuration](./configuration) -* [Users and Roles](./users-and-roles) +- [JWT Authentication](./jwt-auth) +- [Basic Authentication](./basic-auth) +- [mTLS Authentication](./mtls-auth) +- [Configuration](./configuration) +- [Users and Roles](./users-and-roles) diff --git a/site/versioned_docs/version-4.5/developers/security/jwt-auth.md b/site/versioned_docs/version-4.5/developers/security/jwt-auth.md index 5dda54ed..0ea7290f 100644 --- a/site/versioned_docs/version-4.5/developers/security/jwt-auth.md +++ b/site/versioned_docs/version-4.5/developers/security/jwt-auth.md @@ -8,8 +8,8 @@ Harper uses token based authentication with JSON Web Tokens, JWTs. This consists of two primary operations `create_authentication_tokens` and `refresh_operation_token`. These generate two types of tokens, as follows: -* The `operation_token` which is used to authenticate all Harper operations in the Bearer Token Authorization Header. The default expiry is one day. -* The `refresh_token` which is used to generate a new `operation_token` upon expiry. This token is used in the Bearer Token Authorization Header for the `refresh_operation_token` operation only. The default expiry is thirty days. +- The `operation_token` which is used to authenticate all Harper operations in the Bearer Token Authorization Header. The default expiry is one day. +- The `refresh_token` which is used to generate a new `operation_token` upon expiry. This token is used in the Bearer Token Authorization Header for the `refresh_operation_token` operation only. The default expiry is thirty days. The `create_authentication_tokens` operation can be used at any time to refresh both tokens in the event that both have expired or been lost. @@ -19,9 +19,9 @@ Users must initially create tokens using their Harper credentials. The following ```json { - "operation": "create_authentication_tokens", - "username": "username", - "password": "password" + "operation": "create_authentication_tokens", + "username": "username", + "password": "password" } ``` @@ -41,8 +41,8 @@ An example expected return object is: ```json { - "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDUwNjQ2MDAsInN1YiI6Im9wZXJhdGlvbiJ9.MpQA-9CMjA-mn-7mHyUXSuSC_-kqMqJXp_NDiKLFtbtMRbodCuY3DzH401rvy_4vb0yCELf0B5EapLVY1545sv80nxSl6FoZFxQaDWYXycoia6zHpiveR8hKlmA6_XTWHJbY2FM1HAFrdtt3yUTiF-ylkdNbPG7u7fRjTmHfsZ78gd2MNWIDkHoqWuFxIyqk8XydQpsjULf2Uacirt9FmHfkMZ-Jr_rRpcIEW0FZyLInbm6uxLfseFt87wA0TbZ0ofImjAuaW_3mYs-3H48CxP152UJ0jByPb0kHsk1QKP7YHWx1-Wce9NgNADfG5rfgMHANL85zvkv8sJmIGZIoSpMuU3CIqD2rgYnMY-L5dQN1fgfROrPMuAtlYCRK7r-IpjvMDQtRmCiNG45nGsM4DTzsa5GyDrkGssd5OBhl9gr9z9Bb5HQVYhSKIOiy72dK5dQNBklD4eGLMmo-u322zBITmE0lKaBcwYGJw2mmkYcrjDOmsDseU6Bf_zVUd9WF3FqwNkhg4D7nrfNSC_flalkxPHckU5EC_79cqoUIX2ogufBW5XgYbU4WfLloKcIpb51YTZlZfwBHlHPSyaq_guaXFaeCUXKq39_i1n0HRF_mRaxNru0cNDFT9Fm3eD7V8axFijSVAMDyQs_JR7SY483YDKUfN4l-vw-EVynImr4", - "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDc1NzAyMDAsInN1YiI6InJlZnJlc2gifQ.acaCsk-CJWIMLGDZdGnsthyZsJfQ8ihXLyE8mTji8PgGkpbwhs7e1O0uitMgP_pGjHq2tey1BHSwoeCL49b18WyMIB10hK-q2BXGKQkykltjTrQbg7VsdFi0h57mGfO0IqAwYd55_hzHZNnyJMh4b0iPQFDwU7iTD7x9doHhZAvzElpkWbc_NKVw5_Mw3znjntSzbuPN105zlp4Niurin-_5BnukwvoJWLEJ-ZlF6hE4wKhaMB1pWTJjMvJQJE8khTTvlUN8tGxmzoaDYoe1aCGNxmDEQnx8Y5gKzVd89sylhqi54d2nQrJ2-ElfEDsMoXpR01Ps6fNDFtLTuPTp7ixj8LvgL2nCjAg996Ga3PtdvXJAZPDYCqqvaBkZZcsiqOgqLV0vGo3VVlfrcgJXQImMYRr_Inu0FCe47A93IAWuQTs-KplM1KdGJsHSnNBV6oe6QEkROJT5qZME-8xhvBYvOXqp9Znwg39bmiBCMxk26Ce66_vw06MNgoa3D5AlXPWemfdVKPZDnj_aLVjZSs0gAfFElcVn7l9yjWJOaT2Muk26U8bJl-2BEq_DSclqKHODuYM5kkPKIdE4NFrsqsDYuGxcA25rlNETFyl0q-UXj1aoz_joy5Hdnr4mFELmjnoo4jYQuakufP9xeGPsj1skaodKl0mmoGcCD6v1F60" + "operation_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDUwNjQ2MDAsInN1YiI6Im9wZXJhdGlvbiJ9.MpQA-9CMjA-mn-7mHyUXSuSC_-kqMqJXp_NDiKLFtbtMRbodCuY3DzH401rvy_4vb0yCELf0B5EapLVY1545sv80nxSl6FoZFxQaDWYXycoia6zHpiveR8hKlmA6_XTWHJbY2FM1HAFrdtt3yUTiF-ylkdNbPG7u7fRjTmHfsZ78gd2MNWIDkHoqWuFxIyqk8XydQpsjULf2Uacirt9FmHfkMZ-Jr_rRpcIEW0FZyLInbm6uxLfseFt87wA0TbZ0ofImjAuaW_3mYs-3H48CxP152UJ0jByPb0kHsk1QKP7YHWx1-Wce9NgNADfG5rfgMHANL85zvkv8sJmIGZIoSpMuU3CIqD2rgYnMY-L5dQN1fgfROrPMuAtlYCRK7r-IpjvMDQtRmCiNG45nGsM4DTzsa5GyDrkGssd5OBhl9gr9z9Bb5HQVYhSKIOiy72dK5dQNBklD4eGLMmo-u322zBITmE0lKaBcwYGJw2mmkYcrjDOmsDseU6Bf_zVUd9WF3FqwNkhg4D7nrfNSC_flalkxPHckU5EC_79cqoUIX2ogufBW5XgYbU4WfLloKcIpb51YTZlZfwBHlHPSyaq_guaXFaeCUXKq39_i1n0HRF_mRaxNru0cNDFT9Fm3eD7V8axFijSVAMDyQs_JR7SY483YDKUfN4l-vw-EVynImr4", + "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjA0OTc4MjAwLCJleHAiOjE2MDc1NzAyMDAsInN1YiI6InJlZnJlc2gifQ.acaCsk-CJWIMLGDZdGnsthyZsJfQ8ihXLyE8mTji8PgGkpbwhs7e1O0uitMgP_pGjHq2tey1BHSwoeCL49b18WyMIB10hK-q2BXGKQkykltjTrQbg7VsdFi0h57mGfO0IqAwYd55_hzHZNnyJMh4b0iPQFDwU7iTD7x9doHhZAvzElpkWbc_NKVw5_Mw3znjntSzbuPN105zlp4Niurin-_5BnukwvoJWLEJ-ZlF6hE4wKhaMB1pWTJjMvJQJE8khTTvlUN8tGxmzoaDYoe1aCGNxmDEQnx8Y5gKzVd89sylhqi54d2nQrJ2-ElfEDsMoXpR01Ps6fNDFtLTuPTp7ixj8LvgL2nCjAg996Ga3PtdvXJAZPDYCqqvaBkZZcsiqOgqLV0vGo3VVlfrcgJXQImMYRr_Inu0FCe47A93IAWuQTs-KplM1KdGJsHSnNBV6oe6QEkROJT5qZME-8xhvBYvOXqp9Znwg39bmiBCMxk26Ce66_vw06MNgoa3D5AlXPWemfdVKPZDnj_aLVjZSs0gAfFElcVn7l9yjWJOaT2Muk26U8bJl-2BEq_DSclqKHODuYM5kkPKIdE4NFrsqsDYuGxcA25rlNETFyl0q-UXj1aoz_joy5Hdnr4mFELmjnoo4jYQuakufP9xeGPsj1skaodKl0mmoGcCD6v1F60" } ``` @@ -90,7 +90,7 @@ The `refresh_token` also expires at a set interval, but a longer interval. Once Token timeouts are configurable in [harperdb-config.yaml](../../deployments/configuration) with the following parameters: -* `operationsApi.authentication.operationTokenTimeout`: Defines the length of time until the operation\_token expires (default 1d). -* `operationsApi.authentication.refreshTokenTimeout`: Defines the length of time until the refresh\_token expires (default 30d). +- `operationsApi.authentication.operationTokenTimeout`: Defines the length of time until the operation_token expires (default 1d). +- `operationsApi.authentication.refreshTokenTimeout`: Defines the length of time until the refresh_token expires (default 30d). A full list of valid values for both parameters can be found [here](https://github.com/vercel/ms). diff --git a/site/versioned_docs/version-4.5/developers/security/mtls-auth.md b/site/versioned_docs/version-4.5/developers/security/mtls-auth.md index 0d4538aa..375ec927 100644 --- a/site/versioned_docs/version-4.5/developers/security/mtls-auth.md +++ b/site/versioned_docs/version-4.5/developers/security/mtls-auth.md @@ -4,4 +4,4 @@ title: mTLS Authentication # mTLS Authentication -Harper supports mTLS authentication for incoming connections. When enabled in the [HTTP config settings](../../deployments/configuration#http) the client certificate will be checked against the certificate authority specified with `tls.certificateAuthority`. If the certificate can be properly verified, the connection will authenticate users where the user's id/username is specified by the `CN` (common name) from the client certificate's `subject`, by default. The [HTTP config settings](../../deployments/configuration#http) allow you to determine if mTLS is required for all connections or optional. \ No newline at end of file +Harper supports mTLS authentication for incoming connections. When enabled in the [HTTP config settings](../../deployments/configuration#http) the client certificate will be checked against the certificate authority specified with `tls.certificateAuthority`. If the certificate can be properly verified, the connection will authenticate users where the user's id/username is specified by the `CN` (common name) from the client certificate's `subject`, by default. The [HTTP config settings](../../deployments/configuration#http) allow you to determine if mTLS is required for all connections or optional. diff --git a/site/versioned_docs/version-4.5/developers/security/users-and-roles.md b/site/versioned_docs/version-4.5/developers/security/users-and-roles.md index c3c2beb3..76ed6901 100644 --- a/site/versioned_docs/version-4.5/developers/security/users-and-roles.md +++ b/site/versioned_docs/version-4.5/developers/security/users-and-roles.md @@ -19,65 +19,66 @@ Role permissions in Harper are broken into two categories – permissions around **Built-In Roles** -There are three built-in roles within Harper. See full breakdown of operations restricted to only super\_user roles [here](./users-and-roles#role-based-operation-restrictions). +There are three built-in roles within Harper. See full breakdown of operations restricted to only super_user roles [here](./users-and-roles#role-based-operation-restrictions). -* `super_user` - This role provides full access to all operations and methods within a Harper instance, this can be considered the admin role. - * This role provides full access to all Database Definition operations and the ability to run Database Manipulation operations across the entire database schema with no restrictions. -* `cluster_user` - This role is an internal system role type that is managed internally to allow clustered instances to communicate with one another. - * This role is an internally managed role to facilitate communication between clustered instances. -* `structure_user` - This role provides specific access for creation and deletion of data. - * When defining this role type you can either assign a value of true which will allow the role to create and drop databases & tables. Alternatively the role type can be assigned a string array. The values in this array are databases and allows the role to only create and drop tables in the designated databases. +- `super_user` - This role provides full access to all operations and methods within a Harper instance, this can be considered the admin role. + - This role provides full access to all Database Definition operations and the ability to run Database Manipulation operations across the entire database schema with no restrictions. +- `cluster_user` - This role is an internal system role type that is managed internally to allow clustered instances to communicate with one another. + - This role is an internally managed role to facilitate communication between clustered instances. +- `structure_user` - This role provides specific access for creation and deletion of data. + - When defining this role type you can either assign a value of true which will allow the role to create and drop databases & tables. Alternatively the role type can be assigned a string array. The values in this array are databases and allows the role to only create and drop tables in the designated databases. **User-Defined Roles** -In addition to built-in roles, admins (i.e. users assigned to the super\_user role) can create customized roles for other users to interact with and manipulate the data within explicitly defined tables and attributes. +In addition to built-in roles, admins (i.e. users assigned to the super_user role) can create customized roles for other users to interact with and manipulate the data within explicitly defined tables and attributes. -* Unless the user-defined role is given `super_user` permissions, permissions must be defined explicitly within the request body JSON. -* Describe operations will return metadata for all databases, tables, and attributes that a user-defined role has CRUD permissions for. +- Unless the user-defined role is given `super_user` permissions, permissions must be defined explicitly within the request body JSON. +- Describe operations will return metadata for all databases, tables, and attributes that a user-defined role has CRUD permissions for. **Role Permissions** When creating a new, user-defined role in a Harper instance, you must provide a role name and the permissions to assign to that role. _Reminder, only super users can create and manage roles._ -* `role` name used to easily identify the role assigned to individual users. +- `role` name used to easily identify the role assigned to individual users. - _Roles can be altered/dropped based on the role name used in and returned from a successful `add_role` , `alter_role`, or `list_roles` operation._ -* `permissions` used to explicitly define CRUD access to existing table data. + _Roles can be altered/dropped based on the role name used in and returned from a successful `add_role` , `alter_role`, or `list_roles` operation._ + +- `permissions` used to explicitly define CRUD access to existing table data. Example JSON for `add_role` request ```json { - "operation":"add_role", - "role":"software_developer", - "permission":{ - "super_user":false, - "database_name":{ - "tables": { - "table_name1": { - "read":true, - "insert":true, - "update":true, - "delete":false, - "attribute_permissions":[ - { - "attribute_name":"attribute1", - "read":true, - "insert":true, - "update":true - } - ] - }, - "table_name2": { - "read":true, - "insert":true, - "update":true, - "delete":false, - "attribute_permissions":[] - } - } - } - } + "operation": "add_role", + "role": "software_developer", + "permission": { + "super_user": false, + "database_name": { + "tables": { + "table_name1": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [ + { + "attribute_name": "attribute1", + "read": true, + "insert": true, + "update": true + } + ] + }, + "table_name2": { + "read": true, + "insert": true, + "update": true, + "delete": false, + "attribute_permissions": [] + } + } + } + } } ``` @@ -85,12 +86,13 @@ Example JSON for `add_role` request There are two parts to a permissions set: -* `super_user` – boolean value indicating if role should be provided super\_user access. +- `super_user` – boolean value indicating if role should be provided super_user access. + + _If `super_user` is set to true, there should be no additional database-specific permissions values included since the role will have access to the entire database schema. If permissions are included in the body of the operation, they will be stored within Harper, but ignored, as super_users have full access to the database._ - _If `super_user` is set to true, there should be no additional database-specific permissions values included since the role will have access to the entire database schema. If permissions are included in the body of the operation, they will be stored within Harper, but ignored, as super\_users have full access to the database._ -* `permissions`: Database tables that a role should have specific CRUD access to should be included in the final, database-specific `permissions` JSON. +- `permissions`: Database tables that a role should have specific CRUD access to should be included in the final, database-specific `permissions` JSON. - _For user-defined roles (i.e. non-super\_user roles, blank permissions will result in the user being restricted from accessing any of the database schema._ + _For user-defined roles (i.e. non-super_user roles, blank permissions will result in the user being restricted from accessing any of the database schema._ **Table Permissions JSON** @@ -124,139 +126,142 @@ Each table that a role should be given some level of CRUD permissions to must be 1. If there are attribute-specific CRUD permissions that need to be enforced on a table, those need to be explicitly described in the `attribute_permissions` array. 1. If a non-hash attribute is given some level of CRUD access, that same access will be assigned to the table’s `hash_attribute` (also referred to as the `primary_key`), even if it is not explicitly defined in the permissions JSON. - _See table\_name1’s permission set for an example of this – even though the table’s hash attribute is not specifically defined in the attribute\_permissions array, because the role has CRUD access to ‘attribute1’, the role will have the same access to the table’s hash attribute._ -1. If attribute-level permissions are set – _i.e. attribute\_permissions.length > 0_ – any table attribute not explicitly included will be assumed to have not CRUD access (with the exception of the `hash_attribute` described in #2). + _See table_name1’s permission set for an example of this – even though the table’s hash attribute is not specifically defined in the attribute_permissions array, because the role has CRUD access to ‘attribute1’, the role will have the same access to the table’s hash attribute._ + +1. If attribute-level permissions are set – _i.e. attribute_permissions.length > 0_ – any table attribute not explicitly included will be assumed to have not CRUD access (with the exception of the `hash_attribute` described in #2). + + _See table_name1’s permission set for an example of this – in this scenario, the role will have the ability to create, insert and update ‘attribute1’ and the table’s hash attribute but no other attributes on that table._ - _See table\_name1’s permission set for an example of this – in this scenario, the role will have the ability to create, insert and update ‘attribute1’ and the table’s hash attribute but no other attributes on that table._ 1. If an `attribute_permissions` array is empty, the role’s access to a table’s attributes will be based on the table-level CRUD permissions. - _See table\_name2’s permission set for an example of this._ + _See table_name2’s permission set for an example of this._ + 1. The `__createdtime__` and `__updatedtime__` attributes that Harper manages internally can have read perms set but, if set, all other attribute-level permissions will be ignored. 1. Please note that DELETE permissions are not included as a part of an individual attribute-level permission set. That is because it is not possible to delete individual attributes from a row, rows must be deleted in full. - * If a role needs the ability to delete rows from a table, that permission should be set on the table-level. - * The practical approach to deleting an individual attribute of a row would be to set that attribute to null via an update statement. + - If a role needs the ability to delete rows from a table, that permission should be set on the table-level. + - The practical approach to deleting an individual attribute of a row would be to set that attribute to null via an update statement. ## `Role-Based Operation Restrictions ` -The table below includes all API operations available in Harper and indicates whether or not the operation is restricted to super\_user roles. - -_Keep in mind that non-super\_user roles will also be restricted within the operations they do have access to by the database-level CRUD permissions set for the roles._ - -| Databases and Tables | Restricted to Super\_Users | -|----------------------| :------------------------: | -| describe\_all | | -| describe\_database | | -| describe\_table | | -| create\_database | X | -| drop\_database | X | -| create\_table | X | -| drop\_table | X | -| create\_attribute | | -| drop\_attribute | X | - -| NoSQL Operations | Restricted to Super\_Users | -| ---------------------- | :------------------------: | -| insert | | -| update | | -| upsert | | -| delete | | -| search\_by\_hash | | -| search\_by\_value | | -| search\_by\_conditions | | - -| SQL Operations | Restricted to Super\_Users | -| -------------- | :------------------------: | -| select | | -| insert | | -| update | | -| delete | | - -| Bulk Operations | Restricted to Super\_Users | -| ---------------- | :------------------------: | -| csv\_data\_load | | -| csv\_file\_load | | -| csv\_url\_load | | -| import\_from\_s3 | | - -| Users and Roles | Restricted to Super\_Users | -| --------------- | :------------------------: | -| list\_roles | X | -| add\_role | X | -| alter\_role | X | -| drop\_role | X | -| list\_users | X | -| user\_info | | -| add\_user | X | -| alter\_user | X | -| drop\_user | X | - -| Clustering | Restricted to Super\_Users | -| ----------------------- | :------------------------: | -| cluster\_set\_routes | X | -| cluster\_get\_routes | X | -| cluster\_delete\_routes | X | -| add\_node | X | -| update\_node | X | -| cluster\_status | X | -| remove\_node | X | -| configure\_cluster | X | - -| Components | Restricted to Super\_Users | -| -------------------- | :------------------------: | -| get\_components | X | -| get\_component\_file | X | -| set\_component\_file | X | -| drop\_component | X | -| add\_component | X | -| package\_component | X | -| deploy\_component | X | - -| Custom Functions | Restricted to Super\_Users | -| ---------------------------------- | :------------------------: | -| custom\_functions\_status | X | -| get\_custom\_functions | X | -| get\_custom\_function | X | -| set\_custom\_function | X | -| drop\_custom\_function | X | -| add\_custom\_function\_project | X | -| drop\_custom\_function\_project | X | -| package\_custom\_function\_project | X | -| deploy\_custom\_function\_project | X | - -| Registration | Restricted to Super\_Users | -| ------------------ | :------------------------: | -| registration\_info | | -| get\_fingerprint | X | -| set\_license | X | - -| Jobs | Restricted to Super\_Users | -| ----------------------------- | :------------------------: | -| get\_job | | -| search\_jobs\_by\_start\_date | X | - -| Logs | Restricted to Super\_Users | -| --------------------------------- | :------------------------: | -| read\_log | X | -| read\_transaction\_log | X | -| delete\_transaction\_logs\_before | X | -| read\_audit\_log | X | -| delete\_audit\_logs\_before | X | - -| Utilities | Restricted to Super\_Users | -| ----------------------- | :------------------------: | -| delete\_records\_before | X | -| export\_local | X | -| export\_to\_s3 | X | -| system\_information | X | -| restart | X | -| restart\_service | X | -| get\_configuration | X | -| configure\_cluster | X | - -| Token Authentication | Restricted to Super\_Users | -| ------------------------------ | :------------------------: | -| create\_authentication\_tokens | | -| refresh\_operation\_token | | +The table below includes all API operations available in Harper and indicates whether or not the operation is restricted to super_user roles. + +_Keep in mind that non-super_user roles will also be restricted within the operations they do have access to by the database-level CRUD permissions set for the roles._ + +| Databases and Tables | Restricted to Super_Users | +| -------------------- | :-----------------------: | +| describe_all | | +| describe_database | | +| describe_table | | +| create_database | X | +| drop_database | X | +| create_table | X | +| drop_table | X | +| create_attribute | | +| drop_attribute | X | + +| NoSQL Operations | Restricted to Super_Users | +| -------------------- | :-----------------------: | +| insert | | +| update | | +| upsert | | +| delete | | +| search_by_hash | | +| search_by_value | | +| search_by_conditions | | + +| SQL Operations | Restricted to Super_Users | +| -------------- | :-----------------------: | +| select | | +| insert | | +| update | | +| delete | | + +| Bulk Operations | Restricted to Super_Users | +| --------------- | :-----------------------: | +| csv_data_load | | +| csv_file_load | | +| csv_url_load | | +| import_from_s3 | | + +| Users and Roles | Restricted to Super_Users | +| --------------- | :-----------------------: | +| list_roles | X | +| add_role | X | +| alter_role | X | +| drop_role | X | +| list_users | X | +| user_info | | +| add_user | X | +| alter_user | X | +| drop_user | X | + +| Clustering | Restricted to Super_Users | +| --------------------- | :-----------------------: | +| cluster_set_routes | X | +| cluster_get_routes | X | +| cluster_delete_routes | X | +| add_node | X | +| update_node | X | +| cluster_status | X | +| remove_node | X | +| configure_cluster | X | + +| Components | Restricted to Super_Users | +| ------------------ | :-----------------------: | +| get_components | X | +| get_component_file | X | +| set_component_file | X | +| drop_component | X | +| add_component | X | +| package_component | X | +| deploy_component | X | + +| Custom Functions | Restricted to Super_Users | +| ------------------------------- | :-----------------------: | +| custom_functions_status | X | +| get_custom_functions | X | +| get_custom_function | X | +| set_custom_function | X | +| drop_custom_function | X | +| add_custom_function_project | X | +| drop_custom_function_project | X | +| package_custom_function_project | X | +| deploy_custom_function_project | X | + +| Registration | Restricted to Super_Users | +| ----------------- | :-----------------------: | +| registration_info | | +| get_fingerprint | X | +| set_license | X | + +| Jobs | Restricted to Super_Users | +| ------------------------- | :-----------------------: | +| get_job | | +| search_jobs_by_start_date | X | + +| Logs | Restricted to Super_Users | +| ------------------------------ | :-----------------------: | +| read_log | X | +| read_transaction_log | X | +| delete_transaction_logs_before | X | +| read_audit_log | X | +| delete_audit_logs_before | X | + +| Utilities | Restricted to Super_Users | +| --------------------- | :-----------------------: | +| delete_records_before | X | +| export_local | X | +| export_to_s3 | X | +| system_information | X | +| restart | X | +| restart_service | X | +| get_configuration | X | +| configure_cluster | X | + +| Token Authentication | Restricted to Super_Users | +| ---------------------------- | :-----------------------: | +| create_authentication_tokens | | +| refresh_operation_token | | ## Error: Must execute as User @@ -264,4 +269,4 @@ _Keep in mind that non-super\_user roles will also be restricted within the oper This means that you installed Harper as `<>`. Because Harper stores files natively on the operating system, we only allow the Harper executable to be run by a single user. This prevents permissions issues on files. -For example if you installed as user\_a, but later wanted to run as user\_b. User\_b may not have access to the hdb files Harper needs. This also keeps Harper more secure as it allows you to lock files down to a specific user and prevents other users from accessing your files. +For example if you installed as user_a, but later wanted to run as user_b. User_b may not have access to the hdb files Harper needs. This also keeps Harper more secure as it allows you to lock files down to a specific user and prevents other users from accessing your files. diff --git a/site/versioned_docs/version-4.5/developers/sql-guide/date-functions.md b/site/versioned_docs/version-4.5/developers/sql-guide/date-functions.md index 8503ca91..d44917c3 100644 --- a/site/versioned_docs/version-4.5/developers/sql-guide/date-functions.md +++ b/site/versioned_docs/version-4.5/developers/sql-guide/date-functions.md @@ -44,6 +44,7 @@ Referencing this variable will evaluate as the current Unix Timestamp in millise "current_timestamp_result": 1587568845765 } ``` + ### DATE([date_string]) Formats and returns the date_string argument in UTC in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. @@ -68,9 +69,8 @@ If a date_string is not provided, the function will return the current UTC date/ Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. - | Key | Shorthand | -|--------------|-----------| +| ------------ | --------- | | years | y | | quarters | Q | | months | M | @@ -81,7 +81,6 @@ Adds the defined amount of time to the date provided in UTC and returns the resu | seconds | s | | milliseconds | ms | - ``` "SELECT DATE_ADD(1587568845765, 1, 'days') AS date_add_result" AND "SELECT DATE_ADD(1587568845765, 1, 'd') AS date_add_result" both return @@ -103,13 +102,14 @@ AS date_add_result2" returns Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. Accepted interval values: -* years -* months -* weeks -* days -* hours -* minutes -* seconds + +- years +- months +- weeks +- days +- hours +- minutes +- seconds ``` "SELECT DATE_DIFF(CURRENT_TIMESTAMP, 1650643129017, 'hours') @@ -136,7 +136,7 @@ AS date_format_result" returns Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date_sub interval values- Either string value (key or shorthand) can be passed as the interval argument. | Key | Shorthand | -|--------------|-----------| +| ------------ | --------- | | years | y | | quarters | Q | | months | M | @@ -147,7 +147,6 @@ Subtracts the defined amount of time from the date provided in UTC and returns t | seconds | s | | milliseconds | ms | - ``` "SELECT DATE_SUB(1587568845765, 2, 'years') AS date_sub_result" returns { @@ -159,15 +158,15 @@ Subtracts the defined amount of time from the date provided in UTC and returns t Extracts and returns the date_part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” -| date_part | Example return value* | -|--------------|------------------------| -| year | “2020” | -| month | “3” | -| day | “26” | - | hour | “15” | -| minute | “13” | -| second | “2” | -| millisecond | “41” | +| date_part | Example return value\* | +| ----------- | ---------------------- | +| year | “2020” | +| month | “3” | +| day | “26” | +| hour | “15” | +| minute | “13” | +| second | “2” | +| millisecond | “41” | ``` "SELECT EXTRACT(1587568845765, 'year') AS extract_result" returns @@ -188,6 +187,7 @@ Returns the current Unix Timestamp in milliseconds. ``` ### GET_SERVER_TIME() + Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. ``` @@ -198,6 +198,7 @@ Returns the current date/time value based on the server’s timezone in `YYYY-MM ``` ### OFFSET_UTC(date, offset) + Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. ``` @@ -215,6 +216,7 @@ Returns the UTC date time value with the offset provided included in the return ``` ### NOW() + Returns the current Unix Timestamp in milliseconds. ``` @@ -223,4 +225,3 @@ Returns the current Unix Timestamp in milliseconds. "now_result": 1587568845765 } ``` - diff --git a/site/versioned_docs/version-4.5/developers/sql-guide/features-matrix.md b/site/versioned_docs/version-4.5/developers/sql-guide/features-matrix.md index f4225cf9..f436ad62 100644 --- a/site/versioned_docs/version-4.5/developers/sql-guide/features-matrix.md +++ b/site/versioned_docs/version-4.5/developers/sql-guide/features-matrix.md @@ -12,77 +12,77 @@ Harper encourages developers to utilize other querying tools over SQL for perfor Harper provides access to most SQL functions, and we’re always expanding that list. Check below to see if we cover what you need. -| INSERT | | -| ---------------------------------- | - | -| Values - multiple values supported | ✔ | -| Sub-SELECT | ✗ | +| INSERT | | +| ---------------------------------- | --- | +| Values - multiple values supported | ✔ | +| Sub-SELECT | ✗ | -| UPDATE | | -| ---------------- | - | -| SET | ✔ | -| Sub-SELECT | ✗ | -| Conditions | ✔ | -| Date Functions\* | ✔ | -| Math Functions | ✔ | +| UPDATE | | +| ---------------- | --- | +| SET | ✔ | +| Sub-SELECT | ✗ | +| Conditions | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | -| DELETE | | -| ---------- | - | -| FROM | ✔ | -| Sub-SELECT | ✗ | -| Conditions | ✔ | +| DELETE | | +| ---------- | --- | +| FROM | ✔ | +| Sub-SELECT | ✗ | +| Conditions | ✔ | -| SELECT | | -| -------------------- | - | -| Column SELECT | ✔ | -| Aliases | ✔ | -| Aggregator Functions | ✔ | -| Date Functions\* | ✔ | -| Math Functions | ✔ | -| Constant Values | ✔ | -| Distinct | ✔ | -| Sub-SELECT | ✗ | +| SELECT | | +| -------------------- | --- | +| Column SELECT | ✔ | +| Aliases | ✔ | +| Aggregator Functions | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | +| Constant Values | ✔ | +| Distinct | ✔ | +| Sub-SELECT | ✗ | -| FROM | | -| ---------------- | - | -| Multi-table JOIN | ✔ | -| INNER JOIN | ✔ | -| LEFT OUTER JOIN | ✔ | -| LEFT INNER JOIN | ✔ | -| RIGHT OUTER JOIN | ✔ | -| RIGHT INNER JOIN | ✔ | -| FULL JOIN | ✔ | -| UNION | ✗ | -| Sub-SELECT | ✗ | -| TOP | ✔ | +| FROM | | +| ---------------- | --- | +| Multi-table JOIN | ✔ | +| INNER JOIN | ✔ | +| LEFT OUTER JOIN | ✔ | +| LEFT INNER JOIN | ✔ | +| RIGHT OUTER JOIN | ✔ | +| RIGHT INNER JOIN | ✔ | +| FULL JOIN | ✔ | +| UNION | ✗ | +| Sub-SELECT | ✗ | +| TOP | ✔ | -| WHERE | | -| -------------------------- | - | -| Multi-Conditions | ✔ | -| Wildcards | ✔ | -| IN | ✔ | -| LIKE | ✔ | -| Bit-wise Operators AND, OR | ✔ | -| Bit-wise Operators NOT | ✔ | -| NULL | ✔ | -| BETWEEN | ✔ | -| EXISTS,ANY,ALL | ✔ | -| Compare columns | ✔ | -| Compare constants | ✔ | -| Date Functions\* | ✔ | -| Math Functions | ✔ | -| Sub-SELECT | ✗ | +| WHERE | | +| -------------------------- | --- | +| Multi-Conditions | ✔ | +| Wildcards | ✔ | +| IN | ✔ | +| LIKE | ✔ | +| Bit-wise Operators AND, OR | ✔ | +| Bit-wise Operators NOT | ✔ | +| NULL | ✔ | +| BETWEEN | ✔ | +| EXISTS,ANY,ALL | ✔ | +| Compare columns | ✔ | +| Compare constants | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | +| Sub-SELECT | ✗ | -| GROUP BY | | -| --------------------- | - | -| Multi-Column GROUP BY | ✔ | +| GROUP BY | | +| --------------------- | --- | +| Multi-Column GROUP BY | ✔ | -| HAVING | | -| ----------------------------- | - | -| Aggregate function conditions | ✔ | +| HAVING | | +| ----------------------------- | --- | +| Aggregate function conditions | ✔ | -| ORDER BY | | -| --------------------- | - | -| Multi-Column ORDER BY | ✔ | -| Aliases | ✔ | -| Date Functions\* | ✔ | -| Math Functions | ✔ | +| ORDER BY | | +| --------------------- | --- | +| Multi-Column ORDER BY | ✔ | +| Aliases | ✔ | +| Date Functions\* | ✔ | +| Math Functions | ✔ | diff --git a/site/versioned_docs/version-4.5/developers/sql-guide/functions.md b/site/versioned_docs/version-4.5/developers/sql-guide/functions.md index 70b9cdfe..0847a657 100644 --- a/site/versioned_docs/version-4.5/developers/sql-guide/functions.md +++ b/site/versioned_docs/version-4.5/developers/sql-guide/functions.md @@ -11,147 +11,149 @@ Harper encourages developers to utilize other querying tools over SQL for perfor This SQL keywords reference contains the SQL functions available in Harper. ## Functions + ### Aggregate -| Keyword | Syntax | Description | -|-----------------|---------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| -| AVG | AVG(_expression_) | Returns the average of a given numeric expression. | -| COUNT | SELECT COUNT(_column_name_) FROM _database.table_ WHERE _condition_ | Returns the number records that match the given criteria. Nulls are not counted. | -| GROUP_CONCAT | GROUP_CONCAT(_expression_) | Returns a string with concatenated values that are comma separated and that are non-null from a group. Will return null when there are non-null values. | -| MAX | SELECT MAX(_column_name_) FROM _database.table_ WHERE _condition_ | Returns largest value in a specified column. | -| MIN | SELECT MIN(_column_name_) FROM _database.table_ WHERE _condition_ | Returns smallest value in a specified column. | -| SUM | SUM(_column_name_) | Returns the sum of the numeric values provided. | -| ARRAY* | ARRAY(_expression_) | Returns a list of data as a field. | -| DISTINCT_ARRAY* | DISTINCT_ARRAY(_expression_) | When placed around a standard ARRAY() function, returns a distinct (deduplicated) results set. | +| Keyword | Syntax | Description | +| ---------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| AVG | AVG(_expression_) | Returns the average of a given numeric expression. | +| COUNT | SELECT COUNT(_column_name_) FROM _database.table_ WHERE _condition_ | Returns the number records that match the given criteria. Nulls are not counted. | +| GROUP_CONCAT | GROUP*CONCAT(\_expression*) | Returns a string with concatenated values that are comma separated and that are non-null from a group. Will return null when there are non-null values. | +| MAX | SELECT MAX(_column_name_) FROM _database.table_ WHERE _condition_ | Returns largest value in a specified column. | +| MIN | SELECT MIN(_column_name_) FROM _database.table_ WHERE _condition_ | Returns smallest value in a specified column. | +| SUM | SUM(_column_name_) | Returns the sum of the numeric values provided. | +| ARRAY\* | ARRAY(_expression_) | Returns a list of data as a field. | +| DISTINCT_ARRAY\* | DISTINCT*ARRAY(\_expression*) | When placed around a standard ARRAY() function, returns a distinct (deduplicated) results set. | -*For more information on ARRAY() and DISTINCT_ARRAY() see [this blog](https://www.harperdb.io/post/sql-queries-to-complex-objects). +\*For more information on ARRAY() and DISTINCT_ARRAY() see [this blog](https://www.harperdb.io/post/sql-queries-to-complex-objects). ### Conversion -| Keyword | Syntax | Description | -|---------|--------------------------------------------------|------------------------------------------------------------------------| -| CAST | CAST(_expression AS datatype(length)_) | Converts a value to a specified datatype. | -| CONVERT | CONVERT(_data_type(length), expression, style_) | Converts a value from one datatype to a different, specified datatype. | - +| Keyword | Syntax | Description | +| ------- | ----------------------------------------------- | ---------------------------------------------------------------------- | +| CAST | CAST(_expression AS datatype(length)_) | Converts a value to a specified datatype. | +| CONVERT | CONVERT(_data_type(length), expression, style_) | Converts a value from one datatype to a different, specified datatype. | ### Date & Time -| Keyword | Syntax | Description | -|-------------------|-----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CURRENT_DATE | CURRENT_DATE() | Returns the current date in UTC in “YYYY-MM-DD” String format. | -| CURRENT_TIME | CURRENT_TIME() | Returns the current time in UTC in “HH:mm:ss.SSS” string format. | -| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | Referencing this variable will evaluate as the current Unix Timestamp in milliseconds. For more information, go here. | +| Keyword | Syntax | Description | +| ----------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------- | +| CURRENT_DATE | CURRENT_DATE() | Returns the current date in UTC in “YYYY-MM-DD” String format. | +| CURRENT_TIME | CURRENT_TIME() | Returns the current time in UTC in “HH:mm:ss.SSS” string format. | +| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | Referencing this variable will evaluate as the current Unix Timestamp in milliseconds. For more information, go here. | + | -| DATE | DATE([_date_string_]) | Formats and returns the date_string argument in UTC in ‘YYYY-MM-DDTHH:mm:ss.SSSZZ’ string format. If a date_string is not provided, the function will return the current UTC date/time value in the return format defined above. For more information, go here. | +| DATE | DATE([_date_string_]) | Formats and returns the date*string argument in UTC in ‘YYYY-MM-DDTHH:mm:ss.SSSZZ’ string format. If a date_string is not provided, the function will return the current UTC date/time value in the return format defined above. For more information, go here. | | -| DATE_ADD | DATE_ADD(_date, value, interval_) | Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | +| DATE_ADD | DATE_ADD(\_date, value, interval*) | Adds the defined amount of time to the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted interval values: Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | | -| DATE_DIFF | DATEDIFF(_date_1, date_2[, interval]_) | Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. For more information, go here. | +| DATE*DIFF | DATEDIFF(\_date_1, date_2[, interval]*) | Returns the difference between the two date values passed based on the interval as a Number. If an interval is not provided, the function will return the difference value in milliseconds. For more information, go here. | | -| DATE_FORMAT | DATE_FORMAT(_date, format_) | Formats and returns a date value in the String format provided. Find more details on accepted format values in the moment.js docs. For more information, go here. | +| DATE*FORMAT | DATE_FORMAT(\_date, format*) | Formats and returns a date value in the String format provided. Find more details on accepted format values in the moment.js docs. For more information, go here. | | -| DATE_SUB | DATE_SUB(_date, format_) | Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date_sub interval values- Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | +| DATE*SUB | DATE_SUB(\_date, format*) | Subtracts the defined amount of time from the date provided in UTC and returns the resulting Unix Timestamp in milliseconds. Accepted date*sub interval values- Either string value (key or shorthand) can be passed as the interval argument. For more information, go here. | | -| DAY | DAY(_date_) | Return the day of the month for the given date. | +| DAY | DAY(\_date*) | Return the day of the month for the given date. | | -| DAYOFWEEK | DAYOFWEEK(_date_) | Returns the numeric value of the weekday of the date given(“YYYY-MM-DD”).NOTE: 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, and 6=Saturday. | -| EXTRACT | EXTRACT(_date, date_part_) | Extracts and returns the date_part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” For more information, go here. | +| DAYOFWEEK | DAYOFWEEK(_date_) | Returns the numeric value of the weekday of the date given(“YYYY-MM-DD”).NOTE: 0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, and 6=Saturday. | +| EXTRACT | EXTRACT(_date, date_part_) | Extracts and returns the date*part requested as a String value. Accepted date_part values below show value returned for date = “2020-03-26T15:13:02.041+000” For more information, go here. | | -| GETDATE | GETDATE() | Returns the current Unix Timestamp in milliseconds. | -| GET_SERVER_TIME | GET_SERVER_TIME() | Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. | -| OFFSET_UTC | OFFSET_UTC(_date, offset_) | Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. | -| NOW | NOW() | Returns the current Unix Timestamp in milliseconds. | +| GETDATE | GETDATE() | Returns the current Unix Timestamp in milliseconds. | +| GET_SERVER_TIME | GET_SERVER_TIME() | Returns the current date/time value based on the server’s timezone in `YYYY-MM-DDTHH:mm:ss.SSSZZ` String format. | +| OFFSET_UTC | OFFSET_UTC(\_date, offset*) | Returns the UTC date time value with the offset provided included in the return String value formatted as `YYYY-MM-DDTHH:mm:ss.SSSZZ`. The offset argument will be added as minutes unless the value is less than 16 and greater than -16, in which case it will be treated as hours. | +| NOW | NOW() | Returns the current Unix Timestamp in milliseconds. | | -| HOUR | HOUR(_datetime_) | Returns the hour part of a given date in range of 0 to 838. | +| HOUR | HOUR(_datetime_) | Returns the hour part of a given date in range of 0 to 838. | | -| MINUTE | MINUTE(_datetime_) | Returns the minute part of a time/datetime in range of 0 to 59. | +| MINUTE | MINUTE(_datetime_) | Returns the minute part of a time/datetime in range of 0 to 59. | | -| MONTH | MONTH(_date_) | Returns month part for a specified date in range of 1 to 12. | +| MONTH | MONTH(_date_) | Returns month part for a specified date in range of 1 to 12. | | -| SECOND | SECOND(_datetime_) | Returns the seconds part of a time/datetime in range of 0 to 59. | -| YEAR | YEAR(_date_) | Returns the year part for a specified date. | +| SECOND | SECOND(_datetime_) | Returns the seconds part of a time/datetime in range of 0 to 59. | +| YEAR | YEAR(_date_) | Returns the year part for a specified date. | | ### Logical -| Keyword | Syntax | Description | -|---------|--------------------------------------------------|--------------------------------------------------------------------------------------------| -| IF | IF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | -| IIF | IIF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | -| IFNULL | IFNULL(_expression, alt_value_) | Returns a specified value if the expression is null. | -| NULLIF | NULLIF(_expression_1, expression_2_) | Returns null if expression_1 is equal to expression_2, if not equal, returns expression_1. | +| Keyword | Syntax | Description | +| ------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------ | +| IF | IF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | +| IIF | IIF(_condition, value_if_true, value_if_false_) | Returns a value if the condition is true, or another value if the condition is false. | +| IFNULL | IFNULL(_expression, alt_value_) | Returns a specified value if the expression is null. | +| NULLIF | NULLIF(_expression_1, expression_2_) | Returns null if expression_1 is equal to expression_2, if not equal, returns expression_1. | ### Mathematical -| Keyword | Syntax | Description | -|---------|---------------------------------|-----------------------------------------------------------------------------------------------------| -| ABS | ABS(_expression_) | Returns the absolute value of a given numeric expression. | -| CEIL | CEIL(_number_) | Returns integer ceiling, the smallest integer value that is bigger than or equal to a given number. | -| EXP | EXP(_number_) | Returns e to the power of a specified number. | -| FLOOR | FLOOR(_number_) | Returns the largest integer value that is smaller than, or equal to, a given number. | -| RANDOM | RANDOM(_seed_) | Returns a pseudo random number. | -| ROUND | ROUND(_number,decimal_places_) | Rounds a given number to a specified number of decimal places. | -| SQRT | SQRT(_expression_) | Returns the square root of an expression. | - +| Keyword | Syntax | Description | +| ------- | ------------------------------ | --------------------------------------------------------------------------------------------------- | +| ABS | ABS(_expression_) | Returns the absolute value of a given numeric expression. | +| CEIL | CEIL(_number_) | Returns integer ceiling, the smallest integer value that is bigger than or equal to a given number. | +| EXP | EXP(_number_) | Returns e to the power of a specified number. | +| FLOOR | FLOOR(_number_) | Returns the largest integer value that is smaller than, or equal to, a given number. | +| RANDOM | RANDOM(_seed_) | Returns a pseudo random number. | +| ROUND | ROUND(_number,decimal_places_) | Rounds a given number to a specified number of decimal places. | +| SQRT | SQRT(_expression_) | Returns the square root of an expression. | ### String -| Keyword | Syntax | Description | -|-------------|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CONCAT | CONCAT(_string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together, resulting in a single string. | -| CONCAT_WS | CONCAT_WS(_separator, string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together with a separator, resulting in a single string. | -| INSTR | INSTR(_string_1, string_2_) | Returns the first position, as an integer, of string_2 within string_1. | -| LEN | LEN(_string_) | Returns the length of a string. | -| LOWER | LOWER(_string_) | Converts a string to lower-case. | -| REGEXP | SELECT _column_name_ FROM _database.table_ WHERE _column_name_ REGEXP _pattern_ | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | -| REGEXP_LIKE | SELECT _column_name_ FROM _database.table_ WHERE REGEXP_LIKE(_column_name, pattern_) | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | -| REPLACE | REPLACE(_string, old_string, new_string_) | Replaces all instances of old_string within new_string, with string. | -| SUBSTRING | SUBSTRING(_string, string_position, length_of_substring_) | Extracts a specified amount of characters from a string. | -| TRIM | TRIM([_character(s) FROM_] _string_) | Removes leading and trailing spaces, or specified character(s), from a string. | -| UPPER | UPPER(_string_) | Converts a string to upper-case. | +| Keyword | Syntax | Description | +| ----------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| CONCAT | CONCAT(_string_1, string_2, ...., string_n_) | Concatenates, or joins, two or more strings together, resulting in a single string. | +| CONCAT_WS | CONCAT*WS(\_separator, string_1, string_2, ...., string_n*) | Concatenates, or joins, two or more strings together with a separator, resulting in a single string. | +| INSTR | INSTR(_string_1, string_2_) | Returns the first position, as an integer, of string_2 within string_1. | +| LEN | LEN(_string_) | Returns the length of a string. | +| LOWER | LOWER(_string_) | Converts a string to lower-case. | +| REGEXP | SELECT _column_name_ FROM _database.table_ WHERE _column_name_ REGEXP _pattern_ | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | +| REGEXP_LIKE | SELECT _column_name_ FROM _database.table_ WHERE REGEXP*LIKE(\_column_name, pattern*) | Searches column for matching string against a given regular expression pattern, provided as a string, and returns all matches. If no matches are found, it returns null. | +| REPLACE | REPLACE(_string, old_string, new_string_) | Replaces all instances of old_string within new_string, with string. | +| SUBSTRING | SUBSTRING(_string, string_position, length_of_substring_) | Extracts a specified amount of characters from a string. | +| TRIM | TRIM([_character(s) FROM_] _string_) | Removes leading and trailing spaces, or specified character(s), from a string. | +| UPPER | UPPER(_string_) | Converts a string to upper-case. | ## Operators + ### Logical Operators -| Keyword | Syntax | Description | -|----------|--------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------| -| BETWEEN | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ BETWEEN _value_1_ AND _value_2_ | (inclusive) Returns values(numbers, text, or dates) within a given range. | -| IN | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IN(_value(s)_) | Used to specify multiple values in a WHERE clause. | -| LIKE | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_n_ LIKE _pattern_ | Searches for a specified pattern within a WHERE clause. | +| Keyword | Syntax | Description | +| ------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| BETWEEN | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ BETWEEN _value_1_ AND _value_2_ | (inclusive) Returns values(numbers, text, or dates) within a given range. | +| IN | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IN(_value(s)_) | Used to specify multiple values in a WHERE clause. | +| LIKE | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_n_ LIKE _pattern_ | Searches for a specified pattern within a WHERE clause. | ## Queries + ### General -| Keyword | Syntax | Description | -|-----------|--------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------| -| DISTINCT | SELECT DISTINCT _column_name(s)_ FROM _database.table_ | Returns only unique values, eliminating duplicate records. | -| FROM | FROM _database.table_ | Used to list the database(s), table(s), and any joins required for a SQL statement. | -| GROUP BY | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ GROUP BY _column_name(s)_ ORDER BY _column_name(s)_ | Groups rows that have the same values into summary rows. | -| HAVING | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ GROUP BY _column_name(s)_ HAVING _condition_ ORDER BY _column_name(s)_ | Filters data based on a group or aggregate function. | -| SELECT | SELECT _column_name(s)_ FROM _database.table_ | Selects data from table. | -| WHERE | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ | Extracts records based on a defined condition. | +| Keyword | Syntax | Description | +| -------- | -------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| DISTINCT | SELECT DISTINCT _column_name(s)_ FROM _database.table_ | Returns only unique values, eliminating duplicate records. | +| FROM | FROM _database.table_ | Used to list the database(s), table(s), and any joins required for a SQL statement. | +| GROUP BY | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ GROUP BY _column_name(s)_ ORDER BY _column_name(s)_ | Groups rows that have the same values into summary rows. | +| HAVING | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ GROUP BY _column_name(s)_ HAVING _condition_ ORDER BY _column_name(s)_ | Filters data based on a group or aggregate function. | +| SELECT | SELECT _column_name(s)_ FROM _database.table_ | Selects data from table. | +| WHERE | SELECT _column_name(s)_ FROM _database.table_ WHERE _condition_ | Extracts records based on a defined condition. | ### Joins -| Keyword | Syntax | Description | -|---------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| CROSS JOIN | SELECT _column_name(s)_ FROM _database.table_1_ CROSS JOIN _database.table_2_ | Returns a paired combination of each row from _table_1_ with row from _table_2_. _Note: CROSS JOIN can return very large result sets and is generally considered bad practice._ | -| FULL OUTER | SELECT _column_name(s)_ FROM _database.table_1_ FULL OUTER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ WHERE _condition_ | Returns all records when there is a match in either _table_1_ (left table) or _table_2_ (right table). | -| [INNER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ INNER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return only matching records from _table_1_ (left table) and _table_2_ (right table). The INNER keyword is optional and does not affect the result. | -| LEFT [OUTER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ LEFT OUTER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return all records from _table_1_ (left table) and matching data from _table_2_ (right table). The OUTER keyword is optional and does not affect the result. | -| RIGHT [OUTER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ RIGHT OUTER JOIN _database.table_2_ ON _table_1.column_name = table_2.column_name_ | Return all records from _table_2_ (right table) and matching data from _table_1_ (left table). The OUTER keyword is optional and does not affect the result. | +| Keyword | Syntax | Description | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| CROSS JOIN | SELECT _column_name(s)_ FROM _database.table_1_ CROSS JOIN _database.table_2_ | Returns a paired combination of each row from _table_1_ with row from _table_2_. _Note: CROSS JOIN can return very large result sets and is generally considered bad practice._ | +| FULL OUTER | SELECT _column_name(s)_ FROM _database.table_1_ FULL OUTER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ WHERE _condition_ | Returns all records when there is a match in either _table_1_ (left table) or _table_2_ (right table). | +| [INNER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ INNER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return only matching records from _table_1_ (left table) and _table_2_ (right table). The INNER keyword is optional and does not affect the result. | +| LEFT [OUTER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ LEFT OUTER JOIN _database.table_2_ ON _table_1.column_name_ _= table_2.column_name_ | Return all records from _table_1_ (left table) and matching data from _table_2_ (right table). The OUTER keyword is optional and does not affect the result. | +| RIGHT [OUTER] JOIN | SELECT _column_name(s)_ FROM _database.table_1_ RIGHT OUTER JOIN _database.table_2_ ON _table_1.column_name = table_2.column_name_ | Return all records from _table_2_ (right table) and matching data from _table_1_ (left table). The OUTER keyword is optional and does not affect the result. | ### Predicates -| Keyword | Syntax | Description | -|--------------|------------------------------------------------------------------------------|----------------------------| -| IS NOT NULL | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IS NOT NULL | Tests for non-null values. | -| IS NULL | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IS NULL | Tests for null values. | +| Keyword | Syntax | Description | +| ----------- | ----------------------------------------------------------------------------- | -------------------------- | +| IS NOT NULL | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IS NOT NULL | Tests for non-null values. | +| IS NULL | SELECT _column_name(s)_ FROM _database.table_ WHERE _column_name_ IS NULL | Tests for null values. | ### Statements -| Keyword | Syntax | Description | -|---------|---------------------------------------------------------------------------------------------|-------------------------------------| +| Keyword | Syntax | Description | +| ------- | --------------------------------------------------------------------------------------------- | ----------------------------------- | | DELETE | DELETE FROM _database.table_ WHERE condition | Deletes existing data from a table. | | INSERT | INSERT INTO _database.table(column_name(s))_ VALUES(_value(s)_) | Inserts new records into a table. | | UPDATE | UPDATE _database.table_ SET _column_1 = value_1, column_2 = value_2, ....,_ WHERE _condition_ | Alters existing records in a table. | diff --git a/site/versioned_docs/version-4.5/developers/sql-guide/index.md b/site/versioned_docs/version-4.5/developers/sql-guide/index.md index 941be5d0..18674950 100644 --- a/site/versioned_docs/version-4.5/developers/sql-guide/index.md +++ b/site/versioned_docs/version-4.5/developers/sql-guide/index.md @@ -72,9 +72,9 @@ DELETE FROM dev.dog Harper allows developers to join any number of tables and currently supports the following join types: -* INNER JOIN LEFT -* INNER JOIN LEFT -* OUTER JOIN +- INNER JOIN LEFT +- INNER JOIN LEFT +- OUTER JOIN Here’s a basic example joining two tables from our Get Started example- joining a dogs table with a breeds table: diff --git a/site/versioned_docs/version-4.5/developers/sql-guide/json-search.md b/site/versioned_docs/version-4.5/developers/sql-guide/json-search.md index a7dddd0a..13bd3b90 100644 --- a/site/versioned_docs/version-4.5/developers/sql-guide/json-search.md +++ b/site/versioned_docs/version-4.5/developers/sql-guide/json-search.md @@ -8,11 +8,11 @@ Harper encourages developers to utilize other querying tools over SQL for perfor # SQL JSON Search -Harper automatically indexes all top level attributes in a row / object written to a table. However, any attributes which hold JSON data do not have their nested attributes indexed. In order to make searching and/or transforming these JSON documents easy, Harper offers a special SQL function called SEARCH\_JSON. The SEARCH\_JSON function works in SELECT & WHERE clauses allowing queries to perform powerful filtering on any element of your JSON by implementing the [JSONata library](https://docs.jsonata.org/overview.html) into our SQL engine. +Harper automatically indexes all top level attributes in a row / object written to a table. However, any attributes which hold JSON data do not have their nested attributes indexed. In order to make searching and/or transforming these JSON documents easy, Harper offers a special SQL function called SEARCH_JSON. The SEARCH_JSON function works in SELECT & WHERE clauses allowing queries to perform powerful filtering on any element of your JSON by implementing the [JSONata library](https://docs.jsonata.org/overview.html) into our SQL engine. ## Syntax -SEARCH\_JSON(_expression, attribute_) +SEARCH_JSON(_expression, attribute_) Executes the supplied string _expression_ against data of the defined top level _attribute_ for each row. The expression both filters and defines output from the JSON document. @@ -24,14 +24,14 @@ Here are two records in the database: ```json [ - { - "id": 1, - "name": ["Harper", "Penny"] - }, - { - "id": 2, - "name": ["Penny"] - } + { + "id": 1, + "name": ["Harper", "Penny"] + }, + { + "id": 2, + "name": ["Penny"] + } ] ``` @@ -64,37 +64,37 @@ A sample of this data from the movie The Avengers looks like ```json [ - { - "cast_id": 46, - "character": "Tony Stark / Iron Man", - "credit_id": "52fe4495c3a368484e02b251", - "gender": "male", - "id": 3223, - "name": "Robert Downey Jr.", - "order": 0 - }, - { - "cast_id": 2, - "character": "Steve Rogers / Captain America", - "credit_id": "52fe4495c3a368484e02b19b", - "gender": "male", - "id": 16828, - "name": "Chris Evans", - "order": 1 - }, - { - "cast_id": 307, - "character": "Bruce Banner / The Hulk", - "credit_id": "5e85e8083344c60015411cfa", - "gender": "male", - "id": 103, - "name": "Mark Ruffalo", - "order": 2 - } + { + "cast_id": 46, + "character": "Tony Stark / Iron Man", + "credit_id": "52fe4495c3a368484e02b251", + "gender": "male", + "id": 3223, + "name": "Robert Downey Jr.", + "order": 0 + }, + { + "cast_id": 2, + "character": "Steve Rogers / Captain America", + "credit_id": "52fe4495c3a368484e02b19b", + "gender": "male", + "id": 16828, + "name": "Chris Evans", + "order": 1 + }, + { + "cast_id": 307, + "character": "Bruce Banner / The Hulk", + "credit_id": "5e85e8083344c60015411cfa", + "gender": "male", + "id": 103, + "name": "Mark Ruffalo", + "order": 2 + } ] ``` -Let’s break down the SEARCH\_JSON function call in the SELECT: +Let’s break down the SEARCH_JSON function call in the SELECT: ``` SEARCH_JSON( @@ -117,7 +117,7 @@ SEARCH_JSON( ) ``` -The first argument passed to SEARCH\_JSON is the expression to execute against the second argument which is the cast attribute on the credits table. This expression will execute for every row. Looking into the expression it starts with “$\[…]” this tells the expression to iterate all elements of the cast array. +The first argument passed to SEARCH_JSON is the expression to execute against the second argument which is the cast attribute on the credits table. This expression will execute for every row. Looking into the expression it starts with “$\[…]” this tells the expression to iterate all elements of the cast array. Then the expression tells the function to only return entries where the name attribute matches any of the actors defined in the array: @@ -131,22 +131,22 @@ So far, we’ve iterated the array and filtered out rows, but we also want the r ```json [ - { - "actor": "Robert Downey Jr.", - "character": "Tony Stark / Iron Man" - }, - { - "actor": "Chris Evans", - "character": "Steve Rogers / Captain America" - }, - { - "actor": "Mark Ruffalo", - "character": "Bruce Banner / The Hulk" - } + { + "actor": "Robert Downey Jr.", + "character": "Tony Stark / Iron Man" + }, + { + "actor": "Chris Evans", + "character": "Steve Rogers / Captain America" + }, + { + "actor": "Mark Ruffalo", + "character": "Bruce Banner / The Hulk" + } ] ``` -Just having the SEARCH\_JSON function in our SELECT is powerful, but given our criteria it would still return every other movie that doesn’t have our matching actors, in order to filter out the movies we do not want we also use SEARCH\_JSON in the WHERE clause. +Just having the SEARCH_JSON function in our SELECT is powerful, but given our criteria it would still return every other movie that doesn’t have our matching actors, in order to filter out the movies we do not want we also use SEARCH_JSON in the WHERE clause. This function call in the WHERE clause is similar, but we don’t need to perform the same transformation as occurred in the SELECT: @@ -172,6 +172,6 @@ SEARCH_JSON( As seen above we execute the same name filter against the cast array, the primary difference is we are wrapping the filtered results in $count(…). As it looks this returns a count of the results back which we then use against our SQL comparator of >= 2. -To see further SEARCH\_JSON examples in action view our Postman Collection that provides a [sample database & data with query examples](../operations-api/advanced-json-sql-examples). +To see further SEARCH_JSON examples in action view our Postman Collection that provides a [sample database & data with query examples](../operations-api/advanced-json-sql-examples). To learn more about how to build expressions check out the JSONata documentation: [https://docs.jsonata.org/overview](https://docs.jsonata.org/overview) diff --git a/site/versioned_docs/version-4.5/developers/sql-guide/reserved-word.md b/site/versioned_docs/version-4.5/developers/sql-guide/reserved-word.md index 8ce9f025..2cd812ba 100644 --- a/site/versioned_docs/version-4.5/developers/sql-guide/reserved-word.md +++ b/site/versioned_docs/version-4.5/developers/sql-guide/reserved-word.md @@ -8,7 +8,7 @@ Harper encourages developers to utilize other querying tools over SQL for perfor # Harper SQL Reserved Words -This is a list of reserved words in the SQL Parser. Use of these words or symbols may result in unexpected behavior or inaccessible tables/attributes. If any of these words must be used, any SQL call referencing a database, table, or attribute must have backticks (`…`) or brackets ([…]) around the variable. +This is a list of reserved words in the SQL Parser. Use of these words or symbols may result in unexpected behavior or inaccessible tables/attributes. If any of these words must be used, any SQL call referencing a database, table, or attribute must have backticks (`…`) or brackets ([…]) around the variable. For Example, for a table called `ASSERT` in the `data` database, a SQL select on that table would look like: @@ -24,184 +24,184 @@ SELECT * from data.[ASSERT] ### RESERVED WORD LIST -* ABSOLUTE -* ACTION -* ADD -* AGGR -* ALL -* ALTER -* AND -* ANTI -* ANY -* APPLY -* ARRAY -* AS -* ASSERT -* ASC -* ATTACH -* AUTOINCREMENT -* AUTO_INCREMENT -* AVG -* BEGIN -* BETWEEN -* BREAK -* BY -* CALL -* CASE -* CAST -* CHECK -* CLASS -* CLOSE -* COLLATE -* COLUMN -* COLUMNS -* COMMIT -* CONSTRAINT -* CONTENT -* CONTINUE -* CONVERT -* CORRESPONDING -* COUNT -* CREATE -* CROSS -* CUBE -* CURRENT_TIMESTAMP -* CURSOR -* DATABASE -* DECLARE -* DEFAULT -* DELETE -* DELETED -* DESC -* DETACH -* DISTINCT -* DOUBLEPRECISION -* DROP -* ECHO -* EDGE -* END -* ENUM -* ELSE -* EXCEPT -* EXISTS -* EXPLAIN -* FALSE -* FETCH -* FIRST -* FOREIGN -* FROM -* GO -* GRAPH -* GROUP -* GROUPING -* HAVING -* HDB_HASH -* HELP -* IF -* IDENTITY -* IS -* IN -* INDEX -* INNER -* INSERT -* INSERTED -* INTERSECT -* INTO -* JOIN -* KEY -* LAST -* LET -* LEFT -* LIKE -* LIMIT -* LOOP -* MATCHED -* MATRIX -* MAX -* MERGE -* MIN -* MINUS -* MODIFY -* NATURAL -* NEXT -* NEW -* NOCASE -* NO -* NOT -* NULL -* OFF -* ON -* ONLY -* OFFSET -* OPEN -* OPTION -* OR -* ORDER -* OUTER -* OVER -* PATH -* PARTITION -* PERCENT -* PLAN -* PRIMARY -* PRINT -* PRIOR -* QUERY -* READ -* RECORDSET -* REDUCE -* REFERENCES -* RELATIVE -* REPLACE -* REMOVE -* RENAME -* REQUIRE -* RESTORE -* RETURN -* RETURNS -* RIGHT -* ROLLBACK -* ROLLUP -* ROW -* SCHEMA -* SCHEMAS -* SEARCH -* SELECT -* SEMI -* SET -* SETS -* SHOW -* SOME -* SOURCE -* STRATEGY -* STORE -* SYSTEM -* SUM -* TABLE -* TABLES -* TARGET -* TEMP -* TEMPORARY -* TEXTSTRING -* THEN -* TIMEOUT -* TO -* TOP -* TRAN -* TRANSACTION -* TRIGGER -* TRUE -* TRUNCATE -* UNION -* UNIQUE -* UPDATE -* USE -* USING -* VALUE -* VERTEX -* VIEW -* WHEN -* WHERE -* WHILE -* WITH -* WORK +- ABSOLUTE +- ACTION +- ADD +- AGGR +- ALL +- ALTER +- AND +- ANTI +- ANY +- APPLY +- ARRAY +- AS +- ASSERT +- ASC +- ATTACH +- AUTOINCREMENT +- AUTO_INCREMENT +- AVG +- BEGIN +- BETWEEN +- BREAK +- BY +- CALL +- CASE +- CAST +- CHECK +- CLASS +- CLOSE +- COLLATE +- COLUMN +- COLUMNS +- COMMIT +- CONSTRAINT +- CONTENT +- CONTINUE +- CONVERT +- CORRESPONDING +- COUNT +- CREATE +- CROSS +- CUBE +- CURRENT_TIMESTAMP +- CURSOR +- DATABASE +- DECLARE +- DEFAULT +- DELETE +- DELETED +- DESC +- DETACH +- DISTINCT +- DOUBLEPRECISION +- DROP +- ECHO +- EDGE +- END +- ENUM +- ELSE +- EXCEPT +- EXISTS +- EXPLAIN +- FALSE +- FETCH +- FIRST +- FOREIGN +- FROM +- GO +- GRAPH +- GROUP +- GROUPING +- HAVING +- HDB_HASH +- HELP +- IF +- IDENTITY +- IS +- IN +- INDEX +- INNER +- INSERT +- INSERTED +- INTERSECT +- INTO +- JOIN +- KEY +- LAST +- LET +- LEFT +- LIKE +- LIMIT +- LOOP +- MATCHED +- MATRIX +- MAX +- MERGE +- MIN +- MINUS +- MODIFY +- NATURAL +- NEXT +- NEW +- NOCASE +- NO +- NOT +- NULL +- OFF +- ON +- ONLY +- OFFSET +- OPEN +- OPTION +- OR +- ORDER +- OUTER +- OVER +- PATH +- PARTITION +- PERCENT +- PLAN +- PRIMARY +- PRINT +- PRIOR +- QUERY +- READ +- RECORDSET +- REDUCE +- REFERENCES +- RELATIVE +- REPLACE +- REMOVE +- RENAME +- REQUIRE +- RESTORE +- RETURN +- RETURNS +- RIGHT +- ROLLBACK +- ROLLUP +- ROW +- SCHEMA +- SCHEMAS +- SEARCH +- SELECT +- SEMI +- SET +- SETS +- SHOW +- SOME +- SOURCE +- STRATEGY +- STORE +- SYSTEM +- SUM +- TABLE +- TABLES +- TARGET +- TEMP +- TEMPORARY +- TEXTSTRING +- THEN +- TIMEOUT +- TO +- TOP +- TRAN +- TRANSACTION +- TRIGGER +- TRUE +- TRUNCATE +- UNION +- UNIQUE +- UPDATE +- USE +- USING +- VALUE +- VERTEX +- VIEW +- WHEN +- WHERE +- WHILE +- WITH +- WORK diff --git a/site/versioned_docs/version-4.5/developers/sql-guide/sql-geospatial-functions.md b/site/versioned_docs/version-4.5/developers/sql-guide/sql-geospatial-functions.md index 59978c1d..0c56cf10 100644 --- a/site/versioned_docs/version-4.5/developers/sql-guide/sql-geospatial-functions.md +++ b/site/versioned_docs/version-4.5/developers/sql-guide/sql-geospatial-functions.md @@ -10,13 +10,11 @@ Harper encourages developers to utilize other querying tools over SQL for perfor Harper geospatial features require data to be stored in a single column using the [GeoJSON standard](https://geojson.org/), a standard commonly used in geospatial technologies. Geospatial functions are available to be used in SQL statements. - - If you are new to GeoJSON you should check out the full specification here: [https://geojson.org/](https://geojson.org/). There are a few important things to point out before getting started. -1) All GeoJSON coordinates are stored in `[longitude, latitude]` format. -2) Coordinates or GeoJSON geometries must be passed as string when written directly in a SQL statement. -3) Note if you are using Postman for you testing. Due to limitations in the Postman client, you will need to escape quotes in your strings and your SQL will need to be passed on a single line. +1. All GeoJSON coordinates are stored in `[longitude, latitude]` format. +2. Coordinates or GeoJSON geometries must be passed as string when written directly in a SQL statement. +3. Note if you are using Postman for you testing. Due to limitations in the Postman client, you will need to escape quotes in your strings and your SQL will need to be passed on a single line. In the examples contained in the left-hand navigation, database and table names may change, but all GeoJSON data will be stored in a column named geo_data. @@ -31,7 +29,7 @@ geoArea(_geoJSON_) ### Parameters | Parameter | Description | -|-----------|---------------------------------| +| --------- | ------------------------------- | | geoJSON | Required. One or more features. | #### Example 1 @@ -72,10 +70,10 @@ geoLength(_geoJSON_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| geoJSON | Required. GeoJSON to measure. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| geoJSON | Required. GeoJSON to measure. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 @@ -116,10 +114,10 @@ geoDifference(_polygon1, polygon2_) ## Parameters -| Parameter | Description | -|------------|----------------------------------------------------------------------------| -| polygon1 | Required. Polygon or MultiPolygon GeoJSON feature. | -| polygon2 | Required. Polygon or MultiPolygon GeoJSON feature to remove from polygon1. | +| Parameter | Description | +| --------- | -------------------------------------------------------------------------- | +| polygon1 | Required. Polygon or MultiPolygon GeoJSON feature. | +| polygon2 | Required. Polygon or MultiPolygon GeoJSON feature to remove from polygon1. | ### Example @@ -173,11 +171,11 @@ geoDistance(_point1, point2_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| point1 | Required. GeoJSON Point specifying the origin. | -| point2 | Required. GeoJSON Point specifying the destination. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| point1 | Required. GeoJSON Point specifying the origin. | +| point2 | Required. GeoJSON Point specifying the destination. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 @@ -208,12 +206,12 @@ geoNear(_point1, point2, distance_[_, units_]) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------------------------------------------| -| point1 | Required. GeoJSON Point specifying the origin. | -| point2 | Required. GeoJSON Point specifying the destination. | -| distance | Required. The maximum distance in units as an integer or decimal. | -| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------------------------------------------- | +| point1 | Required. GeoJSON Point specifying the origin. | +| point2 | Required. GeoJSON Point specifying the destination. | +| distance | Required. The maximum distance in units as an integer or decimal. | +| units | Optional. Specified as a string. Options are ‘degrees’, ‘radians’, ‘miles’, or ‘kilometers’. Default is ‘kilometers’. | ### Example 1 @@ -246,10 +244,10 @@ geoContains(_geo1, geo2_) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------------------------------------------------| -| geo1 | Required. Polygon or MultiPolygon GeoJSON feature. | -| geo2 | Required. Polygon or MultiPolygon GeoJSON feature tested to be contained by geo1. | +| Parameter | Description | +| --------- | --------------------------------------------------------------------------------- | +| geo1 | Required. Polygon or MultiPolygon GeoJSON feature. | +| geo2 | Required. Polygon or MultiPolygon GeoJSON feature tested to be contained by geo1. | ### Example 1 @@ -308,15 +306,18 @@ WHERE geoContains(geo_data, '{ Determines if two GeoJSON features are the same type and have identical X,Y coordinate values. For more information see [https://developers.arcgis.com/documentation/spatial-references/](https://developers.arcgis.com/documentation/spatial-references/). Returns a Boolean. ## Syntax + geoEqual(_geo1_, _geo2_) ## Parameters -| Parameter | Description | -|------------|----------------------------------------| -| geo1 | Required. GeoJSON geometry or feature. | -| geo2 | Required. GeoJSON geometry or feature. | + +| Parameter | Description | +| --------- | -------------------------------------- | +| geo1 | Required. GeoJSON geometry or feature. | +| geo2 | Required. GeoJSON geometry or feature. | ### Example + Find Harper Headquarters within all locations within the database. ``` @@ -343,18 +344,22 @@ WHERE geoEqual(geo_data, '{ ``` # geoCrosses + Determines if the geometries cross over each other. Returns boolean. ## Syntax + geoCrosses(_geo1, geo2_) ## Parameters -| Parameter | Description | -|------------|-----------------------------------------| -| geo1 | Required. GeoJSON geometry or feature. | -| geo2 | Required. GeoJSON geometry or feature. | + +| Parameter | Description | +| --------- | -------------------------------------- | +| geo1 | Required. GeoJSON geometry or feature. | +| geo2 | Required. GeoJSON geometry or feature. | ### Example + Find all locations that cross over a highway. ``` @@ -388,16 +393,19 @@ WHERE geoCrosses( Converts a series of coordinates into a GeoJSON of the specified type. ## Syntax + geoConvert(_coordinates, geo_type_[, _properties_]) ## Parameters -| Parameter | Description | -|--------------|------------------------------------------------------------------------------------------------------------------------------------| -| coordinates | Required. One or more coordinates | -| geo_type | Required. GeoJSON geometry type. Options are ‘point’, ‘lineString’, ‘multiLineString’, ‘multiPoint’, ‘multiPolygon’, and ‘polygon’ | -| properties | Optional. Escaped JSON array with properties to be added to the GeoJSON output. | + +| Parameter | Description | +| ----------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| coordinates | Required. One or more coordinates | +| geo_type | Required. GeoJSON geometry type. Options are ‘point’, ‘lineString’, ‘multiLineString’, ‘multiPoint’, ‘multiPolygon’, and ‘polygon’ | +| properties | Optional. Escaped JSON array with properties to be added to the GeoJSON output. | ### Example + Convert a given coordinate into a GeoJSON point with specified properties. ``` diff --git a/site/versioned_docs/version-4.5/getting-started/first-harper-app.md b/site/versioned_docs/version-4.5/getting-started/first-harper-app.md index ec7fd290..39930c90 100644 --- a/site/versioned_docs/version-4.5/getting-started/first-harper-app.md +++ b/site/versioned_docs/version-4.5/getting-started/first-harper-app.md @@ -3,9 +3,11 @@ title: Create Your First Application --- # Create Your First Application + Now that you've set up Harper, let's build a simple API. Harper lets you build powerful APIs with minimal effort. In just a few minutes, you'll have a functional REST API with automatic validation, indexing, and querying—all without writing a single line of code. ## Setup Your Project + Start by cloning the Harper application template: ```bash @@ -14,6 +16,7 @@ cd my-app ``` ## Creating our first Table + The core of a Harper application is the database, so let's create a database table. A quick and expressive way to define a table is through a [GraphQL Schema](https://graphql.org/learn/schema). Using your editor of choice, edit the file named `schema.graphql` in the root of the application directory, `my-app`, that we created above. To create a table, we will need to add a `type` of `@table` named `Dog` (and you can remove the example table in the template): @@ -39,10 +42,13 @@ Now we tell Harper to run this as an application: ```bash harperdb dev . # tell Harper cli to run current directory as an application in dev mode ``` + Harper will now create the `Dog` table and its `id` attribute we just defined. Not only is this an easy way to create a table, but this schema is included in our application, which will ensure that this table exists wherever we deploy this application (to any Harper instance). ## Adding Attributes to our Table + Next, let's expand our `Dog` table by adding additional typed attributes for dog `name`, `breed` and `age`. + ```graphql type Dog @table { id: ID @primaryKey @@ -69,6 +75,7 @@ type Dog @table @sealed { ``` ## Adding an Endpoint + Now that we have a running application with a database (with data if you imported any data), let's make this data accessible from a RESTful URL by adding an endpoint. To do this, we simply add the `@export` directive to our `Dog` table: ```graphql @@ -98,6 +105,7 @@ Content-Type: application/json With this a record will be created and the auto-assigned id will be available through the `Location` header. If you added a record, you can visit the path `/Dog/` to view that record. Alternately, the curl command curl `http:/localhost:9926/Dog/` will achieve the same thing. ## Authenticating Endpoints + Now that you've created your first API endpoints, it's important to ensure they're protected. Without authentication, anyone could potentially access, misuse, or overload your APIs, whether by accident or malicious intent. Authentication verifies who is making the request and enables you to control access based on identity, roles, or permissions. It’s a foundational step in building secure, reliable applications. Endpoints created with Harper automatically support `Basic`, `Cookie`, and `JWT` authentication methods. See the documentation on [security](../developers/security/) for more information on different levels of access. @@ -105,6 +113,7 @@ Endpoints created with Harper automatically support `Basic`, `Cookie`, and `JWT` By default, Harper also automatically authorizes all requests from loopback IP addresses (from the same computer) as the superuser, to make it simple to interact for local development. If you want to test authentication/authorization, or enforce stricter security, you may want to disable the [`authentication.authorizeLocal` setting](../deployments/configuration#authentication). ### Content Negotiation + These endpoints support various content types, including `JSON`, `CBOR`, `MessagePack` and `CSV`. Simply include an `Accept` header in your requests with the preferred content type. We recommend `CBOR` as a compact, efficient encoding with rich data types, but `JSON` is familiar and great for web application development, and `CSV` can be useful for exporting data to spreadsheets or other processing. Harper works with other important standard HTTP headers as well, and these endpoints are even capable of caching interaction: @@ -123,12 +132,12 @@ In order to maintain reasonable query speed on a database as it grows in size, i ```graphql type Dog @table { - id: ID @primaryKey - name: String @indexed - breed: String @indexed - owner: String - age: Int - tricks: [String] + id: ID @primaryKey + name: String @indexed + breed: String @indexed + owner: String + age: Int + tricks: [String] } ``` @@ -157,6 +166,6 @@ Congratulations, you now have created a secure database application backend with > Additionally, you may now use GraphQL (over HTTP) to create queries. See the documentation for that new feature [here](../../technical-details/reference/graphql). - ## Key Takeaway -Harper's schema-driven approach means you can build production-ready APIs in minutes, not hours. Start with pure schema definitions to get 90% of your functionality, then add custom code only where needed. This gives you the best of both worlds: rapid development with the flexibility to customize when required. \ No newline at end of file + +Harper's schema-driven approach means you can build production-ready APIs in minutes, not hours. Start with pure schema definitions to get 90% of your functionality, then add custom code only where needed. This gives you the best of both worlds: rapid development with the flexibility to customize when required. diff --git a/site/versioned_docs/version-4.5/getting-started/harper-concepts.md b/site/versioned_docs/version-4.5/getting-started/harper-concepts.md index 5810f52e..4726fb85 100644 --- a/site/versioned_docs/version-4.5/getting-started/harper-concepts.md +++ b/site/versioned_docs/version-4.5/getting-started/harper-concepts.md @@ -7,20 +7,24 @@ title: Harper Concepts As you begin your journey with Harper, there are a few concepts and definitions that you should understand. ## Components + Harper components are a core Harper concept defined as flexible JavaScript based extensions of the highly extensible core Harper platform. They are executed by Harper directly and have complete access to the Harper [Global APIs](https://docs.harperdb.io/technical-details/reference/globals) (such as Resource, databases, and tables). A key aspect to components are their extensibility; components can be built on other components. For example, a [Harper Application](https://docs.harperdb.io/developers/applications) is a component that uses many other components. The [application template](https://github.com/HarperDB/application-template) demonstrates many of Harper's built-in components such as [rest](https://docs.harperdb.io/developers/components/built-in#rest) (for automatic REST endpoint generation), [graphqlSchema](https://docs.harperdb.io/developers/components/built-in#graphqlschema) (for table schema definitions), and many more. ## Applications + Applications are a subset of components that cannot be used directly and must depend on other extensions. Examples include defining schemas (using [graphqlSchema](https://docs.harperdb.io/developers/components/built-in#graphqlschema) built-in extension), defining custom resources (using [jsResource](https://docs.harperdb.io/developers/components/built-in#jsresource) built-in extension), hosting static files (using [static](https://docs.harperdb.io/developers/components/built-in#static) built-in extension), enabling REST querying of resources (using [rest](https://docs.harperdb.io/developers/components/built-in#rest) built-in extension), and running [Next.js](https://github.com/HarperDB/nextjs), [Astro](https://github.com/HarperDB/astro), or [Apollo](https://github.com/HarperDB/apollo) applications through their respective extensions. ## Resources + Resources in Harper encompass databases, tables, and schemas that store and structure data within the system. The concept is central to Harper's data management capabilities, with custom resources being enabled by the built-in jsResource extension. Resources represent the data layer of the Harper ecosystem and provide the foundation for data operations across applications built with the platform. ## Server -Harper is a multi-protocol server, handling incoming requests from clients and serving data from the data model. Harper supports multiple server protocols, with components for serving REST/HTTP (including Server-Sent Events), MQTT, WebSockets, and the Operations API (and custom server components can be added). Harper uses separate layers for the data model and the servers. The data model, which is defined with resources, can be exported and be used as the source for any of the servers. A single table or other resource can then be accessed and modified through REST, MQTT, SSE, or any other server protocol, for a powerful integrated model with multiple forms of access. + +Harper is a multi-protocol server, handling incoming requests from clients and serving data from the data model. Harper supports multiple server protocols, with components for serving REST/HTTP (including Server-Sent Events), MQTT, WebSockets, and the Operations API (and custom server components can be added). Harper uses separate layers for the data model and the servers. The data model, which is defined with resources, can be exported and be used as the source for any of the servers. A single table or other resource can then be accessed and modified through REST, MQTT, SSE, or any other server protocol, for a powerful integrated model with multiple forms of access. Networking in Harper handles different communication protocols including HTTP, WebSocket, and MQTT, as well as event-driven systems. These networking capabilities enable Harper applications to communicate with other services, receive requests, send responses, and participate in real-time data exchange. The networking layer is fundamental to Harper's functionality as a versatile application platform. -__ +\_\_ -As you go through Harper, you will pick up more knowledge of other advanced areas along the way, but with these concepts, you're now ready to create your first application. \ No newline at end of file +As you go through Harper, you will pick up more knowledge of other advanced areas along the way, but with these concepts, you're now ready to create your first application. diff --git a/site/versioned_docs/version-4.5/getting-started/index.md b/site/versioned_docs/version-4.5/getting-started/index.md index b4e6fe3d..8767f331 100644 --- a/site/versioned_docs/version-4.5/getting-started/index.md +++ b/site/versioned_docs/version-4.5/getting-started/index.md @@ -11,6 +11,7 @@ Follow the steps in this documentation to discover how Harper can simplify your For more advanced concepts in Harper, see our [blog](https://www.harpersystems.dev/blog). ## Harper Basics +

@@ -42,4 +43,4 @@ For more advanced concepts in Harper, see our [blog](https://www.harpersystems.d Learn about Harper's fundamental concepts and how they interact

-
\ No newline at end of file +
diff --git a/site/versioned_docs/version-4.5/getting-started/install-harper.md b/site/versioned_docs/version-4.5/getting-started/install-harper.md index 053b7c9d..8786d674 100644 --- a/site/versioned_docs/version-4.5/getting-started/install-harper.md +++ b/site/versioned_docs/version-4.5/getting-started/install-harper.md @@ -7,6 +7,7 @@ title: Install Harper There are three ways to install a Harper instance: using a package manager like npm, deploying it as a Docker container, and offline installation. Below is a step-by-step tutorial for each method. ## Installing via NPM + Before you begin, ensure you have [Node.js](https://nodejs.org/) LTS version or newer. Node.js comes with npm, which will be used to install Harper. Open your terminal or command prompt and install Harper globally by executing the command below. Installing globally allows the `harperdb` command to be accessible from anywhere on your machine, making it easier to manage multiple projects. @@ -26,6 +27,7 @@ This launches Harper as a standalone, where you can define your schemas, endpoin At this point, your local Harper instance is up and running, giving you the ability to develop and test your database applications using your favorite local development tools, including debuggers and version control systems. ## Installing via Docker + Using Docker to run Harper is an efficient way to manage a containerized instance that encapsulates all of Harper’s functionality. First, ensure that Docker is installed and running on your system. If it isn’t, download it from the [official Docker website](https://docs.docker.com/engine/install/) and complete the installation process. Next, open your terminal and pull the latest Harper image by running the following command: @@ -43,7 +45,9 @@ docker run -d -p 9925:9925 harperdb/harperdb In this command, the `-d` flag runs the container in detached mode, allowing it to operate in the background, and the `-p 9925:9925` flag maps port 9925 on your local machine to port 9925 within the container, which is Harper’s default port. This port mapping lets you interact with the Harper instance directly from your local environment. ### How to Use this Image + [Harper configuration settings⁠](https://harperdb.io/docs/reference/configuration-file/) can be passed as Docker run environment variables. If no environment variables are provided, Harper will operate with default configuration settings, such as: + - ROOTPATH=/home/harperdb/hdb - OPERATIONSAPI_NETWORK_PORT=9925 - HDB_ADMIN_USERNAME=HDB_ADMIN @@ -59,6 +63,7 @@ Test your Harper instance is up and running by querying `curl http:/localhost:99 ::: ### Example Deployments + To run a Harper container in the background with persistent storage and exposed ports, you can use a command like this: ```bash @@ -105,6 +110,7 @@ docker run --rm harperdb/harperdb /bin/bash -c "harperdb version" This command runs the container momentarily to print the version information, then removes the container automatically when finished. ### Logs and Troubleshooting + To verify that the container is running properly, you can check your running containers with: ```bash @@ -120,6 +126,7 @@ docker logs Once verified, you can access your Harper instance by opening your web browser and navigating to http:/localhost:9925 (or the appropriate port based on your configuration). ### Raw binary installation + There's a different way to install Harper. You can choose your version and download the npm package and install it directly (you’ll still need Node.js and NPM). Click [this link](https://products-harperdb-io.s3.us-east-2.amazonaws.com/index.html) to download and install the package. Once you’ve downloaded the .tgz file, run the following command from the directory where you’ve placed it: ```bash diff --git a/site/versioned_docs/version-4.5/getting-started/what-is-harper.md b/site/versioned_docs/version-4.5/getting-started/what-is-harper.md index 23ac3fb4..6099b048 100644 --- a/site/versioned_docs/version-4.5/getting-started/what-is-harper.md +++ b/site/versioned_docs/version-4.5/getting-started/what-is-harper.md @@ -36,7 +36,6 @@ Finally, when it’s time to deploy, explore [replication](../developers/replica If you would like to jump into the most advanced capabilities, learn about [components](../developers/components/). - :::warning Need help? Please don’t hesitate to [reach out](https://www.harpersystems.dev/contact). ::: diff --git a/site/versioned_docs/version-4.5/technical-details/_category_.json b/site/versioned_docs/version-4.5/technical-details/_category_.json index 69ce80a6..b965ef06 100644 --- a/site/versioned_docs/version-4.5/technical-details/_category_.json +++ b/site/versioned_docs/version-4.5/technical-details/_category_.json @@ -1,12 +1,10 @@ { - "label": "Technical Details", - "position": 4, - "link": { - "type": "generated-index", - "title": "Technical Details Documentation", - "description": "Reference documentation and technical specifications", - "keywords": [ - "technical-details" - ] - } -} \ No newline at end of file + "label": "Technical Details", + "position": 4, + "link": { + "type": "generated-index", + "title": "Technical Details Documentation", + "description": "Reference documentation and technical specifications", + "keywords": ["technical-details"] + } +} diff --git a/site/versioned_docs/version-4.5/technical-details/reference/analytics.md b/site/versioned_docs/version-4.5/technical-details/reference/analytics.md index d3156053..39c92109 100644 --- a/site/versioned_docs/version-4.5/technical-details/reference/analytics.md +++ b/site/versioned_docs/version-4.5/technical-details/reference/analytics.md @@ -8,7 +8,7 @@ Harper provides extensive telemetry and analytics data to help monitor the statu Harper collects statistics for all operations, URL endpoints, and messaging topics, aggregating information by thread, operation, resource, and methods, in real-time. These statistics are logged in the `hdb_raw_analytics` and `hdb_analytics` table in the `system` database. -There are two "levels" of analytics in the Harper analytics table: the first is the immediate level of raw direct logging of real-time statistics. These analytics entries are recorded once a second (when there is activity) by each thread, and include all recorded activity in the last second, along with system resource information. The records have a primary key that is the timestamp in milliseconds since epoch. This can be queried (with `superuser` permission) using the search\_by\_conditions operation (this will search for 10 seconds worth of analytics) on the `hdb_raw_analytics` table: +There are two "levels" of analytics in the Harper analytics table: the first is the immediate level of raw direct logging of real-time statistics. These analytics entries are recorded once a second (when there is activity) by each thread, and include all recorded activity in the last second, along with system resource information. The records have a primary key that is the timestamp in milliseconds since epoch. This can be queried (with `superuser` permission) using the search_by_conditions operation (this will search for 10 seconds worth of analytics) on the `hdb_raw_analytics` table: ``` POST http:/localhost:9925 @@ -104,14 +104,14 @@ And a summary record looks like: The following are general resource usage statistics that are tracked: -* memory - This includes RSS, heap, buffer and external data usage. -* utilization - How much of the time the worker was processing requests. -* mqtt-connections - The number of MQTT connections. +- memory - This includes RSS, heap, buffer and external data usage. +- utilization - How much of the time the worker was processing requests. +- mqtt-connections - The number of MQTT connections. The following types of information is tracked for each HTTP request: -* success - How many requests returned a successful response (20x response code). TTFB - Time to first byte in the response to the client. -* transfer - Time to finish the transfer of the data to the client. -* bytes-sent - How many bytes of data were sent to the client. +- success - How many requests returned a successful response (20x response code). TTFB - Time to first byte in the response to the client. +- transfer - Time to finish the transfer of the data to the client. +- bytes-sent - How many bytes of data were sent to the client. Requests are categorized by operation name, for the operations API, by the resource (name) with the REST API, and by command for the MQTT interface. diff --git a/site/versioned_docs/version-4.5/technical-details/reference/architecture.md b/site/versioned_docs/version-4.5/technical-details/reference/architecture.md index dd451ded..4155d5ff 100644 --- a/site/versioned_docs/version-4.5/technical-details/reference/architecture.md +++ b/site/versioned_docs/version-4.5/technical-details/reference/architecture.md @@ -38,5 +38,5 @@ Harper's architecture consists of resources, which includes tables and user defi │ │ │ │ │ └────────────────┘ │ │ │ - └────────────────────────────────────────┘ + └────────────────────────────────────────┘ ``` diff --git a/site/versioned_docs/version-4.5/technical-details/reference/blob.md b/site/versioned_docs/version-4.5/technical-details/reference/blob.md index eb1ff72e..a62ba2eb 100644 --- a/site/versioned_docs/version-4.5/technical-details/reference/blob.md +++ b/site/versioned_docs/version-4.5/technical-details/reference/blob.md @@ -5,6 +5,7 @@ title: Blob # Blob Blobs are binary large objects that can be used to store any type of unstructured/binary data and is designed for large content. Blobs support streaming and feature better performance for content larger than about 20KB. Blobs are built off the native JavaScript `Blob` type, and HarperDB extends the native `Blob` type for integrated storage with the database. To use blobs, you would generally want to declare a field as a `Blob` type in your schema: + ```graphql type MyTable { id: Any! @primaryKey @@ -18,6 +19,7 @@ You can then create a blob which writes the binary data to disk, and can then be let blob = await createBlob(largeBuffer); await MyTable.put({ id: 'my-record', data: blob }); ``` + The `data` attribute in this example is a blob reference, and can be used like any other attribute in the record, but it is stored separately, and the data must be accessed asynchronously. You can retrieve the blob data with the standard `Blob` methods: ```javascript @@ -37,6 +39,7 @@ export class MyEndpoint extends MyTable { } } ``` + One of the important characteristics of blobs is they natively support asynchronous streaming of data. This is important for both creation and retrieval of large data. When we create a blob with `createBlob`, the returned blob will create the storage entry, but the data will be streamed to storage. This means that you can create a blob from a buffer or from a stream. You can also create a record that references a blob before the blob is fully written to storage. For example, you can create a blob from a stream: ```javascript @@ -48,6 +51,7 @@ let record = await MyTable.get('my-record'); // we now have a record that gives us access to the blob. We can asynchronously access the blob's data or stream the data, and it will be available as blob the stream is written to the blob. let stream = record.data.stream(); ``` + This can be powerful functionality for large media content, where content can be streamed into storage as it streamed out in real-time to users as it is received. Alternately, we can also wait for the blob to be fully written to storage before creating a record that references the blob: @@ -59,9 +63,10 @@ await blob.save(MyTable); await MyTable.put({ id: 'my-record', data: blob }); ``` -Note that this means that blobs are _not_ atomic or [ACID](https://en.wikipedia.org/wiki/ACID) compliant; streaming functionality achieves the opposite behavior of ACID/atomic writes that would prevent access to data as it is being written. +Note that this means that blobs are _not_ atomic or [ACID](https://en.wikipedia.org/wiki/ACID) compliant; streaming functionality achieves the opposite behavior of ACID/atomic writes that would prevent access to data as it is being written. ### Error Handling + Because blobs can be streamed and referenced prior to their completion, there is a chance that an error or interruption could occur while streaming data to the blob (after the record is committed). We can create an error handler for the blob to handle the case of an interrupted blob: ```javascript @@ -84,6 +89,7 @@ export class MyEndpoint extends MyTable { ### Blob `size` Blobs that are created from streams may not have the standard `size` property available, because the size may not be known while data is being streamed. Consequently, the `size` property may be undefined until the size is determined. You can listen for the `size` event to be notified when the size is available: + ```javascript let record = await MyTable.get('my-record'); let blob = record.data; @@ -97,4 +103,4 @@ if (blob.size === undefined) { ``` -See the [configuration](../../deployments/configuration) documentation for more information on configuring where blob are stored. +See the [configuration](../../deployments/configuration) documentation for more information on configuring where blob are stored. diff --git a/site/versioned_docs/version-4.5/technical-details/reference/data-types.md b/site/versioned_docs/version-4.5/technical-details/reference/data-types.md index 73347b69..1591a6a5 100644 --- a/site/versioned_docs/version-4.5/technical-details/reference/data-types.md +++ b/site/versioned_docs/version-4.5/technical-details/reference/data-types.md @@ -20,10 +20,10 @@ Strings, or text, are a sequence of any unicode characters and are internally en Numbers can be stored as signed integers up to a 1000 bits of precision (about 300 digits) or floating point with 64-bit floating point precision, and numbers are automatically stored using the most optimal type. With JSON, numbers are automatically parsed and stored in the most appropriate format. Custom components and applications may use BigInt numbers to store/access integers that are larger than 53-bit. The following GraphQL schema type name are supported: -* `Float` - Any number that can be represented with [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision\_floating-point\_format) ("double") -* `Int` - Any integer between from -2147483648 to 2147483647 -* `Long` - Any integer between from -9007199254740992 to 9007199254740992 -* `BigInt` - Any integer (negative or positive) with less than 300 digits +- `Float` - Any number that can be represented with [64-bit double precision floating point number](https://en.wikipedia.org/wiki/Double-precision_floating-point_format) ("double") +- `Int` - Any integer between from -2147483648 to 2147483647 +- `Long` - Any integer between from -9007199254740992 to 9007199254740992 +- `BigInt` - Any integer (negative or positive) with less than 300 digits Note that `BigInt` is a distinct and separate type from standard numbers in JavaScript, so custom code should handle this type appropriately. @@ -48,10 +48,12 @@ Dates can be stored as a specific data type. This is not supported in JSON, but Binary data can be stored in property values as well, with two different data types that are available: ### Bytes + JSON doesn’t have any support for encoding binary data, but MessagePack and CBOR support binary data in data structures, and this will be preserved in HarperDB. Custom Functions can also store binary data by using NodeJS’s Buffer or Uint8Array instances to hold the binary data. The GraphQL schema type name is `Bytes`. ### Blobs -Binary data can also be stored with [`Blob`s](./blob), which can scale much better for larger content than `Bytes`, as it is designed to be streamed and does not need to be held entirely in memory. It is recommended that `Blob`s are used for content larger than 20KB. + +Binary data can also be stored with [`Blob`s](./blob), which can scale much better for larger content than `Bytes`, as it is designed to be streamed and does not need to be held entirely in memory. It is recommended that `Blob`s are used for content larger than 20KB. ## Explicit Map/Set diff --git a/site/versioned_docs/version-4.5/technical-details/reference/dynamic-schema.md b/site/versioned_docs/version-4.5/technical-details/reference/dynamic-schema.md index 1e8695be..986c8b44 100644 --- a/site/versioned_docs/version-4.5/technical-details/reference/dynamic-schema.md +++ b/site/versioned_docs/version-4.5/technical-details/reference/dynamic-schema.md @@ -16,8 +16,8 @@ Harper databases hold a collection of tables together in a single file that are Harper tables group records together with a common data pattern. To create a table users must provide a table name and a primary key. -* **Table Name**: Used to identify the table. -* **Primary Key**: This is a required attribute that serves as the unique identifier for a record and is also known as the `hash_attribute` in Harper operations API. +- **Table Name**: Used to identify the table. +- **Primary Key**: This is a required attribute that serves as the unique identifier for a record and is also known as the `hash_attribute` in Harper operations API. ## Primary Key @@ -31,8 +31,8 @@ With tables that are using dynamic schemas, additional attributes are reflexivel Harper automatically creates two audit attributes used on each record if the table is created without a schema. -* `__createdtime__`: The time the record was created in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. -* `__updatedtime__`: The time the record was updated in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. +- `__createdtime__`: The time the record was created in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. +- `__updatedtime__`: The time the record was updated in [Unix Epoch with milliseconds](https://www.epochconverter.com/) format. ### Dynamic Schema Example @@ -64,7 +64,7 @@ At this point the table does not have structure beyond what we provided, so the **dev.dog** -![](/img/v4.5/reference/dynamic\_schema\_2\_create\_table.png.webp) +![](/img/v4.5/reference/dynamic_schema_2_create_table.png.webp) **Insert Record** @@ -85,7 +85,7 @@ With a single record inserted and new attributes defined, our table now looks li **dev.dog** -![](/img/v4.5/reference/dynamic\_schema\_3\_insert\_record.png.webp) +![](/img/v4.5/reference/dynamic_schema_3_insert_record.png.webp) Indexes have been automatically created for `dog_name` and `owner_name` attributes. @@ -109,7 +109,7 @@ In this case, there is no change to the schema. Our table now looks like this: **dev.dog** -![](/img/v4.5/reference/dynamic\_schema\_4\_insert\_additional\_record.png.webp) +![](/img/v4.5/reference/dynamic_schema_4_insert_additional_record.png.webp) **Update Existing Record** @@ -130,7 +130,7 @@ Now we have a new attribute called `weight_lbs`. Our table now looks like this: **dev.dog** -![](/img/v4.5/reference/dynamic\_schema\_5\_update\_existing\_record.png.webp) +![](/img/v4.5/reference/dynamic_schema_5_update_existing_record.png.webp) **Query Table with SQL** @@ -145,4 +145,4 @@ Now if we query for all records where `weight_lbs` is `null` we expect to get ba This results in the expected two records being returned. -![](/img/v4.5/reference/dynamic\_schema\_6\_query\_table\_with\_sql.png.webp) +![](/img/v4.5/reference/dynamic_schema_6_query_table_with_sql.png.webp) diff --git a/site/versioned_docs/version-4.5/technical-details/reference/globals.md b/site/versioned_docs/version-4.5/technical-details/reference/globals.md index 673334d9..8a842e70 100644 --- a/site/versioned_docs/version-4.5/technical-details/reference/globals.md +++ b/site/versioned_docs/version-4.5/technical-details/reference/globals.md @@ -38,7 +38,7 @@ async function getRecord() { } ``` -It is recommended that you [define a database](../../getting-started) for all the tables that are required to exist in your application. This will ensure that the tables exist on the `tables` object. Also note that the property names follow a CamelCase convention for use in JavaScript and in the GraphQL Schemas, but these are translated to snake\_case for the actual table names, and converted back to CamelCase when added to the `tables` object. +It is recommended that you [define a database](../../getting-started) for all the tables that are required to exist in your application. This will ensure that the tables exist on the `tables` object. Also note that the property names follow a CamelCase convention for use in JavaScript and in the GraphQL Schemas, but these are translated to snake_case for the actual table names, and converted back to CamelCase when added to the `tables` object. ## `databases` @@ -76,13 +76,14 @@ Returns an array of server instances based on the specified `options.port` and ` Example: ```js -server.http((request, next) => { - return request.url === '/graphql' - ? handleGraphQLRequest(request) - : next(request); -}, { - runFirst: true, // run this handler first -}); +server.http( + (request, next) => { + return request.url === '/graphql' ? handleGraphQLRequest(request) : next(request); + }, + { + runFirst: true, // run this handler first + } +); ``` #### `RequestListener` @@ -96,6 +97,7 @@ The HTTP request listener to be added to the middleware chain. To continue chain The `Request` and `Response` classes are based on the WHATWG APIs for the [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) and [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) classes. Requests and responses are based on these standard-based APIs to facilitate reuse with modern web code. While Node.js' HTTP APIs are powerful low-level APIs, the `Request`/`Response` APIs provide excellent composability characteristics, well suited for layered middleware and for clean mapping to [RESTful method handlers](./resource) with promise-based responses, as well as interoperability with other standards-based APIs like [streams](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) used with [`Blob`s](https://developer.mozilla.org/en-US/docs/Web/API/Blob). However, the Harper implementation of these classes is not a direct implementation of the WHATWG APIs, but implements additional/distinct properties for the the Harper server environment: #### `Request` + A `Request` object is passed to the direct static REST handlers, and preserved as the context for instance methods, and has the following properties: - `url` - This is the request target, which is the portion of the URL that was received by the server. If a client sends a request to `https://example.com:8080/path?query=string`, the actual received request is `GET /path?query=string` and the `url` property will be `/path?query=string`. @@ -103,7 +105,7 @@ A `Request` object is passed to the direct static REST handlers, and preserved a - `headers` - This is a [`Headers`](https://developer.mozilla.org/en-US/docs/Web/API/Headers) object that contains the headers of the request. - `pathname` - This is the path portion of the URL, without the query string. For example, if the URL is `/path?query=string`, the `pathname` will be `/path`. - `protocol` - This is the protocol of the request, like `http` or `https`. -- `data` - This is the deserialized body of the request (based on the type of data specified by `Content-Type` header). +- `data` - This is the deserialized body of the request (based on the type of data specified by `Content-Type` header). - `ip` - This is the remote IP address of the client that made the request (or the remote IP address of the last proxy to connect to Harper). - `host` - This is the host of the request, like `example.com`. - `sendEarlyHints(link: string, headers?: object): void` - This method sends an early hints response to the client, prior to actually returning a response. This is useful for sending a link header to the client to indicate that another resource should be preloaded. The `headers` argument can be used to send additional headers with the early hints response, in addition to the `link`. This is generally most helpful in a cache resolution function, where you can send hints _if_ the data is not in the cache and is resolving from an origin: @@ -175,15 +177,15 @@ Example: ```js server.ws((ws, request, chainCompletion) => { - chainCompletion.then(() => { - ws.on('error', console.error); + chainCompletion.then(() => { + ws.on('error', console.error); - ws.on('message', function message(data) { - console.log('received: %s', data); - }); + ws.on('message', function message(data) { + console.log('received: %s', data); + }); - ws.send('something'); - }); + ws.send('something'); + }); }); ``` @@ -205,10 +207,10 @@ Type: `Object` Properties: -* `maxPayload` - _optional_ - `number` - Set the max payload size for the WebSocket server. Defaults to 100 MB. -* `runFirst` - _optional_ - `boolean` - Add listener to the front of the middleware chain. Defaults to `false` -* `port` - _optional_ - `number` - Specify which WebSocket server middleware chain to add the listener to. Defaults to the Harper system default HTTP port configured by `harperdb-config.yaml`, generally `9926` -* `securePort` - _optional_ - `number` - Specify which WebSocket secure server middleware chain to add the listener to. Defaults to the Harper system default HTTP secure port configured by `harperdb-config.yaml`, generally `9927` +- `maxPayload` - _optional_ - `number` - Set the max payload size for the WebSocket server. Defaults to 100 MB. +- `runFirst` - _optional_ - `boolean` - Add listener to the front of the middleware chain. Defaults to `false` +- `port` - _optional_ - `number` - Specify which WebSocket server middleware chain to add the listener to. Defaults to the Harper system default HTTP port configured by `harperdb-config.yaml`, generally `9926` +- `securePort` - _optional_ - `number` - Specify which WebSocket secure server middleware chain to add the listener to. Defaults to the Harper system default HTTP secure port configured by `harperdb-config.yaml`, generally `9927` ### `server.upgrade(listener: UpgradeListener, options: UpgradeOptions): void` @@ -249,9 +251,9 @@ Type: `Object` Properties: -* `runFirst` - _optional_ - `boolean` - Add listener to the front of the middleware chain. Defaults to `false` -* `port` - _optional_ - `number` - Specify which HTTP server middleware chain to add the listener to. Defaults to the Harper system default HTTP port configured by `harperdb-config.yaml`, generally `9926` -* `securePort` - _optional_ - `number` - Specify which HTTP secure server middleware chain to add the listener to. Defaults to the Harper system default HTTP secure port configured by `harperdb-config.yaml`, generally `9927` +- `runFirst` - _optional_ - `boolean` - Add listener to the front of the middleware chain. Defaults to `false` +- `port` - _optional_ - `number` - Specify which HTTP server middleware chain to add the listener to. Defaults to the Harper system default HTTP port configured by `harperdb-config.yaml`, generally `9926` +- `securePort` - _optional_ - `number` - Specify which HTTP secure server middleware chain to add the listener to. Defaults to the Harper system default HTTP secure port configured by `harperdb-config.yaml`, generally `9927` ### `server.config` @@ -261,23 +263,28 @@ This provides access to the Harper configuration object. This comes from the [ha This records the provided value as a metric into Harper's analytics. Harper efficiently records and tracks these metrics and makes them available through [analytics API](./analytics). The values are aggregated and statistical information is computed when many operations are performed. The optional parameters can be used to group statistics. For the parameters, make sure you are not grouping on too fine of a level for useful aggregation. The parameters are: -* `value` - This is a numeric value for the metric that is being recorded. This can be a value measuring time or bytes, for example. -* `metric` - This is the name of the metric. -* `path` - This is an optional path (like a URL path). For a URL like /my-resource/, you would typically include a path of "my-resource", not including the id so you can group by all the requests to "my-resource" instead of individually aggregating by each individual id. -* `method` - Optional method to group by. -* `type` - Optional type to group by. +- `value` - This is a numeric value for the metric that is being recorded. This can be a value measuring time or bytes, for example. +- `metric` - This is the name of the metric. +- `path` - This is an optional path (like a URL path). For a URL like /my-resource/, you would typically include a path of "my-resource", not including the id so you can group by all the requests to "my-resource" instead of individually aggregating by each individual id. +- `method` - Optional method to group by. +- `type` - Optional type to group by. ### `server.getUser(username): Promise` + This returns the user object with permissions/authorization information based on the provided username. This does not verify the password, so it is generally used for looking up users by username. If you want to verify a user by password, use [`server.authenticateUser`](./globals#serverauthenticateuserusername-password-user). ### `server.authenticateUser(username, password): Promise` + This returns the user object with permissions/authorization information based on the provided username. The password will be verified before returning the user object (if the password is incorrect, an error will be thrown). ### `server.resources: Resources` + This provides access to the map of all registered resources. This is the central registry in Harper for registering any resources to be exported for use by REST, MQTT, or other components. Components that want to register resources should use the `server.resources.set(name, resource)` method to add to this map. Exported resources can be found by passing in a path to `server.resources.getMatch(path)` which will find any resource that matches the path or beginning of the path. #### `server.resources.set(name, resource, exportTypes?)` + Register a resource with the server. For example: + ``` class NewResource extends Resource { } @@ -285,10 +292,13 @@ server.resources.set('NewResource', Resource); / or limit usage: server.resources.set('NewResource', Resource, { rest: true, mqtt: false, 'my-protocol': true }); ``` + #### `server.resources.getMatch(path, exportType?)` + Find a resource that matches the path. For example: + ``` server.resources.getMatch('/NewResource/some-id'); / or specify the export/protocol type, to allow it to be limited: server.resources.getMatch('/NewResource/some-id', 'my-protocol'); -``` \ No newline at end of file +``` diff --git a/site/versioned_docs/version-4.5/technical-details/reference/graphql.md b/site/versioned_docs/version-4.5/technical-details/reference/graphql.md index bcff1a96..ea0bc0aa 100644 --- a/site/versioned_docs/version-4.5/technical-details/reference/graphql.md +++ b/site/versioned_docs/version-4.5/technical-details/reference/graphql.md @@ -15,6 +15,7 @@ This automatically enables a `/graphql` endpoint that can be used for GraphQL qu Queries can either be `GET` or `POST` requests, and both follow essentially the same request format. `GET` requests must use search parameters, and `POST` requests use the request body. For example, to request the GraphQL Query: + ```graphql query GetDogs { Dog { @@ -91,6 +92,7 @@ The Harper GraphQL Querying system takes many liberties from the GraphQL specifi In variable definitions, the querying system will ensure non-null values exist (and error appropriately), but it will not do any type checking of the value itself. For example, the variable `$name: String!` states that `name` should be a non-null, string value. + - If the request does not contain the `name` variable, an error will be returned - If the request provides `null` for the `name` variable, an error will be returned - If the request provides any non-string value for the `name` variable, i.e. `1`, `true`, `{ foo: "bar" }`, the behavior is undefined and an error may or may not be returned. @@ -100,6 +102,7 @@ For example, the variable `$name: String!` states that `name` should be a non-nu - Fragments will generally extend non-specified types, and the querying system will do no validity checking on them. For example, `fragment Fields on Any { ... }` is just as valid as `fragment Fields on MadeUpTypeName { ... }`. See the Fragments sections for more details. The only notable place the querying system will do some level of type analysis is the transformation of arguments into a query. + - Objects will be transformed into properly nested attributes - Strings and Boolean values are passed through as their AST values - Float and Int values will be parsed using the JavaScript `parseFloat` and `parseInt` methods respectively. @@ -174,6 +177,7 @@ query GetDog($id: ID!) { ``` And as a properly formed request: + ```http POST /graphql/ Content-Type: application/json @@ -188,6 +192,7 @@ Accept: application/graphql-response+json ``` The REST equivalent would be: + ```http GET /Dog/?id==0&select(name,breed,owner{name}) # or @@ -211,6 +216,7 @@ query GetDog { ``` Would be equivalent to + ```http GET /Dog/?owner.name==John&select(name,breed,owner{name}) ``` @@ -220,7 +226,7 @@ And finally, we can put all of these together to create semi-complex, equality b The following query has two variables and will return all dogs who have the specified name as well as the specified owner name. ```graphql -query GetDog($dogName: String!, $ownerName: String! ) { +query GetDog($dogName: String!, $ownerName: String!) { Dog(name: $dogName, owner: { name: $ownerName }) { name breed @@ -245,4 +251,4 @@ query GetDog($dogName: String!, $ownerName: String! ) { ### Directives -> Coming soon! \ No newline at end of file +> Coming soon! diff --git a/site/versioned_docs/version-4.5/technical-details/reference/headers.md b/site/versioned_docs/version-4.5/technical-details/reference/headers.md index 0301b152..5c85fc88 100644 --- a/site/versioned_docs/version-4.5/technical-details/reference/headers.md +++ b/site/versioned_docs/version-4.5/technical-details/reference/headers.md @@ -6,7 +6,7 @@ title: Harper Headers All Harper API responses include headers that are important for interoperability and debugging purposes. The following headers are returned with all Harper API responses: -| Key | Example Value | Description | -|-------------------|------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| -| server-timing | db;dur=7.165 | This reports the duration of the operation, in milliseconds. This follows the standard for Server-Timing and can be consumed by network monitoring tools. | -| content-type | application/json | This reports the MIME type of the returned content, which is negotiated based on the requested content type in the Accept header. | +| Key | Example Value | Description | +| ------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| server-timing | db;dur=7.165 | This reports the duration of the operation, in milliseconds. This follows the standard for Server-Timing and can be consumed by network monitoring tools. | +| content-type | application/json | This reports the MIME type of the returned content, which is negotiated based on the requested content type in the Accept header. | diff --git a/site/versioned_docs/version-4.5/technical-details/reference/index.md b/site/versioned_docs/version-4.5/technical-details/reference/index.md index 8b2629e5..4bdb8ca9 100644 --- a/site/versioned_docs/version-4.5/technical-details/reference/index.md +++ b/site/versioned_docs/version-4.5/technical-details/reference/index.md @@ -6,11 +6,11 @@ title: Reference This section contains technical details and reference materials for Harper. -* [Resource API](./resource) -* [Transactions](./transactions) -* [Storage Algorithm](./storage-algorithm) -* [Dynamic Schema](./dynamic-schema) -* [Headers](./headers) -* [Limitations](./limits) -* Content Types -* [Data Types](./data-types) +- [Resource API](./resource) +- [Transactions](./transactions) +- [Storage Algorithm](./storage-algorithm) +- [Dynamic Schema](./dynamic-schema) +- [Headers](./headers) +- [Limitations](./limits) +- Content Types +- [Data Types](./data-types) diff --git a/site/versioned_docs/version-4.5/technical-details/reference/limits.md b/site/versioned_docs/version-4.5/technical-details/reference/limits.md index 9e343887..97214620 100644 --- a/site/versioned_docs/version-4.5/technical-details/reference/limits.md +++ b/site/versioned_docs/version-4.5/technical-details/reference/limits.md @@ -33,4 +33,5 @@ Additionally, they cannot contain the first 31 non-printing characters. Spaces a Harper limits the number of total indexed attributes across tables (including the primary key of each table) to 10,000 per database. ## Primary Keys -The maximum length of a primary key is 1978 bytes or 659 characters (whichever is shortest). \ No newline at end of file + +The maximum length of a primary key is 1978 bytes or 659 characters (whichever is shortest). diff --git a/site/versioned_docs/version-4.5/technical-details/reference/resource.md b/site/versioned_docs/version-4.5/technical-details/reference/resource.md index 17bba1d3..6e4a042b 100644 --- a/site/versioned_docs/version-4.5/technical-details/reference/resource.md +++ b/site/versioned_docs/version-4.5/technical-details/reference/resource.md @@ -12,20 +12,20 @@ Conceptually, a Resource class provides an interface for accessing, querying, mo Resource classes also have static methods, which are generally the preferred way to externally interact with tables and resources. The static methods handle parsing paths and query strings, starting a transaction as necessary, performing access authorization checks (if required), creating a resource instance, and calling the instance methods. This general rule for how to interact with resources: -* If you want to _act upon_ a table or resource, querying or writing to it, then use the static methods to initial access or write data. For example, you could use `MyTable.get(34)` to access the record with a primary key of `34`. - * You can subsequently use the instance methods on the returned resource instance to perform additional actions on the record. -* If you want to _define custom behavior_ for a table or resource (to control how a resource responds to queries/writes), then extend the class and override/define instance methods. +- If you want to _act upon_ a table or resource, querying or writing to it, then use the static methods to initial access or write data. For example, you could use `MyTable.get(34)` to access the record with a primary key of `34`. + - You can subsequently use the instance methods on the returned resource instance to perform additional actions on the record. +- If you want to _define custom behavior_ for a table or resource (to control how a resource responds to queries/writes), then extend the class and override/define instance methods. The Resource API is heavily influenced by the REST/HTTP API, and the methods and properties of the Resource class are designed to map to and be used in a similar way to how you would interact with a RESTful API. The REST-based API is a little different than traditional Create-Read-Update-Delete (CRUD) APIs that were designed with single-server interactions in mind, but semantics that attempt to guarantee no existing record or overwrite-only behavior require locks that don't scale well in distributed database. Centralizing writes around `put` calls provides much more scalable, simple, and consistent behavior in a distributed eventually consistent database. You can generally think of CRUD operations mapping to REST operations like this: -* Read - `get` -* Create with a known primary key - `put` -* Create with a generated primary key - `post`/`create` -* Update (Full) - `put` -* Update (Partial) - `patch` -* Delete - `delete` +- Read - `get` +- Create with a known primary key - `put` +- Create with a generated primary key - `post`/`create` +- Update (Full) - `put` +- Update (Partial) - `patch` +- Delete - `delete` The RESTful HTTP server and other server interfaces will directly call resource methods of the same name to fulfill incoming requests so resources can be defined as endpoints for external interaction. When resources are used by the server interfaces, the static method will be executed (which starts a transaction and does access checks), which will then create the resource instance and call the corresponding instance method. Paths (URL, MQTT topics) are mapped to different resource instances. Using a path that specifies an ID like `/MyResource/3492` will be mapped to a Resource instance where the instance's ID will be `3492`, and interactions will use the instance methods like `get()`, `put()`, and `post()`. Using the root path (`/MyResource/`) will map to a Resource instance with an ID of `null`, and this represents the collection of all the records in the resource or table. @@ -33,16 +33,16 @@ You can create classes that extend `Resource` to define your own data sources, t ```javascript export class MyExternalData extends Resource { - async get() { - // fetch data from an external source, using our id - let response = await this.fetch(this.id); - // do something with the response - } - put(data) { + async get() { + // fetch data from an external source, using our id + let response = await this.fetch(this.id); + // do something with the response + } + put(data) { // send the data into the external source } delete() { - // delete an entity in the external data source + // delete an entity in the external data source } subscribe(options) { // if the external data source is capable of real-time notification of changes, can subscribe @@ -68,7 +68,7 @@ export class MyTable extends tables.MyTable { super.put(data); } delete() { - super.delete(); + super.delete(); } post(data) { // providing a post handler (for HTTP POST requests) is a common way to create additional @@ -204,10 +204,10 @@ The returned (promise resolves to) Subscription object is an `AsyncIterable` tha The `SubscriptionRequest` object supports the following properties (all optional): -* `includeDescendants` - If this is enabled, this will create a subscription to all the record updates/messages that are prefixed with the id. For example, a subscription request of `{id:'sub', includeDescendants: true}` would return events for any update with an id/topic of the form sub/\* (like `sub/1`). -* `startTime` - This will begin the subscription at a past point in time, returning all updates/messages since the start time (a catch-up of historical messages). This can be used to resume a subscription, getting all messages since the last subscription. -* `previousCount` - This specifies the number of previous updates/messages to deliver. For example, `previousCount: 10` would return the last ten messages. Note that `previousCount` can not be used in conjunction with `startTime`. -* `omitCurrent` - Indicates that the current (or retained) record should _not_ be immediately sent as the first update in the subscription (if no `startTime` or `previousCount` was used). By default, the current record is sent as the first update. +- `includeDescendants` - If this is enabled, this will create a subscription to all the record updates/messages that are prefixed with the id. For example, a subscription request of `{id:'sub', includeDescendants: true}` would return events for any update with an id/topic of the form sub/\* (like `sub/1`). +- `startTime` - This will begin the subscription at a past point in time, returning all updates/messages since the start time (a catch-up of historical messages). This can be used to resume a subscription, getting all messages since the last subscription. +- `previousCount` - This specifies the number of previous updates/messages to deliver. For example, `previousCount: 10` would return the last ten messages. Note that `previousCount` can not be used in conjunction with `startTime`. +- `omitCurrent` - Indicates that the current (or retained) record should _not_ be immediately sent as the first update in the subscription (if no `startTime` or `previousCount` was used). By default, the current record is sent as the first update. ### `connect(incomingMessages?: AsyncIterable, query?: Query): AsyncIterable` @@ -253,25 +253,25 @@ Returns the context for this resource. The context contains information about th The `Context` object has the following (potential) properties: -* `user` - This is the user object, which includes information about the username, role, and authorizations. -* `transaction` - The current transaction If the current method was triggered by an HTTP request, the following properties are available: -* `lastModified` - This value is used to indicate the last modified or updated timestamp of any resource(s) that are accessed and will inform the response's `ETag` (or `Last-Modified`) header. This can be updated by application code if it knows that modification should cause this timestamp to be updated. +- `user` - This is the user object, which includes information about the username, role, and authorizations. +- `transaction` - The current transaction If the current method was triggered by an HTTP request, the following properties are available: +- `lastModified` - This value is used to indicate the last modified or updated timestamp of any resource(s) that are accessed and will inform the response's `ETag` (or `Last-Modified`) header. This can be updated by application code if it knows that modification should cause this timestamp to be updated. When a resource gets a request through HTTP, the request object is the context, which has the following properties: -* `url` - The local path/URL of the request (this will not include the protocol or host name, but will start at the path and includes the query string). -* `method` - The method of the HTTP request. -* `headers` - This is an object with the headers that were included in the HTTP request. You can access headers by calling `context.headers.get(headerName)`. -* `responseHeaders` - This is an object with the headers that will be included in the HTTP response. You can set headers by calling `context.responseHeaders.set(headerName, value)`. -* `pathname` - This provides the path part of the URL (no querystring). -* `host` - This provides the host name of the request (from the `Host` header). -* `ip` - This provides the ip address of the client that made the request. -* `body` - This is the request body as a raw NodeJS Readable stream, if there is a request body. -* `data` - If the HTTP request had a request body, this provides a promise to the deserialized data from the request body. (Note that for methods that normally have a request body like `POST` and `PUT`, the resolved deserialized data is passed in as the main argument, but accessing the data from the context provides access to this for requests that do not traditionally have a request body like `DELETE`). +- `url` - The local path/URL of the request (this will not include the protocol or host name, but will start at the path and includes the query string). +- `method` - The method of the HTTP request. +- `headers` - This is an object with the headers that were included in the HTTP request. You can access headers by calling `context.headers.get(headerName)`. +- `responseHeaders` - This is an object with the headers that will be included in the HTTP response. You can set headers by calling `context.responseHeaders.set(headerName, value)`. +- `pathname` - This provides the path part of the URL (no querystring). +- `host` - This provides the host name of the request (from the `Host` header). +- `ip` - This provides the ip address of the client that made the request. +- `body` - This is the request body as a raw NodeJS Readable stream, if there is a request body. +- `data` - If the HTTP request had a request body, this provides a promise to the deserialized data from the request body. (Note that for methods that normally have a request body like `POST` and `PUT`, the resolved deserialized data is passed in as the main argument, but accessing the data from the context provides access to this for requests that do not traditionally have a request body like `DELETE`). When a resource is accessed as a data source: -* `requestContext` - For resources that are acting as a data source for another resource, this provides access to the context of the resource that is making a request for data from the data source resource. Note that it is generally not recommended to rely on this context. The resolved data may be used fulfilled many different requests, and relying on this first request context may not be representative of future requests. Also, source resolution may be triggered by various actions, not just specified endpoints (for example queries, operations, studio, etc.), so make sure you are not relying on specific request context information. +- `requestContext` - For resources that are acting as a data source for another resource, this provides access to the context of the resource that is making a request for data from the data source resource. Note that it is generally not recommended to rely on this context. The resolved data may be used fulfilled many different requests, and relying on this first request context may not be representative of future requests. Also, source resolution may be triggered by various actions, not just specified endpoints (for example queries, operations, studio, etc.), so make sure you are not relying on specific request context information. ### `operation(operationObject: Object, authorize?: boolean): Promise` @@ -292,7 +292,7 @@ The `get`, `put`, `delete`, `publish`, `subscribe`, and `connect` methods all ha This will retrieve a resource instance by id. For example, if you want to retrieve comments by id in the retrieval of a blog post you could do: ```javascript -const { MyTable, Comment } = tables; +const { MyTable, Comment } = tables; ... // in class: async get() { @@ -306,7 +306,7 @@ const { MyTable, Comment } = tables; Type definition for `Id`: ```typescript -Id = string|number|array +Id = string | number | array; ``` ### `get(query: Query, context?: Resource|Context)` @@ -367,7 +367,7 @@ This will define the function to use for a computed attribute. To use this, the ```javascript MyTable.setComputedAttribute('computedAttribute', (record) => { - return record.attribute1 + record.attribute2; + return record.attribute1 + record.attribute2; }); ``` @@ -375,10 +375,10 @@ For a schema like: ```graphql type MyTable @table { - id: ID @primaryKey - attribute1: Int - attribute2: Int - computedAttribute: Int @computed + id: ID @primaryKey + attribute1: Int + attribute2: Int + computedAttribute: Int @computed } ``` @@ -399,25 +399,30 @@ There are additional methods that are only available on table classes (which are This defines the source for a table. This allows a table to function as a cache for an external resource. When a table is configured to have a source, any request for a record that is not found in the table will be delegated to the source resource to retrieve (via `get`) and the result will be cached/stored in the table. All writes to the table will also first be delegated to the source (if the source defines write functions like `put`, `delete`, etc.). The `options` parameter can include an `expiration` property that will configure the table with a time-to-live expiration window for automatic deletion or invalidation of older entries. The `options` parameter (also) supports: -* `expiration` - Default expiration time for records in seconds. -* `eviction` - Eviction time for records in seconds. -* `scanInterval` - Time period for scanning the table for records to evict. +- `expiration` - Default expiration time for records in seconds. +- `eviction` - Eviction time for records in seconds. +- `scanInterval` - Time period for scanning the table for records to evict. If the source resource implements subscription support, real-time invalidation can be performed to ensure the cache is guaranteed to be fresh (and this can eliminate or reduce the need for time-based expiration of data). ### `directURLMapping` + This property can be set to force the direct URL request target to be mapped to the resource primary key. Normally, URL resource targets are parsed, where the path is mapped to the primary key of the resource (and decoded using standard URL decoding), and any query string parameters are used to query that resource. But if this is turned on, the full URL is used as the primary key. For example: + ```javascript export class MyTable extends tables.MyTable { - static directURLMapping = true; + static directURLMapping = true; } ``` + ```http request GET /MyTable/test?foo=bar ``` + This will be mapped to the resource with a primary key of `test?foo=bar`, and no querying will be performed on that resource. ### `getRecordCount({ exactCount: boolean })` + This will return the number of records in the table. By default, this will return an approximate count of records, which is fast and efficient. If you want an exact count, you can pass `{ exactCount: true }` as the first argument, but this will be slower and more expensive. The return value will be a Promise that resolves to an object with a `recordCount` property, which is the number of records in the table. If this was not an exact count, it will also include `estimatedRange` array with estimate range of the count. ### `parsePath(path, context, query) {` @@ -452,10 +457,10 @@ const { Comment } = tables; export class BlogPost extends tables.BlogPost { post(comment) { // add a comment record to the comment table, using this resource as the source for the context - Comment.put(comment, this); + Comment.put(comment, this); this.comments.push(comment.id); // add the id for the record to our array of comment ids // Both of these actions will be committed atomically as part of the same transaction - } + } } ``` @@ -469,22 +474,27 @@ The `get`/`search` methods accept a Query object that can be used to specify a q This is an array of objects that specify the conditions to use the match records (if conditions are omitted or it is an empty array, this is a search for everything in the table). Each condition object can have the following properties: -* `attribute`: Name of the property/attribute to match on. -* `value`: The value to match. -* `comparator`: This can specify how the value is compared. This defaults to "equals", but can also be "greater\_than", "greater\_than\_equal", "less\_than", "less\_than\_equal", "starts\_with", "contains", "ends\_with", "between", and "not\_equal". -* `conditions`: An array of conditions, which follows the same structure as above. -* `operator`: Specifies the operator to apply to this set of conditions (`and` or `or`. This is optional and defaults to `and`). For example, a complex query might look like: +- `attribute`: Name of the property/attribute to match on. +- `value`: The value to match. +- `comparator`: This can specify how the value is compared. This defaults to "equals", but can also be "greater_than", "greater_than_equal", "less_than", "less_than_equal", "starts_with", "contains", "ends_with", "between", and "not_equal". +- `conditions`: An array of conditions, which follows the same structure as above. +- `operator`: Specifies the operator to apply to this set of conditions (`and` or `or`. This is optional and defaults to `and`). For example, a complex query might look like: For example, a more complex query might look like: ```javascript -Table.search({ conditions: [ - { attribute: 'price', comparator: 'less_than', value: 100 }, - { operator: 'or', conditions: [ - { attribute: 'rating', comparator: 'greater_than', value: 4 }, - `{ attribute: 'featured', value: true }` - ]} -]}); +Table.search({ + conditions: [ + { attribute: 'price', comparator: 'less_than', value: 100 }, + { + operator: 'or', + conditions: [ + { attribute: 'rating', comparator: 'greater_than', value: 4 }, + `{ attribute: 'featured', value: true }`, + ], + }, + ], +}); ``` **Chained Attributes/Properties** @@ -492,9 +502,7 @@ Table.search({ conditions: [ Chained attribute/property references can be used to search on properties within related records that are referenced by [relationship properties](../../developers/applications/defining-schemas) (in addition to the [schema documentation](../../developers/applications/defining-schemas), see the [REST documentation](../../developers/rest) for more of overview of relationships and querying). Chained property references are specified with an array, with each entry in the array being a property name for successive property references. For example, if a relationship property called `brand` has been defined that references a `Brand` table, we could search products by brand name: ```javascript -Product.search({ conditions: [ - `{ attribute: ['brand', 'name'], value: 'Harper' }` -]}); +Product.search({ conditions: [`{ attribute: ['brand', 'name'], value: 'Harper' }`] }); ``` This effectively executes a join, searching on the `Brand` table and joining results with matching records in the `Product` table. Chained array properties can be used in any condition, as well nested/grouped conditions. The chain of properties may also be more than two entries, allowing for multiple relationships to be traversed, effectively joining across multiple tables. An array of chained properties can also be used as the `attribute` in the `sort` property, allowing for sorting by an attribute in a referenced joined tables. @@ -527,8 +535,8 @@ Table.search({ select: [ 'name', `{ name: 'related', select: ['description', 'id The select properties can also include certain special properties: -* `$id` - This will specifically return the primary key of the record (regardless of name, even if there is no defined primary key attribute for the table). -* `$updatedtime` - This will return the last updated timestamp/version of the record (regardless of whether there is an attribute for the updated time). +- `$id` - This will specifically return the primary key of the record (regardless of name, even if there is no defined primary key attribute for the table). +- `$updatedtime` - This will return the last updated timestamp/version of the record (regardless of whether there is an attribute for the updated time). Alternately, the select value can be a string value, to specify that the value of the specified property should be returned for each iteration/element in the results. For example to just return an iterator of the `id`s of object: @@ -540,9 +548,9 @@ Table.search({ select: 'id', conditions: ...}) This defines the sort order, and should be an object that can have the following properties: -* `attributes`: The attribute to sort on. -* `descending`: If true, will sort in descending order (optional and defaults to `false`). -* `next`: Specifies the next sort order to resolve ties. This is an object that follows the same structure as `sort`. +- `attributes`: The attribute to sort on. +- `descending`: If true, will sort in descending order (optional and defaults to `false`). +- `next`: Specifies the next sort order to resolve ties. This is an object that follows the same structure as `sort`. #### `explain` @@ -566,8 +574,8 @@ let results = Product.search({ offset: 20, limit: 10, select: ['id', 'name', 'price', 'rating'], - sort: `{ attribute: 'price' }` -}) + sort: `{ attribute: 'price' }`, +}); for await (let record of results) { // iterate through each record in the query results } @@ -595,7 +603,7 @@ export class CustomProduct extends Product { get(query) { let name = this.name; // this is the name of the current product let rating = this.rating; // this is the rating of the current product - this.rating = 3 // we can also modify the rating for the current instance + this.rating = 3; // we can also modify the rating for the current instance // (with a get this won't be saved by default, but will be used when serialized) return super.get(query); } @@ -608,8 +616,7 @@ Likewise, we can interact with resource instances in the same way when retrievin let product1 = await Product.get(1); let name = product1.name; // this is the name of the product with a primary key of 1 let rating = product1.rating; // this is the rating of the product with a primary key of 1 -product1.rating = 3 // modify the rating for this instance (this will be saved without a call to update()) - +product1.rating = 3; // modify the rating for this instance (this will be saved without a call to update()) ``` If there are additional properties on (some) products that aren't defined in the schema, we can still access them through the resource instance, but since they aren't declared, there won't be getter/setter definition for direct property access, but we can access properties with the `get(propertyName)` method and modify properties with the `set(propertyName, value)` method: @@ -617,7 +624,7 @@ If there are additional properties on (some) products that aren't defined in the ```javascript let product1 = await Product.get(1); let additionalInformation = product1.get('additionalInformation'); // get the additionalInformation property value even though it isn't defined in the schema -product1.set('newProperty', 'some value'); // we can assign any properties we want with set +product1.set('newProperty', 'some value'); // we can assign any properties we want with set ``` And likewise, we can do this in an instance method, although you will probably want to use super.get()/set() so you don't have to write extra logic to avoid recursion: @@ -626,7 +633,7 @@ And likewise, we can do this in an instance method, although you will probably w export class CustomProduct extends Product { get(query) { let additionalInformation = super.get('additionalInformation'); // get the additionalInformation property value even though it isn't defined in the schema - super.set('newProperty', 'some value'); // we can assign any properties we want with set + super.set('newProperty', 'some value'); // we can assign any properties we want with set } } ``` diff --git a/site/versioned_docs/version-4.5/technical-details/reference/transactions.md b/site/versioned_docs/version-4.5/technical-details/reference/transactions.md index e0851655..7e8546fb 100644 --- a/site/versioned_docs/version-4.5/technical-details/reference/transactions.md +++ b/site/versioned_docs/version-4.5/technical-details/reference/transactions.md @@ -18,7 +18,7 @@ This executes the callback in a transaction, providing a context that can be use ```javascript import { tables } from 'harperdb'; -const { MyTable } = tables; +const { MyTable } = tables; if (isMainThread) // only on main thread setInterval(async () => { let someData = await (await fetch(... some URL ...)).json(); @@ -34,7 +34,7 @@ You can provide your own context object for the transaction to attach to. If you Once the transaction callback is completed (for non-nested transaction calls), the transaction will commit, and if the callback throws an error, the transaction will abort. However, the callback is called with the `transaction` object, which also provides the following methods and property: -* `commit(): Promise` - Commits the current transaction. The transaction will be committed once the returned promise resolves. -* `abort(): void` - Aborts the current transaction and resets it. -* `resetReadSnapshot(): void` - Resets the read snapshot for the transaction, resetting to the latest data in the database. -* `timestamp: number` - This is the timestamp associated with the current transaction. +- `commit(): Promise` - Commits the current transaction. The transaction will be committed once the returned promise resolves. +- `abort(): void` - Aborts the current transaction and resets it. +- `resetReadSnapshot(): void` - Resets the read snapshot for the transaction, resetting to the latest data in the database. +- `timestamp: number` - This is the timestamp associated with the current transaction. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/index.md b/site/versioned_docs/version-4.5/technical-details/release-notes/index.md index 3ca46792..4799d4a6 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/index.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/index.md @@ -238,7 +238,7 @@ title: Release Notes [3.0.0 Monkey](./v3-monkey/3.0.0) -*** +--- [Meet Penny](./v2-penny/) Our 2nd Release Pup @@ -254,7 +254,7 @@ title: Release Notes [2.1.1 Penny](./v2-penny/2.1.1) -*** +--- [Meet Alby](./v1-alby/) Our 1st Release Pup diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.1.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.1.0.md index b42514a2..2256a825 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.1.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.1.0.md @@ -4,74 +4,69 @@ sidebar_position: 89899 --- ### HarperDB 1.1.0, Alby Release + 4/18/2018 **Features** -* Users & Roles: +- Users & Roles: + - Limit/Assign access to all HarperDB operations + + - Limit/Assign access to schemas, tables & attributes + + - Limit/Assign access to specific SQL operations (`INSERT`, `UPDATE`, `DELETE`, `SELECT`) - * Limit/Assign access to all HarperDB operations +- Enhanced SQL parser + - Added extensive ANSI SQL Support. + - Added Array function, which allows for converting relational data into Object/Hierarchical data + - `Distinct_Array` Function: allows for removing duplicates in the Array function. + - Enhanced SQL Validation: Improved validation around structure of SQL, validating the schema, etc.. + - 10x performance improvement on SQL statements. - * Limit/Assign access to schemas, tables & attributes +- Export Function: can now call a NoSQL/SQL search and have it export to CSV or JSON. - * Limit/Assign access to specific SQL operations (`INSERT`, `UPDATE`, `DELETE`, `SELECT`) - -* Enhanced SQL parser - - * Added extensive ANSI SQL Support. - - * Added Array function, which allows for converting relational data into Object/Hierarchical data - - * `Distinct_Array` Function: allows for removing duplicates in the Array function. - - * Enhanced SQL Validation: Improved validation around structure of SQL, validating the schema, etc.. - - * 10x performance improvement on SQL statements. - -* Export Function: can now call a NoSQL/SQL search and have it export to CSV or JSON. +- Added upgrade function to CLI -* Added upgrade function to CLI +- Added ability to perform bulk update from CSV -* Added ability to perform bulk update from CSV +- Created landing page for HarperDB. -* Created landing page for HarperDB. +- Added CORS support to HarperDB -* Added CORS support to HarperDB - **Fixes** -* Fixed memory leak in CSV bulk loads +- Fixed memory leak in CSV bulk loads -* Corrected error when attempting to perform a `SQL DELETE` +- Corrected error when attempting to perform a `SQL DELETE` -* Added further validation to NoSQL `UPDATE` to validate schema & table exist +- Added further validation to NoSQL `UPDATE` to validate schema & table exist -* Fixed install issue occurring when part of the install path does not exist, the install would silently fail. +- Fixed install issue occurring when part of the install path does not exist, the install would silently fail. -* Fixed issues with replicated data when one of the replicas is down +- Fixed issues with replicated data when one of the replicas is down -* Removed logging of initial user’s credentials during install +- Removed logging of initial user’s credentials during install -* Can now use reserved words as aliases in SQL +- Can now use reserved words as aliases in SQL -* Removed user(s) password in results when calling `list_users` +- Removed user(s) password in results when calling `list_users` -* Corrected forwarding of operations to other nodes in a cluster +- Corrected forwarding of operations to other nodes in a cluster -* Corrected lag in schema meta-data passing to other nodes in a cluster +- Corrected lag in schema meta-data passing to other nodes in a cluster -* Drop table & schema now move the table & schema or table to the trash folder under the Database folder for later permanent deletion. +- Drop table & schema now move the table & schema or table to the trash folder under the Database folder for later permanent deletion. -* Bulk inserts no longer halt the entire operation if n records already exist, instead the return includes the hashes of records that have been skipped. +- Bulk inserts no longer halt the entire operation if n records already exist, instead the return includes the hashes of records that have been skipped. -* Added ability to accept EULA from command line +- Added ability to accept EULA from command line -* Corrected `search_by_value` not searching on the correct attribute +- Corrected `search_by_value` not searching on the correct attribute -* Added ability to increase the timeout of a request by adding `SERVER_TIMEOUT_MS` to config/settings.js +- Added ability to increase the timeout of a request by adding `SERVER_TIMEOUT_MS` to config/settings.js -* Add error handling resulting from SQL calculations. +- Add error handling resulting from SQL calculations. -* Standardized error responses as JSON. +- Standardized error responses as JSON. -* Corrected internal process generation to not allow more processes than machine has cores. \ No newline at end of file +- Corrected internal process generation to not allow more processes than machine has cores. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.2.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.2.0.md index 095bf239..a504a7ad 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.2.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.2.0.md @@ -4,39 +4,39 @@ sidebar_position: 89799 --- ### HarperDB 1.2.0, Alby Release + 7/10/2018 **Features** -* Time to Live: Conserve the resources of your edge device by setting data on devices to live for a specific period of time. -* Geo: HarperDB has implemented turf.js into its SQL parser to enable geo based analytics. -* Jobs: CSV Data loads, Exports & Time to Live now all run as back ground jobs. -* Exports: Perform queries that export into JSON or CSV and save to disk or S3. - +- Time to Live: Conserve the resources of your edge device by setting data on devices to live for a specific period of time. +- Geo: HarperDB has implemented turf.js into its SQL parser to enable geo based analytics. +- Jobs: CSV Data loads, Exports & Time to Live now all run as back ground jobs. +- Exports: Perform queries that export into JSON or CSV and save to disk or S3. **Fixes** -* Fixed issue where CSV data loads incorrectly report number of records loaded. -* Added validation to stop `BETWEEN` operations in SQL. -* Updated logging to not include internal variables in the logs. -* Cleaned up `add_role` response to not include internal variables. -* Removed old and unused dependencies. -* Build out further unit tests and integration tests. -* Fixed https to handle certificates properly. -* Improved stability of clustering & replication. -* Corrected issue where Objects and Arrays were not casting properly in `SQL SELECT` response. -* Fixed issue where Blob text was not being returned from `SQL SELECT`s. -* Fixed error being returned when querying on table with no data, now correctly returns empty array. -* Improved performance in SQL when searching on exact values. -* Fixed error when ./harperdb stop is called. -* Fixed logging issue causing instability in installer. -* Fixed `read_log` operation to accept date time. -* Added permissions checking to `export_to_s3`. -* Added ability to run SQL on `SELECT` without a `FROM`. -* Fixed issue where updating a user’s password was not encrypting properly. -* Fixed `user_guide.html` to point to readme on git repo. -* Created option to have HarperDB run as a foreground process. -* Updated `user_info` to return the correct role for a user. -* Fixed issue where HarperDB would not stop if the database root was deleted. -* Corrected error message on insert if an invalid schema is provided. -* Added permissions checks for user & role operations. \ No newline at end of file +- Fixed issue where CSV data loads incorrectly report number of records loaded. +- Added validation to stop `BETWEEN` operations in SQL. +- Updated logging to not include internal variables in the logs. +- Cleaned up `add_role` response to not include internal variables. +- Removed old and unused dependencies. +- Build out further unit tests and integration tests. +- Fixed https to handle certificates properly. +- Improved stability of clustering & replication. +- Corrected issue where Objects and Arrays were not casting properly in `SQL SELECT` response. +- Fixed issue where Blob text was not being returned from `SQL SELECT`s. +- Fixed error being returned when querying on table with no data, now correctly returns empty array. +- Improved performance in SQL when searching on exact values. +- Fixed error when ./harperdb stop is called. +- Fixed logging issue causing instability in installer. +- Fixed `read_log` operation to accept date time. +- Added permissions checking to `export_to_s3`. +- Added ability to run SQL on `SELECT` without a `FROM`. +- Fixed issue where updating a user’s password was not encrypting properly. +- Fixed `user_guide.html` to point to readme on git repo. +- Created option to have HarperDB run as a foreground process. +- Updated `user_info` to return the correct role for a user. +- Fixed issue where HarperDB would not stop if the database root was deleted. +- Corrected error message on insert if an invalid schema is provided. +- Added permissions checks for user & role operations. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.3.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.3.0.md index ad196159..e3a5215f 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.3.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.3.0.md @@ -4,24 +4,24 @@ sidebar_position: 89699 --- ### HarperDB 1.3.0, Alby Release + 11/2/2018 **Features** -* Upgrade: Upgrade to newest version via command line. -* SQL Support: Added `IS NULL` for SQL parser. -* Added attribute validation to search operations. - +- Upgrade: Upgrade to newest version via command line. +- SQL Support: Added `IS NULL` for SQL parser. +- Added attribute validation to search operations. **Fixes** -* Fixed `SELECT` calculations, i.e. `SELECT` 2+2. -* Fixed select OR not returning expected results. -* No longer allowing reserved words for schema and table names. -* Corrected process interruptions from improper SQL statements. -* Improved message handling between spawned processes that replace killed processes. -* Enhanced error handling for updates to tables that do not exist. -* Fixed error handling for NoSQL responses when `get_attributes` is provided with invalid attributes. -* Fixed issue with new columns not being updated properly in update statements. -* Now validating roles, tables and attributes when creating or updating roles. -* Fixed an issue where in some cases `undefined` was being returned after dropping a role +- Fixed `SELECT` calculations, i.e. `SELECT` 2+2. +- Fixed select OR not returning expected results. +- No longer allowing reserved words for schema and table names. +- Corrected process interruptions from improper SQL statements. +- Improved message handling between spawned processes that replace killed processes. +- Enhanced error handling for updates to tables that do not exist. +- Fixed error handling for NoSQL responses when `get_attributes` is provided with invalid attributes. +- Fixed issue with new columns not being updated properly in update statements. +- Now validating roles, tables and attributes when creating or updating roles. +- Fixed an issue where in some cases `undefined` was being returned after dropping a role diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.3.1.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.3.1.md index 77e3ffe4..56927389 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.3.1.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/1.3.1.md @@ -4,26 +4,26 @@ sidebar_position: 89698 --- ### HarperDB 1.3.1, Alby Release + 2/26/2019 **Features** -* Clustering connection direction appointment -* Foundations for threading/multi processing -* UUID autogen for hash attributes that were not provided -* Added cluster status operation - +- Clustering connection direction appointment +- Foundations for threading/multi processing +- UUID autogen for hash attributes that were not provided +- Added cluster status operation **Bug Fixes and Enhancements** -* More logging -* Clustering communication enhancements -* Clustering queue ordering by timestamps -* Cluster re connection enhancements -* Number of system core(s) detection -* Node LTS (10.15) compatibility -* Update/Alter users enhancements -* General performance enhancements -* Warning is logged if different versions of harperdb are connected via clustering -* Fixed need to restart after user creation/alteration -* Fixed SQL error that occurred on selecting from an empty table \ No newline at end of file +- More logging +- Clustering communication enhancements +- Clustering queue ordering by timestamps +- Cluster re connection enhancements +- Number of system core(s) detection +- Node LTS (10.15) compatibility +- Update/Alter users enhancements +- General performance enhancements +- Warning is logged if different versions of harperdb are connected via clustering +- Fixed need to restart after user creation/alteration +- Fixed SQL error that occurred on selecting from an empty table diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/_category_.json b/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/_category_.json index e33195ec..9eded684 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/_category_.json +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v1-alby/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Alby (Version 1)", - "position": -1 -} \ No newline at end of file + "label": "HarperDB Alby (Version 1)", + "position": -1 +} diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.1.1.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.1.1.md index e1314a5f..c59337d7 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.1.1.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.1.1.md @@ -4,24 +4,25 @@ sidebar_position: 79898 --- ### HarperDB 2.1.1, Penny Release + 05/22/2020 **Highlights** -* CORE-1007 Added the ability to perform `SQL INSERT` & `UPDATE` with function calls & expressions on values. -* CORE-1023 Fixed minor bug in final SQL step incorrectly trying to translate ordinals to alias in `ORDER BY` statement. -* CORE-1020 Fixed bug allowing 'null' and 'undefined' string values to be passed in as valid hash values. -* CORE-1006 Added SQL functionality that enables `JOIN` statements across different schemas. -* CORE-1005 Implemented JSONata library to handle our JSON document search functionality in SQL, creating the `SEARCH_JSON` function. -* CORE-1009 Updated schema validation to allow all printable ASCII characters to be used in schema/table/attribute names, except, forward slashes and backticks. Same rules apply now for hash attribute values. -* CORE-1003 Fixed handling of ORDER BY statements with function aliases. -* CORE-1004 Fixed bug related to `SELECT*` on `JOIN` queries with table columns with the same name. -* CORE-996 Fixed an issue where the `transact_to_cluster` flag is lost for CSV URL loads, fixed an issue where new attributes created in CSV bulk load do not sync to the cluster. -* CORE-994 Added new operation `system_information`. This operation returns info & metrics for the OS, time, memory, cpu, disk, network. -* CORE-993 Added new custom date functions for AlaSQL & UTC updates. -* CORE-991 Changed jobs to spawn a new process which will run the intended job without impacting a main HarperDB process. -* CORE-992 HTTPS enabled by default. -* CORE-990 Updated `describe_table` to add the record count for the table for LMDB data storage. -* CORE-989 Killed the socket cluster processes prior to HarperDB processes to eliminate a false uptime. -* CORE-975 Updated time values set by SQL Date Functions to be in epoch format. -* CORE-974 Added date functions to `SQL SELECT` column alias functionality. \ No newline at end of file +- CORE-1007 Added the ability to perform `SQL INSERT` & `UPDATE` with function calls & expressions on values. +- CORE-1023 Fixed minor bug in final SQL step incorrectly trying to translate ordinals to alias in `ORDER BY` statement. +- CORE-1020 Fixed bug allowing 'null' and 'undefined' string values to be passed in as valid hash values. +- CORE-1006 Added SQL functionality that enables `JOIN` statements across different schemas. +- CORE-1005 Implemented JSONata library to handle our JSON document search functionality in SQL, creating the `SEARCH_JSON` function. +- CORE-1009 Updated schema validation to allow all printable ASCII characters to be used in schema/table/attribute names, except, forward slashes and backticks. Same rules apply now for hash attribute values. +- CORE-1003 Fixed handling of ORDER BY statements with function aliases. +- CORE-1004 Fixed bug related to `SELECT*` on `JOIN` queries with table columns with the same name. +- CORE-996 Fixed an issue where the `transact_to_cluster` flag is lost for CSV URL loads, fixed an issue where new attributes created in CSV bulk load do not sync to the cluster. +- CORE-994 Added new operation `system_information`. This operation returns info & metrics for the OS, time, memory, cpu, disk, network. +- CORE-993 Added new custom date functions for AlaSQL & UTC updates. +- CORE-991 Changed jobs to spawn a new process which will run the intended job without impacting a main HarperDB process. +- CORE-992 HTTPS enabled by default. +- CORE-990 Updated `describe_table` to add the record count for the table for LMDB data storage. +- CORE-989 Killed the socket cluster processes prior to HarperDB processes to eliminate a false uptime. +- CORE-975 Updated time values set by SQL Date Functions to be in epoch format. +- CORE-974 Added date functions to `SQL SELECT` column alias functionality. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.2.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.2.0.md index 267168cd..a669ca8b 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.2.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.2.0.md @@ -4,40 +4,41 @@ sidebar_position: 79799 --- ### HarperDB 2.2.0, Penny Release + 08/24/2020 **Features/Updates** -* CORE-997 Updated the data format for CSV data loads being sync'd across a cluster to take up less resources -* CORE-1018 Adds SQL functionality for `BETWEEN` statements -* CORE-1032 Updates permissions to allow regular users (i.e. non-super users) to call the `get_job` operation -* CORE-1036 On create/drop table we auto create/drop the related transactions environments for the schema.table -* CORE-1042 Built raw functions to write to a tables transaction log for insert/update/delete operations -* CORE-1057 Implemented write transaction into lmdb create/update/delete functions -* CORE-1048 Adds `SEARCH` wildcard handling for role permissions standards -* CORE-1059 Added config setting to disable transaction logging for an instance -* CORE-1076 Adds permissions filter to describe operations -* CORE-1043 Change clustering catchup to use the new transaction log -* CORE-1052 Removed word "master" from source -* CORE-1061 Added new operation called `delete_transactions_before` this will tail a transaction log for a specific schema / table -* CORE-1040 On HarperDB startup make sure all tables have a transaction environment -* CORE-1055 Added 2 new setting to change the server headersTimeout & keepAliveTimeout from the config file -* CORE-1044 Created new operation `read_transaction_log` which will allow a user to get transactions for a table by `timestamp`, `username`, or `hash_value` -* CORE-1043 Change clustering catchup to use the new transaction log -* CORE-1089 Added new attribute to `system_information` for table/transaction log data size in bytes & transaction log record count -* CORE-1101 Fix to store empty strings rather than considering them null & fix to be able to search on empty strings in SQL/NoSQL. -* CORE-1054 Updates permissions object to remove delete attribute permission and update table attribute permission key to `attribute_permissions` -* CORE-1092 Do not allow the `__createdtime__` to be updated -* CORE-1085 Updates create schema/table & drop schema/table/attribute operations permissions to require super user role and adds integration tests to validate -* CORE-1071 Updates response messages and status codes from `describe_schema` and `describe_table` operations to provide standard language/status code when a schema item is not found -* CORE-1049 Updates response message for SQL update op with no matching rows -* CORE-1096 Added tracking of the origin in the transaction log. This origin object stores the node name, timestamp of the transaction from the originating node & the user. +- CORE-997 Updated the data format for CSV data loads being sync'd across a cluster to take up less resources +- CORE-1018 Adds SQL functionality for `BETWEEN` statements +- CORE-1032 Updates permissions to allow regular users (i.e. non-super users) to call the `get_job` operation +- CORE-1036 On create/drop table we auto create/drop the related transactions environments for the schema.table +- CORE-1042 Built raw functions to write to a tables transaction log for insert/update/delete operations +- CORE-1057 Implemented write transaction into lmdb create/update/delete functions +- CORE-1048 Adds `SEARCH` wildcard handling for role permissions standards +- CORE-1059 Added config setting to disable transaction logging for an instance +- CORE-1076 Adds permissions filter to describe operations +- CORE-1043 Change clustering catchup to use the new transaction log +- CORE-1052 Removed word "master" from source +- CORE-1061 Added new operation called `delete_transactions_before` this will tail a transaction log for a specific schema / table +- CORE-1040 On HarperDB startup make sure all tables have a transaction environment +- CORE-1055 Added 2 new setting to change the server headersTimeout & keepAliveTimeout from the config file +- CORE-1044 Created new operation `read_transaction_log` which will allow a user to get transactions for a table by `timestamp`, `username`, or `hash_value` +- CORE-1043 Change clustering catchup to use the new transaction log +- CORE-1089 Added new attribute to `system_information` for table/transaction log data size in bytes & transaction log record count +- CORE-1101 Fix to store empty strings rather than considering them null & fix to be able to search on empty strings in SQL/NoSQL. +- CORE-1054 Updates permissions object to remove delete attribute permission and update table attribute permission key to `attribute_permissions` +- CORE-1092 Do not allow the `__createdtime__` to be updated +- CORE-1085 Updates create schema/table & drop schema/table/attribute operations permissions to require super user role and adds integration tests to validate +- CORE-1071 Updates response messages and status codes from `describe_schema` and `describe_table` operations to provide standard language/status code when a schema item is not found +- CORE-1049 Updates response message for SQL update op with no matching rows +- CORE-1096 Added tracking of the origin in the transaction log. This origin object stores the node name, timestamp of the transaction from the originating node & the user. **Bug Fixes** -* CORE-1028 Fixes bug for simple `SQL SELECT` queries not returning aliases and incorrectly returning hash values when not requested in query -* CORE-1037 Fixed an issue where numbers with leading zero i.e. 00123 are converted to numbers rather than being honored as strings. -* CORE-1063 Updates permission error response shape to consolidate issues into individual objects per schema/table combo -* CORE-1098 Fixed an issue where transaction environments were remaining in the global cache after being dropped. -* CORE-1086 Fixed issue where responses from insert/update were incorrect with skipped records. -* CORE-1079 Fixes SQL bugs around invalid schema/table and special characters in `WHERE` clause \ No newline at end of file +- CORE-1028 Fixes bug for simple `SQL SELECT` queries not returning aliases and incorrectly returning hash values when not requested in query +- CORE-1037 Fixed an issue where numbers with leading zero i.e. 00123 are converted to numbers rather than being honored as strings. +- CORE-1063 Updates permission error response shape to consolidate issues into individual objects per schema/table combo +- CORE-1098 Fixed an issue where transaction environments were remaining in the global cache after being dropped. +- CORE-1086 Fixed issue where responses from insert/update were incorrect with skipped records. +- CORE-1079 Fixes SQL bugs around invalid schema/table and special characters in `WHERE` clause diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.2.2.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.2.2.md index 827c63db..fca00967 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.2.2.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.2.2.md @@ -4,13 +4,14 @@ sidebar_position: 79797 --- ### HarperDB 2.2.2, Penny Release + 10/27/2020 -* CORE-1154 Allowed transaction logging to be disabled even if clustering is enabled. -* CORE-1153 Fixed issue where `delete_files_before` was writing to transaction log. -* CORE-1152 Fixed issue where no more than 4 HarperDB forks would be created. -* CORE-1112 Adds handling for system timestamp attributes in permissions. -* CORE-1131 Adds better handling for checking perms on operations with action value in JSON. -* CORE-1113 Fixes validation bug checking for super user/cluster user permissions and other permissions. -* CORE-1135 Adds validation for valid keys in role API operations. -* CORE-1073 Adds new `import_from_s3` operation to API. +- CORE-1154 Allowed transaction logging to be disabled even if clustering is enabled. +- CORE-1153 Fixed issue where `delete_files_before` was writing to transaction log. +- CORE-1152 Fixed issue where no more than 4 HarperDB forks would be created. +- CORE-1112 Adds handling for system timestamp attributes in permissions. +- CORE-1131 Adds better handling for checking perms on operations with action value in JSON. +- CORE-1113 Fixes validation bug checking for super user/cluster user permissions and other permissions. +- CORE-1135 Adds validation for valid keys in role API operations. +- CORE-1073 Adds new `import_from_s3` operation to API. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.2.3.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.2.3.md index eca953e2..06b89d4e 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.2.3.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.2.3.md @@ -4,6 +4,7 @@ sidebar_position: 79796 --- ### HarperDB 2.2.3, Penny Release + 11/16/2020 -* CORE-1158 Performance improvements to core delete function and configuration of `delete_files_before` to run in batches with a pause into between. \ No newline at end of file +- CORE-1158 Performance improvements to core delete function and configuration of `delete_files_before` to run in batches with a pause into between. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.3.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.3.0.md index 2b248490..a027eedb 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.3.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.3.0.md @@ -4,19 +4,20 @@ sidebar_position: 79699 --- ### HarperDB 2.3.0, Penny Release + 12/03/2020 **Features/Updates** -* CORE-1191, CORE-1190, CORE-1125, CORE-1157, CORE-1126, CORE-1140, CORE-1134, CORE-1123, CORE-1124, CORE-1122 Added JWT Authentication option (See documentation for more information) -* CORE-1128, CORE-1143, CORE-1140, CORE-1129 Added `upsert` operation -* CORE-1187 Added `get_configuration` operation which allows admins to view their configuration settings. -* CORE-1175 Added new internal LMDB function to copy an environment for use in future features. -* CORE-1166 Updated packages to address security vulnerabilities. +- CORE-1191, CORE-1190, CORE-1125, CORE-1157, CORE-1126, CORE-1140, CORE-1134, CORE-1123, CORE-1124, CORE-1122 Added JWT Authentication option (See documentation for more information) +- CORE-1128, CORE-1143, CORE-1140, CORE-1129 Added `upsert` operation +- CORE-1187 Added `get_configuration` operation which allows admins to view their configuration settings. +- CORE-1175 Added new internal LMDB function to copy an environment for use in future features. +- CORE-1166 Updated packages to address security vulnerabilities. **Bug Fixes** -* CORE-1195 Modified `drop_attribute` to drop after data cleanse completes. -* CORE-1149 Fix SQL bug regarding self joins and updates alasql to 0.6.5 release. -* CORE-1168 Fix inconsistent invalid schema/table errors. -* CORE-1162 Fix bug which caused `delete_files_before` to cause tables to grow in size due to an open cursor issue. \ No newline at end of file +- CORE-1195 Modified `drop_attribute` to drop after data cleanse completes. +- CORE-1149 Fix SQL bug regarding self joins and updates alasql to 0.6.5 release. +- CORE-1168 Fix inconsistent invalid schema/table errors. +- CORE-1162 Fix bug which caused `delete_files_before` to cause tables to grow in size due to an open cursor issue. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.3.1.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.3.1.md index 51291a01..03df0186 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.3.1.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/2.3.1.md @@ -4,9 +4,10 @@ sidebar_position: 79698 --- ### HarperDB 2.3.1, Penny Release + 1/29/2021 **Bug Fixes** -* CORE-1218 A bug in HarperDB 2.3.0 was identified related to manually calling the `create_attribute` operation. This bug caused secondary indexes to be overwritten by the most recently inserted or updated value for the index, thereby causing a search operation filtered with that index to only return the most recently inserted/updated row. Note, this issue does not affect attributes that are reflexively/automatically created. It only affects attributes created using `create_attribute`. To resolve this issue in 2.3.0 or earlier, drop and recreate your table using reflexive attribute creation. In 2.3.1, drop and recreate your table and use either reflexive attribute creation or `create_attribute`. -* CORE-1219 Increased maximum table attributes from 1000 to 10000 \ No newline at end of file +- CORE-1218 A bug in HarperDB 2.3.0 was identified related to manually calling the `create_attribute` operation. This bug caused secondary indexes to be overwritten by the most recently inserted or updated value for the index, thereby causing a search operation filtered with that index to only return the most recently inserted/updated row. Note, this issue does not affect attributes that are reflexively/automatically created. It only affects attributes created using `create_attribute`. To resolve this issue in 2.3.0 or earlier, drop and recreate your table using reflexive attribute creation. In 2.3.1, drop and recreate your table and use either reflexive attribute creation or `create_attribute`. +- CORE-1219 Increased maximum table attributes from 1000 to 10000 diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/_category_.json b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/_category_.json index 285eecf7..28f86bc1 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/_category_.json +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v2-penny/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Penny (Version 2)", - "position": -2 -} \ No newline at end of file + "label": "HarperDB Penny (Version 2)", + "position": -2 +} diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.0.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.0.0.md index 2907ee6c..10319747 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.0.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.0.0.md @@ -4,28 +4,29 @@ sidebar_position: 69999 --- ### HarperDB 3.0, Monkey Release + 5/18/2021 **Features/Updates** -* CORE-1217, CORE-1226, CORE-1232 Create new `search_by_conditions` operation. -* CORE-1304 Upgrade to Node 12.22.1. -* CORE-1235 Adds new upgrade/install functionality. -* CORE-1206, CORE-1248, CORE-1252 Implement `lmdb-store` library for optimized performance. -* CORE-1062 Added alias operation for `delete_files_before`, named `delete_records_before`. -* CORE-1243 Change `HTTPS_ON` settings value to false by default. -* CORE-1189 Implement fastify web server, resulting in improved performance. -* CORE-1221 Update user API to use role name instead of role id. -* CORE-1225 Updated dependencies to eliminate npm security warnings. -* CORE-1241 Adds 3.0 update directive and refactors/fixes update functionality. +- CORE-1217, CORE-1226, CORE-1232 Create new `search_by_conditions` operation. +- CORE-1304 Upgrade to Node 12.22.1. +- CORE-1235 Adds new upgrade/install functionality. +- CORE-1206, CORE-1248, CORE-1252 Implement `lmdb-store` library for optimized performance. +- CORE-1062 Added alias operation for `delete_files_before`, named `delete_records_before`. +- CORE-1243 Change `HTTPS_ON` settings value to false by default. +- CORE-1189 Implement fastify web server, resulting in improved performance. +- CORE-1221 Update user API to use role name instead of role id. +- CORE-1225 Updated dependencies to eliminate npm security warnings. +- CORE-1241 Adds 3.0 update directive and refactors/fixes update functionality. **Bug Fixes** -* CORE-1299 Remove all references to the `PROJECT_DIR` setting. This setting is problematic when using node version managers and upgrading the version of node and then installing a new instance of HarperDB. -* CORE-1288 Fix bug with drop table/schema that was causing 'env required' error log. -* CORE-1285 Update warning log when trying to create an attribute that already exists. -* CORE-1254 Added logic to manage data collisions in clustering. -* CORE-1212 Add pre-check to `drop_user` that returns error if user doesn't exist. -* CORE-1114 Update response code and message from `add_user` when user already exists. -* CORE-1111 Update response from `create_attribute` to match the create schema/table response. -* CORE-1205 Fixed bug that prevented schema/table from being dropped if name was a number or had a wildcard value in it. Updated validation for insert, upsert and update. \ No newline at end of file +- CORE-1299 Remove all references to the `PROJECT_DIR` setting. This setting is problematic when using node version managers and upgrading the version of node and then installing a new instance of HarperDB. +- CORE-1288 Fix bug with drop table/schema that was causing 'env required' error log. +- CORE-1285 Update warning log when trying to create an attribute that already exists. +- CORE-1254 Added logic to manage data collisions in clustering. +- CORE-1212 Add pre-check to `drop_user` that returns error if user doesn't exist. +- CORE-1114 Update response code and message from `add_user` when user already exists. +- CORE-1111 Update response from `create_attribute` to match the create schema/table response. +- CORE-1205 Fixed bug that prevented schema/table from being dropped if name was a number or had a wildcard value in it. Updated validation for insert, upsert and update. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.0.md index 148690f6..f14acb8e 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.0.md @@ -4,20 +4,21 @@ sidebar_position: 69899 --- ### HarperDB 3.1.0, Monkey Release + 8/24/2021 **Features/Updates** -* CORE-1320, CORE-1321, CORE-1323, CORE-1324 Version 1.0 of HarperDB Custom Functions -* CORE-1275, CORE-1276, CORE-1278, CORE-1279, CORE-1280, CORE-1282, CORE-1283, CORE-1305, CORE-1314 IPC server for communication between HarperDB processes, including HarperDB, HarperDB Clustering, and HarperDB Functions -* CORE-1352, CORE-1355, CORE-1356, CORE-1358 Implement pm2 for HarperDB process management -* CORE-1292, CORE-1308, CORE-1312, CORE-1334, CORE-1338 Updated installation process to start HarperDB immediately on install and to accept all config settings via environment variable or command line arguments -* CORE-1310 Updated licensing functionality -* CORE-1301 Updated validation for performance improvement -* CORE-1359 Add `hdb-response-time` header which returns the HarperDB response time in milliseconds -* CORE-1330, CORE-1309 New config settings: `LOG_TO_FILE`, `LOG_TO_STDSTREAMS`, `IPC_SERVER_PORT`, `RUN_IN_FOREGROUND`, `CUSTOM_FUNCTIONS`, `CUSTOM_FUNCTIONS_PORT`, `CUSTOM_FUNCTIONS_DIRECTORY`, `MAX_CUSTOM_FUNCTION_PROCESSES` +- CORE-1320, CORE-1321, CORE-1323, CORE-1324 Version 1.0 of HarperDB Custom Functions +- CORE-1275, CORE-1276, CORE-1278, CORE-1279, CORE-1280, CORE-1282, CORE-1283, CORE-1305, CORE-1314 IPC server for communication between HarperDB processes, including HarperDB, HarperDB Clustering, and HarperDB Functions +- CORE-1352, CORE-1355, CORE-1356, CORE-1358 Implement pm2 for HarperDB process management +- CORE-1292, CORE-1308, CORE-1312, CORE-1334, CORE-1338 Updated installation process to start HarperDB immediately on install and to accept all config settings via environment variable or command line arguments +- CORE-1310 Updated licensing functionality +- CORE-1301 Updated validation for performance improvement +- CORE-1359 Add `hdb-response-time` header which returns the HarperDB response time in milliseconds +- CORE-1330, CORE-1309 New config settings: `LOG_TO_FILE`, `LOG_TO_STDSTREAMS`, `IPC_SERVER_PORT`, `RUN_IN_FOREGROUND`, `CUSTOM_FUNCTIONS`, `CUSTOM_FUNCTIONS_PORT`, `CUSTOM_FUNCTIONS_DIRECTORY`, `MAX_CUSTOM_FUNCTION_PROCESSES` **Bug Fixes** -* CORE-1315 Corrected issue in HarperDB restart scenario -* CORE-1370 Update some of the validation error handlers so that they don't log full stack \ No newline at end of file +- CORE-1315 Corrected issue in HarperDB restart scenario +- CORE-1370 Update some of the validation error handlers so that they don't log full stack diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.1.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.1.md index 0adbeb21..8f90dc10 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.1.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.1.md @@ -4,15 +4,16 @@ sidebar_position: 69898 --- ### HarperDB 3.1.1, Monkey Release + 9/23/2021 **Features/Updates** -* CORE-1393 Added utility function to add settings from env/cmd vars to the settings file on every run/restart -* CORE-1395 Create a setting which will allow to enable the local Studio to be served from an instance of HarperDB -* CORE-1397 Update the stock 404 response to not return the request URL -* General updates to optimize Docker container +- CORE-1393 Added utility function to add settings from env/cmd vars to the settings file on every run/restart +- CORE-1395 Create a setting which will allow to enable the local Studio to be served from an instance of HarperDB +- CORE-1397 Update the stock 404 response to not return the request URL +- General updates to optimize Docker container **Bug Fixes** -* CORE-1399 Added fixes for complex SQL alias issues \ No newline at end of file +- CORE-1399 Added fixes for complex SQL alias issues diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.2.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.2.md index f1c192b6..706e5956 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.2.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.2.md @@ -4,12 +4,13 @@ sidebar_position: 69897 --- ### HarperDB 3.1.2, Monkey Release + 10/21/2021 **Features/Updates** -* Updated the installation ASCII art to reflect the new HarperDB logo +- Updated the installation ASCII art to reflect the new HarperDB logo **Bug Fixes** -* CORE-1408 Corrects issue where `drop_attribute` was not properly setting the LMDB version number causing tables to behave unexpectedly \ No newline at end of file +- CORE-1408 Corrects issue where `drop_attribute` was not properly setting the LMDB version number causing tables to behave unexpectedly diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.3.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.3.md index 2d484f8d..1a7d3301 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.3.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.3.md @@ -4,8 +4,9 @@ sidebar_position: 69896 --- ### HarperDB 3.1.3, Monkey Release + 1/14/2022 **Bug Fixes** -* CORE-1446 Fix for scans on indexes larger than 1 million entries causing queries to never return \ No newline at end of file +- CORE-1446 Fix for scans on indexes larger than 1 million entries causing queries to never return diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.4.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.4.md index ae0074fd..3fa86ead 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.4.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.4.md @@ -4,8 +4,9 @@ sidebar_position: 69895 --- ### HarperDB 3.1.4, Monkey Release + 2/24/2022 **Features/Updates** -* CORE-1460 Added new setting `STORAGE_WRITE_ASYNC`. If this setting is true, LMDB will have faster write performance at the expense of not being crash safe. The default for this setting is false, which results in HarperDB being crash safe. \ No newline at end of file +- CORE-1460 Added new setting `STORAGE_WRITE_ASYNC`. If this setting is true, LMDB will have faster write performance at the expense of not being crash safe. The default for this setting is false, which results in HarperDB being crash safe. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.5.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.5.md index eff4b5b0..23661928 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.5.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.1.5.md @@ -4,8 +4,9 @@ sidebar_position: 69894 --- ### HarperDB 3.1.5, Monkey Release + 3/4/2022 **Features/Updates** -* CORE-1498 Fixed incorrect autocasting of string that start with "0." that tries to convert to number but instead returns NaN. \ No newline at end of file +- CORE-1498 Fixed incorrect autocasting of string that start with "0." that tries to convert to number but instead returns NaN. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.2.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.2.0.md index 003575d8..fa215082 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.2.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.2.0.md @@ -4,10 +4,11 @@ sidebar_position: 69799 --- ### HarperDB 3.2.0, Monkey Release + 3/25/2022 **Features/Updates** -* CORE-1391 Bug fix related to orphaned HarperDB background processes. -* CORE-1509 Updated node version check, updated Node.js version, updated project dependencies. -* CORE-1518 Remove final call from logger. \ No newline at end of file +- CORE-1391 Bug fix related to orphaned HarperDB background processes. +- CORE-1509 Updated node version check, updated Node.js version, updated project dependencies. +- CORE-1518 Remove final call from logger. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.2.1.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.2.1.md index dc511a70..4cc983a4 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.2.1.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.2.1.md @@ -4,8 +4,9 @@ sidebar_position: 69798 --- ### HarperDB 3.2.1, Monkey Release + 6/1/2022 **Features/Updates** -* CORE-1573 Added logic to track the pid of the foreground process if running in foreground. Then on stop, use that pid to kill the process. Logic was also added to kill the pm2 daemon when stop is called. \ No newline at end of file +- CORE-1573 Added logic to track the pid of the foreground process if running in foreground. Then on stop, use that pid to kill the process. Logic was also added to kill the pm2 daemon when stop is called. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.3.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.3.0.md index 3e3ca784..236704dd 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.3.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/3.3.0.md @@ -5,8 +5,8 @@ sidebar_position: 69699 ### HarperDB 3.3.0 - Monkey -* CORE-1595 Added new role type `structure_user`, this enables non-superusers to be able to create/drop schema/table/attribute. -* CORE-1501 Improved performance for drop_table. -* CORE-1599 Added two new operations for custom functions `install_node_modules` & `audit_node_modules`. -* CORE-1598 Added `skip_node_modules` flag to `package_custom_function_project` operation. This flag allows for not bundling project dependencies and deploying a smaller project to other nodes. Use this flag in tandem with `install_node_modules`. -* CORE-1707 Binaries are now included for Linux on AMD64, Linux on ARM64, and macOS. GCC, Make, Python are no longer required when installing on these platforms. +- CORE-1595 Added new role type `structure_user`, this enables non-superusers to be able to create/drop schema/table/attribute. +- CORE-1501 Improved performance for drop_table. +- CORE-1599 Added two new operations for custom functions `install_node_modules` & `audit_node_modules`. +- CORE-1598 Added `skip_node_modules` flag to `package_custom_function_project` operation. This flag allows for not bundling project dependencies and deploying a smaller project to other nodes. Use this flag in tandem with `install_node_modules`. +- CORE-1707 Binaries are now included for Linux on AMD64, Linux on ARM64, and macOS. GCC, Make, Python are no longer required when installing on these platforms. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/_category_.json b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/_category_.json index 0103ac36..71bea62a 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/_category_.json +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v3-monkey/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Monkey (Version 3)", - "position": -3 -} \ No newline at end of file + "label": "HarperDB Monkey (Version 3)", + "position": -3 +} diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.0.md index d2aa32b2..b94ea2f8 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.0.md @@ -4,121 +4,128 @@ sidebar_position: 59999 --- ### HarperDB 4.0.0, Tucker Release + 11/2/2022 **Networking & Data Replication (Clustering)** -The HarperDB clustering internals have been rewritten and the underlying technology for Clustering has been completely replaced with [NATS](https://nats.io/), an enterprise grade connective technology responsible for addressing, discovery and exchanging of messages that drive the common patterns in distributed systems. -* CORE-1464, CORE-1470, : Remove SocketCluster dependencies and all code related to them. -* CORE-1465, CORE-1485, CORE-1537, CORE-1538, CORE-1558, CORE-1583, CORE_1665, CORE-1710, CORE-1801, CORE-1865 :Add nats-`server` code as dependency, on install of HarperDB download nats-`server` is possible else fallback to building from source code. -* CORE-1593, CORE-1761: Add `nats.js` as project dependency. -* CORE-1466: Build NATS configs on `harperdb run` based on HarperDB YAML configuration. -* CORE-1467, CORE-1508: Launch and manage NATS servers with PM2. -* CORE-1468, CORE-1507: Create a process which reads the work queue stream and processes transactions. -* CORE-1481, CORE-1529, CORE-1698, CORE-1502, CORE-1696: On upgrade to 4.0, update pre-existing clustering configurations, create table transaction streams, create work queue stream, update `hdb_nodes` table, create clustering folder structure, and rebuild self-signed certs. -* CORE-1494, CORE-1521, CORE-1755: Build out internals to interface with NATS. -* CORE-1504: Update existing hooks to save transactions to work with NATS. -* CORE-1514, CORE-1515, CORE-1516, CORE-1527, CORE-1532: Update `add_node`, `update_node`, and `remove_node` operations to no longer need host and port in payload. These operations now manage dynamically sourcing of table level transaction streams between nodes and work queues. -* CORE-1522: Create `NATSReplyService` process which handles the receiving NATS based requests from remote instances and sending back appropriate responses. -* CORE-1471, CORE-1568, CORE-1563, CORE-1534, CORE-1569: Update `cluster_status` operation. -* CORE-1611: Update pre-existing transaction log operations to be audit log operations. -* CORE-1541, CORE-1612, CORE-1613: Create translation log operations which interface with streams. -* CORE-1668: Update NATS serialization / deserialization to use MessagePack. -* CORE-1673: Add `system_info` param to `hdb_nodes` table and update on `add_node` and `cluster_status`. -* CORE-1477, CORE-1493, CORE-1557, CORE-1596, CORE-1577: Both a full HarperDB restart & just clustering restart call the NATS server with a reload directive to maintain full uptime while servers refresh. -* CORE-1474:HarperDB install adds clustering folder structure. -* CORE-1530: Post `drop_table` HarperDB purges the related transaction stream. -* CORE-1567: Set NATS config to always use TLS. -* CORE-1543: Removed the `transact_to_cluster` attribute from the bulk load operations. Now bulk loads always replicate. -* CORE-1533, CORE-1556, CORE-1561, CORE-1562, CORE-1564: New operation `configure_cluster`, this operation enables bulk publishing and subscription of multiple tables to multiple instances of HarperDB. -* CORE-1535: Create work queue stream on install of HarperDB. This stream receives transactions from remote instances of HarperDB which are then ingested in order. -* CORE-1551: Create transaction streams on the remote node if they do not exist when performing `add_node` or `update_node`. -* CORE-1594, CORE-1605, CORE-1749, CORE-1767, CORE-1770: Optimize the work queue stream and its consumer to be more performant and validate exact once delivery. -* CORE-1621, CORE-1692, CORE-1570, CORE-1693: NATS stream names are MD5 hashed to avoid characters that HarperDB allows, but NATS may not. -* CORE-1762: Add a new optional attribute to `add_node` and `update_node` named `opt_start_time`. This attribute sets a starting time to start synchronizing transactions. -* CORE-1785: Optimizations and bug fixes in regards to sourcing data from remote instances on HarperDB. -* CORE-1588: Created new operation `set_cluster_routes` to enable setting routes for instances of HarperDB to mesh together. -* CORE-1589: Created new operation `get_cluster_routes` to allow for retrieval of routes used to connect the instance of HarperDB to the mesh. -* CORE-1590: Created new operation `delete_cluster_routes` to allow for removal of routes used to connect the instance of HarperDB to the mesh. -* CORE-1667: Fix old environment variable `CLUSTERING_PORT` not mapping to new hub server port. -* CORE-1609: Allow `remove_node` to be called when the other node cannot be reached. -* CORE-1815: Add transaction lock to `add_node` and `update_node` to avoid concurrent nats source update bug. -* CORE-1848: Update stream configs if the node name has been changed in the YAML configuration. -* CORE-1873: Update `add_node` and `update_node` so that it auto-creates schema/table on both local and remote node respectively +The HarperDB clustering internals have been rewritten and the underlying technology for Clustering has been completely replaced with [NATS](https://nats.io/), an enterprise grade connective technology responsible for addressing, discovery and exchanging of messages that drive the common patterns in distributed systems. +- CORE-1464, CORE-1470, : Remove SocketCluster dependencies and all code related to them. +- CORE-1465, CORE-1485, CORE-1537, CORE-1538, CORE-1558, CORE-1583, CORE_1665, CORE-1710, CORE-1801, CORE-1865 :Add nats-`server` code as dependency, on install of HarperDB download nats-`server` is possible else fallback to building from source code. +- CORE-1593, CORE-1761: Add `nats.js` as project dependency. +- CORE-1466: Build NATS configs on `harperdb run` based on HarperDB YAML configuration. +- CORE-1467, CORE-1508: Launch and manage NATS servers with PM2. +- CORE-1468, CORE-1507: Create a process which reads the work queue stream and processes transactions. +- CORE-1481, CORE-1529, CORE-1698, CORE-1502, CORE-1696: On upgrade to 4.0, update pre-existing clustering configurations, create table transaction streams, create work queue stream, update `hdb_nodes` table, create clustering folder structure, and rebuild self-signed certs. +- CORE-1494, CORE-1521, CORE-1755: Build out internals to interface with NATS. +- CORE-1504: Update existing hooks to save transactions to work with NATS. +- CORE-1514, CORE-1515, CORE-1516, CORE-1527, CORE-1532: Update `add_node`, `update_node`, and `remove_node` operations to no longer need host and port in payload. These operations now manage dynamically sourcing of table level transaction streams between nodes and work queues. +- CORE-1522: Create `NATSReplyService` process which handles the receiving NATS based requests from remote instances and sending back appropriate responses. +- CORE-1471, CORE-1568, CORE-1563, CORE-1534, CORE-1569: Update `cluster_status` operation. +- CORE-1611: Update pre-existing transaction log operations to be audit log operations. +- CORE-1541, CORE-1612, CORE-1613: Create translation log operations which interface with streams. +- CORE-1668: Update NATS serialization / deserialization to use MessagePack. +- CORE-1673: Add `system_info` param to `hdb_nodes` table and update on `add_node` and `cluster_status`. +- CORE-1477, CORE-1493, CORE-1557, CORE-1596, CORE-1577: Both a full HarperDB restart & just clustering restart call the NATS server with a reload directive to maintain full uptime while servers refresh. +- CORE-1474:HarperDB install adds clustering folder structure. +- CORE-1530: Post `drop_table` HarperDB purges the related transaction stream. +- CORE-1567: Set NATS config to always use TLS. +- CORE-1543: Removed the `transact_to_cluster` attribute from the bulk load operations. Now bulk loads always replicate. +- CORE-1533, CORE-1556, CORE-1561, CORE-1562, CORE-1564: New operation `configure_cluster`, this operation enables bulk publishing and subscription of multiple tables to multiple instances of HarperDB. +- CORE-1535: Create work queue stream on install of HarperDB. This stream receives transactions from remote instances of HarperDB which are then ingested in order. +- CORE-1551: Create transaction streams on the remote node if they do not exist when performing `add_node` or `update_node`. +- CORE-1594, CORE-1605, CORE-1749, CORE-1767, CORE-1770: Optimize the work queue stream and its consumer to be more performant and validate exact once delivery. +- CORE-1621, CORE-1692, CORE-1570, CORE-1693: NATS stream names are MD5 hashed to avoid characters that HarperDB allows, but NATS may not. +- CORE-1762: Add a new optional attribute to `add_node` and `update_node` named `opt_start_time`. This attribute sets a starting time to start synchronizing transactions. +- CORE-1785: Optimizations and bug fixes in regards to sourcing data from remote instances on HarperDB. +- CORE-1588: Created new operation `set_cluster_routes` to enable setting routes for instances of HarperDB to mesh together. +- CORE-1589: Created new operation `get_cluster_routes` to allow for retrieval of routes used to connect the instance of HarperDB to the mesh. +- CORE-1590: Created new operation `delete_cluster_routes` to allow for removal of routes used to connect the instance of HarperDB to the mesh. +- CORE-1667: Fix old environment variable `CLUSTERING_PORT` not mapping to new hub server port. +- CORE-1609: Allow `remove_node` to be called when the other node cannot be reached. +- CORE-1815: Add transaction lock to `add_node` and `update_node` to avoid concurrent nats source update bug. +- CORE-1848: Update stream configs if the node name has been changed in the YAML configuration. +- CORE-1873: Update `add_node` and `update_node` so that it auto-creates schema/table on both local and remote node respectively **Data Storage** We have made improvements to how we store, index, and retrieve data. -* CORE-1619: Enabled new concurrent flushing technology for improved write performance. -* CORE-1701: Optimize search performance for `search_by_conditions` when executing multiple AND conditions. -* CORE-1652: Encode the values of secondary indices more efficiently for faster access. -* CORE-1670: Store updated timestamp in `lmdb.js`' version property. -* CORE-1651: Enabled multiple value indexing of array values which allows for the ability to search on specific elements in an array more efficiently. -* CORE-1649, CORE-1659: Large text values (larger than 255 bytes) are no longer stored in separate blob index. Now they are segmented and delimited in the same index to increase search performance. -* Complex objects and object arrays are no longer stored in a separate index to preserve storage and increase write throughput. -* CORE-1650, CORE-1724, CORE-1738: Improved internals around interpreting attribute values. -* CORE-1657: Deferred property decoding allows large objects to be stored, but individual attributes can be accessed (like with get_attributes) without incurring the cost of decoding the entire object. -* CORE-1658: Enable in-memory caching of records for even faster access to frequently accessed data. -* CORE-1693: Wrap updates in async transactions to ensure ACID-compliant updates. -* CORE-1653: Upgrade to 4.0 rebuilds tables to reflect changes made to index improvements. -* CORE-1753: Removed old `node-lmdb` dependency. -* CORE-1787: Freeze objects returned from queries. -* CORE-1821: Read the `WRITE_ASYNC` setting which enables LMDB nosync. + +- CORE-1619: Enabled new concurrent flushing technology for improved write performance. +- CORE-1701: Optimize search performance for `search_by_conditions` when executing multiple AND conditions. +- CORE-1652: Encode the values of secondary indices more efficiently for faster access. +- CORE-1670: Store updated timestamp in `lmdb.js`' version property. +- CORE-1651: Enabled multiple value indexing of array values which allows for the ability to search on specific elements in an array more efficiently. +- CORE-1649, CORE-1659: Large text values (larger than 255 bytes) are no longer stored in separate blob index. Now they are segmented and delimited in the same index to increase search performance. +- Complex objects and object arrays are no longer stored in a separate index to preserve storage and increase write throughput. +- CORE-1650, CORE-1724, CORE-1738: Improved internals around interpreting attribute values. +- CORE-1657: Deferred property decoding allows large objects to be stored, but individual attributes can be accessed (like with get_attributes) without incurring the cost of decoding the entire object. +- CORE-1658: Enable in-memory caching of records for even faster access to frequently accessed data. +- CORE-1693: Wrap updates in async transactions to ensure ACID-compliant updates. +- CORE-1653: Upgrade to 4.0 rebuilds tables to reflect changes made to index improvements. +- CORE-1753: Removed old `node-lmdb` dependency. +- CORE-1787: Freeze objects returned from queries. +- CORE-1821: Read the `WRITE_ASYNC` setting which enables LMDB nosync. **Logging** HarperDB has increased logging specificity by breaking out logs based on components logging. There are specific log files each for HarperDB Core, Custom Functions, Hub Server, Leaf Server, and more. -* CORE-1497: Remove `pino` and `winston` dependencies. -* CORE-1426: All logging is output via `stdout` and `stderr`, our default logging is then picked up by PM2 which handles writing out to file. -* CORE-1431: Improved `read_log` operation validation. -* CORE-1433, CORE-1463: Added log rotation. -* CORE-1553, CORE-1555, CORE-1552, CORE-1554, CORE-1704: Performance gain by only serializing objects and arrays if the log is for the level defined in configuration. -* CORE-1436: Upgrade to 4.0 updates internals for logging changes. -* CORE-1428, CORE-1440, CORE-1442, CORE-1434, CORE-1435, CORE-1439, CORE-1482, CORE-1751, CORE-1752: Bug fixes, performance improvements and improved unit tests. -* CORE-1691: Convert non-PM2 managed log file writes to use Node.js `fs.appendFileSync` function. + +- CORE-1497: Remove `pino` and `winston` dependencies. +- CORE-1426: All logging is output via `stdout` and `stderr`, our default logging is then picked up by PM2 which handles writing out to file. +- CORE-1431: Improved `read_log` operation validation. +- CORE-1433, CORE-1463: Added log rotation. +- CORE-1553, CORE-1555, CORE-1552, CORE-1554, CORE-1704: Performance gain by only serializing objects and arrays if the log is for the level defined in configuration. +- CORE-1436: Upgrade to 4.0 updates internals for logging changes. +- CORE-1428, CORE-1440, CORE-1442, CORE-1434, CORE-1435, CORE-1439, CORE-1482, CORE-1751, CORE-1752: Bug fixes, performance improvements and improved unit tests. +- CORE-1691: Convert non-PM2 managed log file writes to use Node.js `fs.appendFileSync` function. **Configuration** HarperDB has updated its configuration from a properties file to YAML. -* CORE-1448, CORE-1449, CORE-1519, CORE-1587: Upgrade automatically converts the pre-existing settings file to YAML. -* CORE-1445, CORE-1534, CORE-1444, CORE-1858: Build out new logic to create, update, and interpret the YAML configuration file. -* Installer has updated prompts to reflect YAML settings. -* CORE-1447: Create an alias for the `configure_cluster` operation as `set_configuration`. -* CORE-1461, CORE-1462, CORE-1483: Unit test improvements. -* CORE-1492: Improvements to get_configuration and set_configuration operations. -* CORE-1503: Modify HarperDB configuration for more granular certificate definition. -* CORE-1591: Update `routes` IP param to `host` and to `leaf` config in `harperdb.conf` -* CORE-1519: Fix issue when switching between old and new versions of HarperDB we are getting the config parameter is undefined error on npm install. + +- CORE-1448, CORE-1449, CORE-1519, CORE-1587: Upgrade automatically converts the pre-existing settings file to YAML. +- CORE-1445, CORE-1534, CORE-1444, CORE-1858: Build out new logic to create, update, and interpret the YAML configuration file. +- Installer has updated prompts to reflect YAML settings. +- CORE-1447: Create an alias for the `configure_cluster` operation as `set_configuration`. +- CORE-1461, CORE-1462, CORE-1483: Unit test improvements. +- CORE-1492: Improvements to get_configuration and set_configuration operations. +- CORE-1503: Modify HarperDB configuration for more granular certificate definition. +- CORE-1591: Update `routes` IP param to `host` and to `leaf` config in `harperdb.conf` +- CORE-1519: Fix issue when switching between old and new versions of HarperDB we are getting the config parameter is undefined error on npm install. **Broad NodeJS and Platform Support** -* CORE-1624: HarperDB can now run on multiple versions of NodeJS, from v14 to v19. We primarily test on v18, so that is the preferred version. + +- CORE-1624: HarperDB can now run on multiple versions of NodeJS, from v14 to v19. We primarily test on v18, so that is the preferred version. **Windows 10 and 11** -* CORE-1088: HarperDB now runs natively on Windows 10 and 11 without the need to run in a container or installed in WSL. Windows is only intended for evaluation and development purposes, not for production work loads. + +- CORE-1088: HarperDB now runs natively on Windows 10 and 11 without the need to run in a container or installed in WSL. Windows is only intended for evaluation and development purposes, not for production work loads. **Extra Changes and Bug Fixes** -* CORE-1520: Refactor installer to remove all waterfall code and update to use Promises. -* CORE-1573: Stop the PM2 daemon and any logging processes when stopping hdb. -* CORE-1586: When HarperDB is running in foreground stop any additional logging processes from being spawned. -* CORE-1626: Update docker file to accommodate new `harperdb.conf` file. -* CORE-1592, CORE-1526, CORE-1660, CORE-1646, CORE-1640, CORE-1689, CORE-1711, CORE-1601, CORE-1726, CORE-1728, CORE-1736, CORE-1735, CORE-1745, CORE-1729, CORE-1748, CORE-1644, CORE-1750, CORE-1757, CORE-1727, CORE-1740, CORE-1730, CORE-1777, CORE-1778, CORE-1782, CORE-1775, CORE-1771, CORE-1774, CORE-1759, CORE-1772, CORE-1861, CORE-1862, CORE-1863, CORE-1870, CORE-1869:Changes for CI/CD pipeline and integration tests. -* CORE-1661: Fixed issue where old boot properties file caused an error when attempting to install 4.0.0. -* CORE-1697, CORE-1814, CORE-1855: Upgrade fastify dependency to new major version 4. -* CORE-1629: Jobs are now running as processes managed by the PM2 daemon. -* CORE-1733: Update LICENSE to reflect our EULA on our site. -* CORE-1606: Enable Custom Functions by default. -* CORE-1714: Include pre-built binaries for most common platforms (darwin-arm64, darwin-x64, linux-arm64, linux-x64, win32-x64). -* CORE-1628: Fix issue where setting license through environment variable not working. -* CORE-1602, CORE-1760, CORE-1838, CORE-1839, CORE-1847, CORE-1773: HarperDB Docker container improvements. -* CORE-1706: Add support for encoding HTTP responses with MessagePack. -* CORE-1709: Improve the way lmdb.js dependencies are installed. -* CORE-1758: Remove/update unnecessary HTTP headers. -* CORE-1756: On `npm install` and `harperdb install` change the node version check from an error to a warning if the installed Node.js version does not match our preferred version. -* CORE-1791: Optimizations to authenticated user caching. -* CORE-1794: Update README to discuss Windows support & Node.js versions -* CORE-1837: Fix issue where Custom Function directory was not being created on install. -* CORE-1742: Add more validation to audit log - check schema/table exists and log is enabled. -* CORE-1768: Fix issue where when running in foreground HarperDB process is not stopping on `harperdb stop`. -* CORE-1864: Fix to semver checks on upgrade. -* CORE-1850: Fix issue where a `cluster_user` type role could not be altered. + +- CORE-1520: Refactor installer to remove all waterfall code and update to use Promises. +- CORE-1573: Stop the PM2 daemon and any logging processes when stopping hdb. +- CORE-1586: When HarperDB is running in foreground stop any additional logging processes from being spawned. +- CORE-1626: Update docker file to accommodate new `harperdb.conf` file. +- CORE-1592, CORE-1526, CORE-1660, CORE-1646, CORE-1640, CORE-1689, CORE-1711, CORE-1601, CORE-1726, CORE-1728, CORE-1736, CORE-1735, CORE-1745, CORE-1729, CORE-1748, CORE-1644, CORE-1750, CORE-1757, CORE-1727, CORE-1740, CORE-1730, CORE-1777, CORE-1778, CORE-1782, CORE-1775, CORE-1771, CORE-1774, CORE-1759, CORE-1772, CORE-1861, CORE-1862, CORE-1863, CORE-1870, CORE-1869:Changes for CI/CD pipeline and integration tests. +- CORE-1661: Fixed issue where old boot properties file caused an error when attempting to install 4.0.0. +- CORE-1697, CORE-1814, CORE-1855: Upgrade fastify dependency to new major version 4. +- CORE-1629: Jobs are now running as processes managed by the PM2 daemon. +- CORE-1733: Update LICENSE to reflect our EULA on our site. +- CORE-1606: Enable Custom Functions by default. +- CORE-1714: Include pre-built binaries for most common platforms (darwin-arm64, darwin-x64, linux-arm64, linux-x64, win32-x64). +- CORE-1628: Fix issue where setting license through environment variable not working. +- CORE-1602, CORE-1760, CORE-1838, CORE-1839, CORE-1847, CORE-1773: HarperDB Docker container improvements. +- CORE-1706: Add support for encoding HTTP responses with MessagePack. +- CORE-1709: Improve the way lmdb.js dependencies are installed. +- CORE-1758: Remove/update unnecessary HTTP headers. +- CORE-1756: On `npm install` and `harperdb install` change the node version check from an error to a warning if the installed Node.js version does not match our preferred version. +- CORE-1791: Optimizations to authenticated user caching. +- CORE-1794: Update README to discuss Windows support & Node.js versions +- CORE-1837: Fix issue where Custom Function directory was not being created on install. +- CORE-1742: Add more validation to audit log - check schema/table exists and log is enabled. +- CORE-1768: Fix issue where when running in foreground HarperDB process is not stopping on `harperdb stop`. +- CORE-1864: Fix to semver checks on upgrade. +- CORE-1850: Fix issue where a `cluster_user` type role could not be altered. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.1.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.1.md index 9e148e63..2a85f511 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.1.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.1.md @@ -4,9 +4,10 @@ sidebar_position: 59998 --- ### HarperDB 4.0.1, Tucker Release + 01/20/2023 **Bug Fixes** -* CORE-1992 Local studio was not loading because the path got mangled in the build. -* CORE-2001 Fixed deploy_custom_function_project after node update broke it. +- CORE-1992 Local studio was not loading because the path got mangled in the build. +- CORE-2001 Fixed deploy_custom_function_project after node update broke it. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.2.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.2.md index b65d1427..bedbd970 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.2.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.2.md @@ -4,9 +4,10 @@ sidebar_position: 59997 --- ### HarperDB 4.0.2, Tucker Release + 01/24/2023 **Bug Fixes** -* CORE-2003 Fix bug where if machine had one core thread config would default to zero. -* Update to lmdb 2.7.3 and msgpackr 1.7.0 +- CORE-2003 Fix bug where if machine had one core thread config would default to zero. +- Update to lmdb 2.7.3 and msgpackr 1.7.0 diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.3.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.3.md index 67aaae56..ad1cbf8a 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.3.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.3.md @@ -4,8 +4,9 @@ sidebar_position: 59996 --- ### HarperDB 4.0.3, Tucker Release + 01/26/2023 **Bug Fixes** -* CORE-2007 Add update nodes 4.0.0 launch script to build script to fix clustering upgrade. +- CORE-2007 Add update nodes 4.0.0 launch script to build script to fix clustering upgrade. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.4.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.4.md index 2a30c9d1..3f052465 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.4.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.4.md @@ -4,8 +4,9 @@ sidebar_position: 59995 --- ### HarperDB 4.0.4, Tucker Release + 01/27/2023 **Bug Fixes** -* CORE-2009 Fixed bug where add node was not being called when upgrading clustering. \ No newline at end of file +- CORE-2009 Fixed bug where add node was not being called when upgrading clustering. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.5.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.5.md index dc66721f..1696d6d4 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.5.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.5.md @@ -4,11 +4,11 @@ sidebar_position: 59994 --- ### HarperDB 4.0.5, Tucker Release + 02/15/2023 **Bug Fixes** -* CORE-2029 Improved the upgrade process for handling existing user TLS certificates and correctly configuring TLS settings. Added a prompt to upgrade to determine if new certificates should be created or existing certificates should be kept/used. -* Fix the way NATS connections are honored in a local environment. -* Do not define the certificate authority path to NATS if it is not defined in the HarperDB config. - +- CORE-2029 Improved the upgrade process for handling existing user TLS certificates and correctly configuring TLS settings. Added a prompt to upgrade to determine if new certificates should be created or existing certificates should be kept/used. +- Fix the way NATS connections are honored in a local environment. +- Do not define the certificate authority path to NATS if it is not defined in the HarperDB config. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.6.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.6.md index bf97d148..1cdc1bd7 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.6.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.6.md @@ -4,8 +4,9 @@ sidebar_position: 59993 --- ### HarperDB 4.0.6, Tucker Release + 03/09/2023 **Bug Fixes** -* Fixed a data serialization error that occurs when a large number of different record structures are persisted in a single table. +- Fixed a data serialization error that occurs when a large number of different record structures are persisted in a single table. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.7.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.7.md index 7d48666a..c4d1fbbf 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.7.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.0.7.md @@ -4,8 +4,9 @@ sidebar_position: 59992 --- ### HarperDB 4.0.7, Tucker Release + 03/10/2023 **Bug Fixes** -* Update lmdb.js dependency \ No newline at end of file +- Update lmdb.js dependency diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.1.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.1.0.md index 16b6aa3a..d8b1d8b4 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.1.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.1.0.md @@ -25,39 +25,39 @@ Updates to S3 import and export mean that these operations now require the bucke Due to the AWS SDK v2 reaching end of life support we have updated to v3. This has caused some breaking changes in our operations `import_from_s3` and `export_to_s3`: -* A new attribute `region` will need to be supplied -* The `bucket` attribute can no longer have trailing slashes. Slashes will now need to be in the `key`. +- A new attribute `region` will need to be supplied +- The `bucket` attribute can no longer have trailing slashes. Slashes will now need to be in the `key`. Starting HarperDB without any command (just `harperdb`) now runs HarperDB like a standard process, in the foreground. This means you can use standard unix tooling for interacting with the process and is conducive for running HarperDB with systemd or any other process management tool. If you wish to have HarperDB launch itself in separate background process (and immediately terminate the shell process), you can do so by running `harperdb start`. Internal Tickets completed: -* CORE-609 - Ensure that attribute names are always added to global schema as Strings -* CORE-1549 - Remove fastify-static code from Custom Functions server which auto serves content from "static" folder -* CORE-1655 - Iterator based queries -* CORE-1764 - Fix issue where describe\_all operation returns an empty object for non super-users if schema(s) do not yet have table(s) -* CORE-1854 - Switch to using worker threads instead of processes for handling concurrency -* CORE-1877 - Extend the csv\_url\_load operation to allow for additional headers to be passed to the remote server when the csv is being downloaded -* CORE-1893 - Add last updated timestamp to describe operations -* CORE-1896 - Fix issue where Select \* from system.hdb\_info returns wrong HDB version number after Instance Upgrade -* CORE-1904 - Fix issue when executing GEOJSON query in SQL -* CORE-1905 - Add HarperDB YAML configuration setting which defines the storage location of NATS streams -* CORE-1906 - Add HarperDB YAML configuration setting defining the storage location of tables. -* CORE-1655 - Streaming binary format serialization -* CORE-1943 - Add configuration option to set mount point for audit tables -* CORE-1921 - Update NATS transaction lifecycle to handle message deduplication in work queue streams. -* CORE-1963 - Update logging for better readability, reduced duplication, and request context information. -* CORE-1968 - In server\nats\natsIngestService.js remove the js\_msg.working(); line to improve performance. -* CORE-1976 - Fix error when calling describe\_table operation with no schema or table defined in payload. -* CORE-1983 - Fix issue where create\_attribute operation does not validate request for required attributes -* CORE-2015 - Remove PM2 logs that get logged in console when starting HDB -* CORE-2048 - systemd script for 4.1 -* CORE-2052 - Include thread information in system\_information for visibility of threads -* CORE-2061 - Add a better error msg when clustering is enabled without a cluster user set -* CORE-2068 - Create new log rotate logic since pm2 log-rotate no longer used -* CORE-2072 - Update to Node 18.15.0 -* CORE-2090 - Upgrade Testing from v4.0.x and v3.x to v4.1. -* CORE-2091 - Run the performance tests -* CORE-2092 - Allow for automatic patch version updates of certain packages -* CORE-2109 - Add verify option to clustering TLS configuration -* CORE-2111 - Update AWS SDK to v3 +- CORE-609 - Ensure that attribute names are always added to global schema as Strings +- CORE-1549 - Remove fastify-static code from Custom Functions server which auto serves content from "static" folder +- CORE-1655 - Iterator based queries +- CORE-1764 - Fix issue where describe_all operation returns an empty object for non super-users if schema(s) do not yet have table(s) +- CORE-1854 - Switch to using worker threads instead of processes for handling concurrency +- CORE-1877 - Extend the csv_url_load operation to allow for additional headers to be passed to the remote server when the csv is being downloaded +- CORE-1893 - Add last updated timestamp to describe operations +- CORE-1896 - Fix issue where Select \* from system.hdb_info returns wrong HDB version number after Instance Upgrade +- CORE-1904 - Fix issue when executing GEOJSON query in SQL +- CORE-1905 - Add HarperDB YAML configuration setting which defines the storage location of NATS streams +- CORE-1906 - Add HarperDB YAML configuration setting defining the storage location of tables. +- CORE-1655 - Streaming binary format serialization +- CORE-1943 - Add configuration option to set mount point for audit tables +- CORE-1921 - Update NATS transaction lifecycle to handle message deduplication in work queue streams. +- CORE-1963 - Update logging for better readability, reduced duplication, and request context information. +- CORE-1968 - In server\nats\natsIngestService.js remove the js_msg.working(); line to improve performance. +- CORE-1976 - Fix error when calling describe_table operation with no schema or table defined in payload. +- CORE-1983 - Fix issue where create_attribute operation does not validate request for required attributes +- CORE-2015 - Remove PM2 logs that get logged in console when starting HDB +- CORE-2048 - systemd script for 4.1 +- CORE-2052 - Include thread information in system_information for visibility of threads +- CORE-2061 - Add a better error msg when clustering is enabled without a cluster user set +- CORE-2068 - Create new log rotate logic since pm2 log-rotate no longer used +- CORE-2072 - Update to Node 18.15.0 +- CORE-2090 - Upgrade Testing from v4.0.x and v3.x to v4.1. +- CORE-2091 - Run the performance tests +- CORE-2092 - Allow for automatic patch version updates of certain packages +- CORE-2109 - Add verify option to clustering TLS configuration +- CORE-2111 - Update AWS SDK to v3 diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.1.1.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.1.1.md index 537ef71c..54163b63 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.1.1.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.1.1.md @@ -7,9 +7,9 @@ sidebar_position: 59898 06/16/2023 -* HarperDB uses improved logic for determining default heap limits and thread counts. When running in a restricted container and on NodeJS 18.15+, HarperDB will use the constrained memory limit to determine heap limits for each thread. In more memory constrained servers with many CPU cores, a reduced default thread count will be used to ensure that excessive memory is not used by many workers. You may still define your own thread count (with `http`/`threads`) in the [configuration](../../../deployments/configuration). -* An option has been added for [disabling the republishing NATS messages](../../../deployments/configuration), which can provide improved replication performance in a fully connected network. -* Improvements to our OpenShift container. -* Dependency security updates. -* **Bug Fixes** -* Fixed a bug in reporting database metrics in the `system_information` operation. +- HarperDB uses improved logic for determining default heap limits and thread counts. When running in a restricted container and on NodeJS 18.15+, HarperDB will use the constrained memory limit to determine heap limits for each thread. In more memory constrained servers with many CPU cores, a reduced default thread count will be used to ensure that excessive memory is not used by many workers. You may still define your own thread count (with `http`/`threads`) in the [configuration](../../../deployments/configuration). +- An option has been added for [disabling the republishing NATS messages](../../../deployments/configuration), which can provide improved replication performance in a fully connected network. +- Improvements to our OpenShift container. +- Dependency security updates. +- **Bug Fixes** +- Fixed a bug in reporting database metrics in the `system_information` operation. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.1.2.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.1.2.md index 2a62db64..fc5e16f4 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.1.2.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.1.2.md @@ -4,10 +4,10 @@ sidebar_position: 59897 --- ### HarperDB 4.1.2, Tucker Release -06/16/2023 -* HarperDB has updated binary dependencies to support older glibc versions back 2.17. -* A new CLI command was added to get the current status of whether HarperDB is running and the cluster status. This is available with `harperdb status`. -* Improvements to our OpenShift container. -* Dependency security updates. +06/16/2023 +- HarperDB has updated binary dependencies to support older glibc versions back 2.17. +- A new CLI command was added to get the current status of whether HarperDB is running and the cluster status. This is available with `harperdb status`. +- Improvements to our OpenShift container. +- Dependency security updates. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.0.md index 55bfe220..265ad57d 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.0.md @@ -65,24 +65,24 @@ There have been significant changes to `harperdb-config.yaml`, however none of t `harperdb-config.yaml` has had some configuration values added, removed, renamed and defaults changed. Please refer to [harperdb-config.yaml](../../../deployments/configuration) for the most current configuration parameters. -* The `http` element has been expanded. - * `compressionThreshold` was added. - * All `customFunction` configuration now lives here, except for the `tls` section. -* `threads` has moved out of the `http` element and now is its own top level element. -* `authentication` section was moved out of the `operationsApi` section and is now its own top level element/section. -* `analytics.aggregatePeriod` was added. -* Default logging level was changed to `warn`. -* Default clustering log level was changed to `info`. -* `clustering.republishMessages` now defaults to `false`. -* `operationsApi.foreground` was removed. To start HarperDB in the foreground, from the CLI run `harperdb`. -* Made `operationsApi` configuration optional. Any config not defined here will default to the `http` section. -* Added a `securePort` parameter to `operationsApi` and `http` used for setting the https port. -* Added a new top level `tls` section. -* Removed `customFunctions.enabled`, `customFunctions.network.https`, `operationsApi.network.https` and `operationsApi.nodeEnv`. -* Added an element called `componentRoot` which replaces `customFunctions.root`. -* Updated custom pathing to use `databases` instead of `schemas`. -* Added `logging.auditAuthEvents.logFailed` and `logging.auditAuthEvents.logSuccessful` for enabling logging of auth events. -* A new `mqtt` section was added. +- The `http` element has been expanded. + - `compressionThreshold` was added. + - All `customFunction` configuration now lives here, except for the `tls` section. +- `threads` has moved out of the `http` element and now is its own top level element. +- `authentication` section was moved out of the `operationsApi` section and is now its own top level element/section. +- `analytics.aggregatePeriod` was added. +- Default logging level was changed to `warn`. +- Default clustering log level was changed to `info`. +- `clustering.republishMessages` now defaults to `false`. +- `operationsApi.foreground` was removed. To start HarperDB in the foreground, from the CLI run `harperdb`. +- Made `operationsApi` configuration optional. Any config not defined here will default to the `http` section. +- Added a `securePort` parameter to `operationsApi` and `http` used for setting the https port. +- Added a new top level `tls` section. +- Removed `customFunctions.enabled`, `customFunctions.network.https`, `operationsApi.network.https` and `operationsApi.nodeEnv`. +- Added an element called `componentRoot` which replaces `customFunctions.root`. +- Updated custom pathing to use `databases` instead of `schemas`. +- Added `logging.auditAuthEvents.logFailed` and `logging.auditAuthEvents.logSuccessful` for enabling logging of auth events. +- A new `mqtt` section was added. ### Socket Management diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.1.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.1.md index 38617ca9..c792a637 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.1.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.1.md @@ -4,10 +4,11 @@ sidebar_position: 59798 --- ### HarperDB 4.2.1, Tucker Release + 11/3/2023 -* Downgrade NATS 2.10.3 back to 2.10.1 due to regression in connection handling. -* Handle package names with underscores. -* Improved validation of queries and comparators -* Avoid double replication on transactions with multiple commits -* Added file metadata on get_component_file +- Downgrade NATS 2.10.3 back to 2.10.1 due to regression in connection handling. +- Handle package names with underscores. +- Improved validation of queries and comparators +- Avoid double replication on transactions with multiple commits +- Added file metadata on get_component_file diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.2.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.2.md index 15768374..9cfa957e 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.2.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.2.md @@ -4,12 +4,13 @@ sidebar_position: 59797 --- ### HarperDB 4.2.2, Tucker Release + 11/8/2023 -* Increase timeouts for NATS connections. -* Fix for database snapshots for backups (and for clone node). -* Fix application of permissions for default tables exposed through REST. -* Log replication failures with record information. -* Fix application of authorization/permissions for MQTT commands. -* Fix copying of local components in clone node. -* Fix calculation of overlapping start time in clone node. \ No newline at end of file +- Increase timeouts for NATS connections. +- Fix for database snapshots for backups (and for clone node). +- Fix application of permissions for default tables exposed through REST. +- Log replication failures with record information. +- Fix application of authorization/permissions for MQTT commands. +- Fix copying of local components in clone node. +- Fix calculation of overlapping start time in clone node. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.3.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.3.md index dab25c3d..edecd686 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.3.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.3.md @@ -4,10 +4,11 @@ sidebar_position: 59796 --- ### HarperDB 4.2.3, Tucker Release + 11/15/2023 -* When setting setting securePort, disable unsecure port setting on same port -* Fix `harperdb status` when pid file is missing -* Fix/include missing icons/fonts from local studio -* Fix crash that can occur when concurrently accessing records > 16KB -* Apply a lower heap limit to better ensure that memory leaks are quickly caught/mitigated \ No newline at end of file +- When setting setting securePort, disable unsecure port setting on same port +- Fix `harperdb status` when pid file is missing +- Fix/include missing icons/fonts from local studio +- Fix crash that can occur when concurrently accessing records > 16KB +- Apply a lower heap limit to better ensure that memory leaks are quickly caught/mitigated diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.4.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.4.md index 87ee241d..14d268b5 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.4.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.4.md @@ -4,7 +4,8 @@ sidebar_position: 59795 --- ### HarperDB 4.2.4, Tucker Release + 11/16/2023 -* Prevent coercion of strings to numbers in SQL queries (in WHERE clause) -* Address fastify deprecation warning about accessing config \ No newline at end of file +- Prevent coercion of strings to numbers in SQL queries (in WHERE clause) +- Address fastify deprecation warning about accessing config diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.5.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.5.md index 1172c4b3..1b6bf143 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.5.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.5.md @@ -4,9 +4,10 @@ sidebar_position: 59794 --- ### HarperDB 4.2.5, Tucker Release + 11/22/2023 -* Disable compression on server-sent events to ensure messages are immediately sent (not queued for later deliver) -* Update geoNear function to tolerate null values -* lmdb-js fix to ensure prefetched keys are pinned in memory until retrieved -* Add header to indicate start of a new authenticated session (for studio to identify authenticated sessions) +- Disable compression on server-sent events to ensure messages are immediately sent (not queued for later deliver) +- Update geoNear function to tolerate null values +- lmdb-js fix to ensure prefetched keys are pinned in memory until retrieved +- Add header to indicate start of a new authenticated session (for studio to identify authenticated sessions) diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.6.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.6.md index d0a1f177..50abde53 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.6.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.6.md @@ -4,7 +4,8 @@ sidebar_position: 59793 --- ### HarperDB 4.2.6, Tucker Release + 11/29/2023 -* Update various geo SQL functions to tolerate invalid values -* Properly report component installation/load errors in `get_components` (for studio to load components after an installation failure) \ No newline at end of file +- Update various geo SQL functions to tolerate invalid values +- Properly report component installation/load errors in `get_components` (for studio to load components after an installation failure) diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.7.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.7.md index 78bfcaa7..5d75e134 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.7.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.7.md @@ -4,8 +4,9 @@ sidebar_position: 59792 --- ### HarperDB 4.2.7 + 12/6/2023 -* Add support for cloning over the top of an existing HarperDB instance -* Add health checks for NATS consumer with ability to restart consumer loops for better resiliency -* Revert Fastify autoload module due to a regression that had caused EcmaScript modules for Fastify route modules to fail to load on Windows \ No newline at end of file +- Add support for cloning over the top of an existing HarperDB instance +- Add health checks for NATS consumer with ability to restart consumer loops for better resiliency +- Revert Fastify autoload module due to a regression that had caused EcmaScript modules for Fastify route modules to fail to load on Windows diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.8.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.8.md index fbe94b69..21127797 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.8.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.2.8.md @@ -4,11 +4,12 @@ sidebar_position: 59791 --- ### HarperDB 4.2.8 + 12/19/2023 -* Added support CLI command line arguments for clone node -* Added support for cloning a node without enabling clustering -* Clear NATS client cache on closed event -* Fix check for attribute permissions so that an empty attribute permissions array is treated as a table level permission definition -* Improve speed of cross-node health checks -* Fix for using `database` in describe operations +- Added support CLI command line arguments for clone node +- Added support for cloning a node without enabling clustering +- Clear NATS client cache on closed event +- Fix check for attribute permissions so that an empty attribute permissions array is treated as a table level permission definition +- Improve speed of cross-node health checks +- Fix for using `database` in describe operations diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.0.md index 13adfa8e..6b8db941 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.0.md @@ -20,7 +20,7 @@ type Product @table { # foreign key used to reference a brand brandId: ID @indexed # many-to-one relationship to brand - brand: Related @relation(from: "brandId") + brand: Related @relation(from: "brandId") } type Brand @table { id: ID @primaryKey diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.1.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.1.md index e583d175..870968bd 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.1.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.1.md @@ -4,8 +4,9 @@ sidebar_position: 59698 --- ### HarperDB 4.3.1 + 3/25/2024 -* Fix Fastify warning about responseTime usage -* Add access to the MQTT topic in the context -* Fix for ensuring local NATS streams are created +- Fix Fastify warning about responseTime usage +- Add access to the MQTT topic in the context +- Fix for ensuring local NATS streams are created diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.10.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.10.md index bd286e90..7badf0cc 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.10.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.10.md @@ -4,9 +4,10 @@ sidebar_position: 59689 --- ### HarperDB 4.3.10 + 5/5/2024 -* Provide a `data` property on the request/context with deserialized data from the request body for any request including methods that don't typically have a request body -* Ensure that CRDTs are not double applied after committing a transaction -* Delete MQTT will after publishing even if it fails to publish -* Improve transaction retry logic to use async non-optimistic transactions after multiple retries \ No newline at end of file +- Provide a `data` property on the request/context with deserialized data from the request body for any request including methods that don't typically have a request body +- Ensure that CRDTs are not double applied after committing a transaction +- Delete MQTT will after publishing even if it fails to publish +- Improve transaction retry logic to use async non-optimistic transactions after multiple retries diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.11.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.11.md index df2cc2fb..82b47381 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.11.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.11.md @@ -4,7 +4,8 @@ sidebar_position: 59688 --- ### HarperDB 4.3.11 + 5/15/2024 -* Add support for multiple certificates with SNI-based selection of certificates for HTTPS/TLS -* Fix warning in Node v22 \ No newline at end of file +- Add support for multiple certificates with SNI-based selection of certificates for HTTPS/TLS +- Fix warning in Node v22 diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.12.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.12.md index c4344da9..3f016e25 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.12.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.12.md @@ -4,7 +4,8 @@ sidebar_position: 59687 --- ### HarperDB 4.3.12 + 5/16/2024 -* Fix for handling ciphers in multiple certificates -* Allow each certificate config to have multiple hostnames \ No newline at end of file +- Fix for handling ciphers in multiple certificates +- Allow each certificate config to have multiple hostnames diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.13.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.13.md index 7152f231..e7833e0a 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.13.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.13.md @@ -4,8 +4,9 @@ sidebar_position: 59686 --- ### HarperDB 4.3.13 + 5/22/2024 -* Fix for handling HTTPS/TLS with IP address targets (no hostname) where SNI is not available -* Fix for memory leak when a node is down and consumers are trying to reconnect -* Faster cross-thread notification mechanism for transaction events \ No newline at end of file +- Fix for handling HTTPS/TLS with IP address targets (no hostname) where SNI is not available +- Fix for memory leak when a node is down and consumers are trying to reconnect +- Faster cross-thread notification mechanism for transaction events diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.14.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.14.md index 8374b138..0bf4e9c8 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.14.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.14.md @@ -4,6 +4,7 @@ sidebar_position: 59685 --- ### HarperDB 4.3.14 + 5/24/2024 -* Fix application of ciphers to multi-certificate TLS configuration \ No newline at end of file +- Fix application of ciphers to multi-certificate TLS configuration diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.15.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.15.md index 5bbb2304..48321fb6 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.15.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.15.md @@ -4,7 +4,8 @@ sidebar_position: 59684 --- ### HarperDB 4.3.15 + 5/29/2024 -* Add support for wildcards in hostnames for SNI -* Properly apply ciphers settings on multiple TLS configurations \ No newline at end of file +- Add support for wildcards in hostnames for SNI +- Properly apply ciphers settings on multiple TLS configurations diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.16.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.16.md index b3b198d8..195e27b7 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.16.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.16.md @@ -4,7 +4,8 @@ sidebar_position: 59683 --- ### HarperDB 4.3.16 + 6/3/2024 -* Properly shim legacy TLS configuration with new multi-certificate support -* Show the changed filenames when an application is reloaded \ No newline at end of file +- Properly shim legacy TLS configuration with new multi-certificate support +- Show the changed filenames when an application is reloaded diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.17.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.17.md index 6cebb30b..27a0f4cb 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.17.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.17.md @@ -4,11 +4,12 @@ sidebar_position: 59682 --- ### HarperDB 4.3.17 + 6/13/2024 -* Add MQTT analytics of incoming messages and separate by QoS level -* Ensure that any installed `harperdb` package in components is relinked to running harperdb. -* Upgrade storage to more efficiently avoid storage increases -* Fix to improve database metrics in system_information -* Fix for pathing on Windows with extension modules -* Add ability to define a range of listening threads \ No newline at end of file +- Add MQTT analytics of incoming messages and separate by QoS level +- Ensure that any installed `harperdb` package in components is relinked to running harperdb. +- Upgrade storage to more efficiently avoid storage increases +- Fix to improve database metrics in system_information +- Fix for pathing on Windows with extension modules +- Add ability to define a range of listening threads diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.18.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.18.md index 7de1ca2d..052b3821 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.18.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.18.md @@ -4,6 +4,7 @@ sidebar_position: 59681 --- ### HarperDB 4.3.18 + 6/18/2024 -* Immediately terminate an MQTT connection when there is a keep-alive timeout. \ No newline at end of file +- Immediately terminate an MQTT connection when there is a keep-alive timeout. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.19.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.19.md index ed2782da..2676c9f6 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.19.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.19.md @@ -4,8 +4,9 @@ sidebar_position: 59680 --- ### HarperDB 4.3.19 + 7/2/2024 -* Properly return records for the existing value for subscriptions used for retained messages, so they are correctly serialized. -* Ensure that deploy components empty the target directory for a clean installation and expansion of a `package` sub-directory. -* Ensure that we do not double load components that are referenced by symlink from node_modules and in components directory. \ No newline at end of file +- Properly return records for the existing value for subscriptions used for retained messages, so they are correctly serialized. +- Ensure that deploy components empty the target directory for a clean installation and expansion of a `package` sub-directory. +- Ensure that we do not double load components that are referenced by symlink from node_modules and in components directory. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.2.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.2.md index 7a967e98..ca273c5e 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.2.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.2.md @@ -4,12 +4,13 @@ sidebar_position: 59697 --- ### HarperDB 4.3.2 + 3/29/2024 -* Clone node updates to individually clone missing parts -* Fixes for publishing OpenShift container -* Increase purge stream timeout -* Fixed declaration of analytics schema so queries work before a restart -* Fix for iterating queries when deleted records exist -* LMDB stability upgrade -* Fix for cleanup of last will in MQTT \ No newline at end of file +- Clone node updates to individually clone missing parts +- Fixes for publishing OpenShift container +- Increase purge stream timeout +- Fixed declaration of analytics schema so queries work before a restart +- Fix for iterating queries when deleted records exist +- LMDB stability upgrade +- Fix for cleanup of last will in MQTT diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.20.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.20.md index 68a18912..d090990b 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.20.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.20.md @@ -4,14 +4,15 @@ sidebar_position: 59679 --- ### HarperDB 4.3.20 + 7/11/2024 -* The restart_service operation is now executed as a job, making it possible to track the progress of a restart (which is performed as a rolling restart of threads) -* Disable Nagle's algorithm for TCP connections to improve performance -* Append Server-Timing header if a fastify route has already added one -* Avoid symlinking the harperdb directory to itself -* Fix for deleting an empty database -* Upgrade ws and pm2 packages for security vulnerabilities -* Improved TypeScript definitions for Resource and Context. -* The context of a source can set `noCacheStore` to avoid caching the results of a retrieval from source -* Better error reporting of MQTT parsing errors and termination of connections for compliance +- The restart_service operation is now executed as a job, making it possible to track the progress of a restart (which is performed as a rolling restart of threads) +- Disable Nagle's algorithm for TCP connections to improve performance +- Append Server-Timing header if a fastify route has already added one +- Avoid symlinking the harperdb directory to itself +- Fix for deleting an empty database +- Upgrade ws and pm2 packages for security vulnerabilities +- Improved TypeScript definitions for Resource and Context. +- The context of a source can set `noCacheStore` to avoid caching the results of a retrieval from source +- Better error reporting of MQTT parsing errors and termination of connections for compliance diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.21.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.21.md index b8c22de5..7afefd12 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.21.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.21.md @@ -4,10 +4,11 @@ sidebar_position: 59678 --- ### HarperDB 4.3.21 + 8/21/2024 -* Fixed an issue with iterating/serializing query results with a `limit`. -* Fixed an issue that was preventing the caching of structured records in memory. -* Fixed and added several TypeScript exported types including `tables`, `databases`, `Query`, and `Context`. -* Fixed logging warnings about license limits after a license is updated. -* Don't register a certificate as the default certificate for non-SNI connections unless it lists an IP address in the SAN field. \ No newline at end of file +- Fixed an issue with iterating/serializing query results with a `limit`. +- Fixed an issue that was preventing the caching of structured records in memory. +- Fixed and added several TypeScript exported types including `tables`, `databases`, `Query`, and `Context`. +- Fixed logging warnings about license limits after a license is updated. +- Don't register a certificate as the default certificate for non-SNI connections unless it lists an IP address in the SAN field. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.22.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.22.md index 92f1da33..a4bc2003 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.22.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.22.md @@ -4,11 +4,12 @@ sidebar_position: 59677 --- ### HarperDB 4.3.22 + 9/6/2024 -* Adding improved back-pressure handling for large subscriptions and backlogs with durable MQTT sessions -* Allow .extension in URL paths to indicate both preferred encoding and decoding -* Added support for multi-part ids in query parameters -* Limit describe calls by time before using statistical sampling -* Proper cleanup of a transaction when it is aborted due to running out of available read transactions -* Updates to release/builds \ No newline at end of file +- Adding improved back-pressure handling for large subscriptions and backlogs with durable MQTT sessions +- Allow .extension in URL paths to indicate both preferred encoding and decoding +- Added support for multi-part ids in query parameters +- Limit describe calls by time before using statistical sampling +- Proper cleanup of a transaction when it is aborted due to running out of available read transactions +- Updates to release/builds diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.23.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.23.md index 8dd47c25..7496c1d1 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.23.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.23.md @@ -4,8 +4,9 @@ sidebar_position: 59676 --- ### HarperDB 4.3.23 + 9/12/2024 -* Avoid long-running read transactions on subscription catch-ups -* Reverted change to setting default certificate for IP address only -* Better handling of last-will messages on startup \ No newline at end of file +- Avoid long-running read transactions on subscription catch-ups +- Reverted change to setting default certificate for IP address only +- Better handling of last-will messages on startup diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.24.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.24.md index ef4933ea..435c15ec 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.24.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.24.md @@ -4,6 +4,7 @@ sidebar_position: 59675 --- ### HarperDB 4.3.24 + 9/12/2024 -* Fix for querying for large strings (over 255 characters) \ No newline at end of file +- Fix for querying for large strings (over 255 characters) diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.25.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.25.md index 387a2588..601d9ec0 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.25.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.25.md @@ -4,9 +4,10 @@ sidebar_position: 59674 --- ### HarperDB 4.3.25 + 9/24/2024 -* Add analytics for replication latency -* Fix iteration issue over asynchronous joined queries -* Local studio fix for loading applications in insecure context (HTTP) -* Local studio fix for loading configuration tab \ No newline at end of file +- Add analytics for replication latency +- Fix iteration issue over asynchronous joined queries +- Local studio fix for loading applications in insecure context (HTTP) +- Local studio fix for loading configuration tab diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.26.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.26.md index d910120c..c0dacf54 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.26.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.26.md @@ -4,7 +4,8 @@ sidebar_position: 59673 --- ### HarperDB 4.3.26 + 9/27/2024 -* Fixed a security issue that allowed users to bypass access controls with the operations API -* Previously expiration handling was limited to tables with a source, but now it can be applied to any table \ No newline at end of file +- Fixed a security issue that allowed users to bypass access controls with the operations API +- Previously expiration handling was limited to tables with a source, but now it can be applied to any table diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.27.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.27.md index ca8352d3..0bbd448a 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.27.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.27.md @@ -4,10 +4,11 @@ sidebar_position: 59672 --- ### HarperDB 4.3.27 + 10/2/2024 -* Fixed handling HTTP upgrade with Connection header that does not use Upgrade as the sole value (for Firefox) -* Added metrics for requests by status code -* Properly remove attributes from the stored metadata when removed from GraphQL schema -* Fixed a regression in clustering retrieval of schema description -* Fix attribute validation/handling to ensure that sequential ids can be assigned with insert/upsert operations \ No newline at end of file +- Fixed handling HTTP upgrade with Connection header that does not use Upgrade as the sole value (for Firefox) +- Added metrics for requests by status code +- Properly remove attributes from the stored metadata when removed from GraphQL schema +- Fixed a regression in clustering retrieval of schema description +- Fix attribute validation/handling to ensure that sequential ids can be assigned with insert/upsert operations diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.28.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.28.md index fdba3828..361d416d 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.28.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.28.md @@ -4,8 +4,9 @@ sidebar_position: 59671 --- ### HarperDB 4.3.28 + 10/3/2024 -* Tolerate user with no role when building NATS config -* Change metrics for requests by status code to be prefixed with "response_" -* Log error `cause`, and other properties, when available. +- Tolerate user with no role when building NATS config +- Change metrics for requests by status code to be prefixed with "response\_" +- Log error `cause`, and other properties, when available. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.29.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.29.md index c1f533fd..5537df8b 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.29.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.29.md @@ -4,13 +4,14 @@ sidebar_position: 59670 --- ### HarperDB 4.3.29 + 10/7/2024 -* Avoid unnecessary cookie session creation without explicit login -* Added support for caching directives in operations API -* Fixed issue with creating metadata for table with no primary key -* Local studio upgrade: - * Added support for "cache only" mode to view table data without origin resolution - * Added partial support for cookie-based authentication - * Added support for browsing tables with no primary key - * Improved performance for sorting tables +- Avoid unnecessary cookie session creation without explicit login +- Added support for caching directives in operations API +- Fixed issue with creating metadata for table with no primary key +- Local studio upgrade: + - Added support for "cache only" mode to view table data without origin resolution + - Added partial support for cookie-based authentication + - Added support for browsing tables with no primary key + - Improved performance for sorting tables diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.3.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.3.md index 52d7ebde..38175dda 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.3.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.3.md @@ -4,6 +4,7 @@ sidebar_position: 59696 --- ### HarperDB 4.3.3 + 4/01/2024 -* Improve MQTT logging by properly logging auth failures, logging disconnections +- Improve MQTT logging by properly logging auth failures, logging disconnections diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.30.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.30.md index 70c10852..e005db97 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.30.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.30.md @@ -4,6 +4,7 @@ sidebar_position: 59669 --- ### HarperDB 4.3.30 + 10/9/2024 -* Properly assign transaction timestamp to writes from cache resolutions (ensuring that latencies can be calculated on replicating nodes) +- Properly assign transaction timestamp to writes from cache resolutions (ensuring that latencies can be calculated on replicating nodes) diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.31.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.31.md index 097726ac..80cab2b9 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.31.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.31.md @@ -4,8 +4,9 @@ sidebar_position: 59668 --- ### HarperDB 4.3.31 + 10/10/2024 -* Reset the restart limit for manual restarts to ensure that NATS process will continue to restart after more than 10 manual restarts -* Only apply caching directives (from headers) to tables/resources that are configured to be caching, sourced from another resource -* Catch/tolerate errors on serializing objects for logging +- Reset the restart limit for manual restarts to ensure that NATS process will continue to restart after more than 10 manual restarts +- Only apply caching directives (from headers) to tables/resources that are configured to be caching, sourced from another resource +- Catch/tolerate errors on serializing objects for logging diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.32.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.32.md index ee5da648..0b5893b4 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.32.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.32.md @@ -4,8 +4,9 @@ sidebar_position: 59667 --- ### HarperDB 4.3.32 + 10/16/2024 -* Fix a memory leak when cluster_network closes a hub connection -* Improved MQTT error handling, with less verbose logging of more common errors, and treat a missing subscription as an invalid/missing topic -* Record analytics and server-timing header even when cache resolution fails +- Fix a memory leak when cluster_network closes a hub connection +- Improved MQTT error handling, with less verbose logging of more common errors, and treat a missing subscription as an invalid/missing topic +- Record analytics and server-timing header even when cache resolution fails diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.33.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.33.md index 271373ef..7707a562 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.33.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.33.md @@ -4,6 +4,7 @@ sidebar_position: 59666 --- ### HarperDB 4.3.33 + 10/24/2024 -* Change the default maximum length for a fastify route parameter from 100 to 1000 characters. +- Change the default maximum length for a fastify route parameter from 100 to 1000 characters. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.34.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.34.md index 1071c273..2bd65833 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.34.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.34.md @@ -4,6 +4,7 @@ sidebar_position: 59665 --- ### HarperDB 4.3.34 + 10/24/2024 -* lmdb-js upgrade +- lmdb-js upgrade diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.35.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.35.md index 1811732b..f8dd7b73 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.35.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.35.md @@ -4,7 +4,8 @@ sidebar_position: 59664 --- ### HarperDB 4.3.35 + 11/12/2024 -* Upgrades for supporting Node.js V23 -* Fix for handling a change in the schema for nested data structures +- Upgrades for supporting Node.js V23 +- Fix for handling a change in the schema for nested data structures diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.36.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.36.md index b2db5bd7..2eb8e636 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.36.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.36.md @@ -4,6 +4,7 @@ sidebar_position: 59663 --- ### HarperDB 4.3.36 + 11/14/2024 -* lmdb-js upgrade for better free-space management +- lmdb-js upgrade for better free-space management diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.37.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.37.md index 57e23f5d..f36e1c32 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.37.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.37.md @@ -4,6 +4,7 @@ sidebar_position: 59662 --- ### HarperDB 4.3.37 + 12/6/2024 -* lmdb-js upgrade for preventing crashes with shared user buffers +- lmdb-js upgrade for preventing crashes with shared user buffers diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.38.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.38.md index 640f3620..d1fce0f8 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.38.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.38.md @@ -4,6 +4,7 @@ sidebar_position: 59661 --- ### HarperDB 4.3.38 + 1/10/2025 -* Fixes for audit log cleanup +- Fixes for audit log cleanup diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.4.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.4.md index f50f1bb6..0c96732f 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.4.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.4.md @@ -4,7 +4,8 @@ sidebar_position: 59695 --- ### HarperDB 4.3.4 + 4/9/2024 -* Fixed a buffer overrun issue with decompressing compressed data -* Better keep-alive of transactions with long running queries \ No newline at end of file +- Fixed a buffer overrun issue with decompressing compressed data +- Better keep-alive of transactions with long running queries diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.5.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.5.md index 40d030e5..60888785 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.5.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.5.md @@ -4,6 +4,7 @@ sidebar_position: 59694 --- ### HarperDB 4.3.5 + 4/10/2024 -* Fixed a buffer overrun issue with decompressing compressed data \ No newline at end of file +- Fixed a buffer overrun issue with decompressing compressed data diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.6.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.6.md index 92b28286..54a4739a 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.6.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.6.md @@ -4,10 +4,11 @@ sidebar_position: 59693 --- ### HarperDB 4.3.6 + 4/12/2024 -* Fixed parsing of dates from epoch millisecond times in queries -* Fixed CRDT incrementation of different data types -* Adjustments to text/plain content type q-value handling -* Fixed parsing of passwords with a colon -* Added MQTT events for connections, authorization, and disconnections \ No newline at end of file +- Fixed parsing of dates from epoch millisecond times in queries +- Fixed CRDT incrementation of different data types +- Adjustments to text/plain content type q-value handling +- Fixed parsing of passwords with a colon +- Added MQTT events for connections, authorization, and disconnections diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.7.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.7.md index 8f45995a..df9fb331 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.7.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.7.md @@ -4,10 +4,11 @@ sidebar_position: 59692 --- ### HarperDB 4.3.7 + 4/16/2024 -* Fixed transaction handling to stay on open on long compaction operations -* Fixed handling of sorting on non-indexed attributes -* Storage stability improvements -* Fixed authentication/authorization of WebSockets connection and use of cookies -* Fixes for clone node operations \ No newline at end of file +- Fixed transaction handling to stay on open on long compaction operations +- Fixed handling of sorting on non-indexed attributes +- Storage stability improvements +- Fixed authentication/authorization of WebSockets connection and use of cookies +- Fixes for clone node operations diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.8.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.8.md index cd0fe88e..0e4c5b6c 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.8.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.8.md @@ -4,10 +4,11 @@ sidebar_position: 59691 --- ### HarperDB 4.3.8 + 4/26/2024 -* Added support for the MQTT keep-alive feature (disconnecting if no control messages are received within keep-alive window) -* Improved handling of write queue timeouts, with configurability -* Fixed a memory leak that can occur with NATS reconnections after heartbeat misses -* Fixed a bug in clone node with a null port -* Add error events to MQTT events system \ No newline at end of file +- Added support for the MQTT keep-alive feature (disconnecting if no control messages are received within keep-alive window) +- Improved handling of write queue timeouts, with configurability +- Fixed a memory leak that can occur with NATS reconnections after heartbeat misses +- Fixed a bug in clone node with a null port +- Add error events to MQTT events system diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.9.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.9.md index dca6a92f..17c95934 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.9.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.3.9.md @@ -4,6 +4,7 @@ sidebar_position: 59690 --- ### HarperDB 4.3.9 + 4/30/2024 -* lmdb-js upgrade \ No newline at end of file +- lmdb-js upgrade diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.1.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.1.md index 80fac940..5c1e2037 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.1.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.1.md @@ -4,9 +4,10 @@ sidebar_position: 59598 --- ### HarperDB 4.4.1 + 10/17/2024 -* Fix issue where non-RSA keys were not being parsed correctly on startup. -* Fix a memory leak when cluster_network closes a hub connection -* Improved MQTT error handling, with less verbose logging of more common errors, and treat a missing subscription as an invalid/missing topic -* Record analytics and server-timing header even when cache resolution fails \ No newline at end of file +- Fix issue where non-RSA keys were not being parsed correctly on startup. +- Fix a memory leak when cluster_network closes a hub connection +- Improved MQTT error handling, with less verbose logging of more common errors, and treat a missing subscription as an invalid/missing topic +- Record analytics and server-timing header even when cache resolution fails diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.10.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.10.md index 328a694a..6d8aad2c 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.10.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.10.md @@ -4,6 +4,7 @@ sidebar_position: 59589 --- ### HarperDB 4.4.10 + 12/17/2024 -* Fix for deploying packages and detecting node_modules directory \ No newline at end of file +- Fix for deploying packages and detecting node_modules directory diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.11.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.11.md index 6f5d7215..5e5b5fc0 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.11.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.11.md @@ -4,7 +4,8 @@ sidebar_position: 59588 --- ### HarperDB 4.4.11 + 12/18/2024 -* Fix for initial certification creation on upgrade -* Docker build fix \ No newline at end of file +- Fix for initial certification creation on upgrade +- Docker build fix diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.12.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.12.md index 82c09692..8efe840e 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.12.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.12.md @@ -4,7 +4,8 @@ sidebar_position: 59587 --- ### HarperDB 4.4.12 + 12/19/2024 -* Move components installed by reference into hdb/components for consistency and compatibility with next.js -* Use npm install --force to ensure modules are installed \ No newline at end of file +- Move components installed by reference into hdb/components for consistency and compatibility with next.js +- Use npm install --force to ensure modules are installed diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.13.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.13.md index 681fc21d..cab28cc0 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.13.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.13.md @@ -4,12 +4,13 @@ sidebar_position: 59586 --- ### HarperDB 4.4.13 + 1/2/2025 -* Fix for not using requestCert if the port doesn't need replication -* Fix for applying timeouts HTTP server for ancient node versions -* Updates for different replication configuration settings, including sharding and replication using stored credentials -* Mitigation crashing due GC'ed shared array buffers -* Fix for error handling with CLI failures -* Updated dependencies -* Fix for allow securePort to be set on authentication \ No newline at end of file +- Fix for not using requestCert if the port doesn't need replication +- Fix for applying timeouts HTTP server for ancient node versions +- Updates for different replication configuration settings, including sharding and replication using stored credentials +- Mitigation crashing due GC'ed shared array buffers +- Fix for error handling with CLI failures +- Updated dependencies +- Fix for allow securePort to be set on authentication diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.14.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.14.md index 48103afe..b44a173d 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.14.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.14.md @@ -4,9 +4,10 @@ sidebar_position: 59585 --- ### HarperDB 4.4.14 + 1/3/2025 -* Fix for starting HTTP server if headersTimeout is omitted in the configuration -* Fix for avoiding ping timeouts for large/long-duration WS messages between nodes -* Don't report errors for component that only uses a directory -* Add flag for disabling WebSocket on REST component \ No newline at end of file +- Fix for starting HTTP server if headersTimeout is omitted in the configuration +- Fix for avoiding ping timeouts for large/long-duration WS messages between nodes +- Don't report errors for component that only uses a directory +- Add flag for disabling WebSocket on REST component diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.15.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.15.md index ec4ac263..b6a8ee2b 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.15.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.15.md @@ -4,8 +4,9 @@ sidebar_position: 59584 --- ### HarperDB 4.4.15 + 1/8/2025 -* Fix for manage the state of replication sequences for node -* Fix for better concurrency with ongoing replication -* Fix for accessing audit log entries \ No newline at end of file +- Fix for manage the state of replication sequences for node +- Fix for better concurrency with ongoing replication +- Fix for accessing audit log entries diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.16.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.16.md index 3e90a9b1..d85de974 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.16.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.16.md @@ -4,12 +4,13 @@ sidebar_position: 59583 --- ### HarperDB 4.4.16 + 1/22/2025 -* Fix for cleaning up old audit entries and associated deletion entries -* Allow CLI operations to be run when cloning is enabled -* Report table size in describe operations -* Fix for cleaning up symlinks when dropping components -* Fix for enumerating components when symlinks are used -* Add an option for using a specific installation command with deploys -* Add an API for registering an HTTP upgrade listener with `server.upgrade` \ No newline at end of file +- Fix for cleaning up old audit entries and associated deletion entries +- Allow CLI operations to be run when cloning is enabled +- Report table size in describe operations +- Fix for cleaning up symlinks when dropping components +- Fix for enumerating components when symlinks are used +- Add an option for using a specific installation command with deploys +- Add an API for registering an HTTP upgrade listener with `server.upgrade` diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.17.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.17.md index 788b9810..239f7729 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.17.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.17.md @@ -4,9 +4,10 @@ sidebar_position: 59582 --- ### HarperDB 4.4.17 + 1/29/2025 -* Provide statistics on the size of the audit log store -* Fix handling of symlinks to HarperDB package that to avoid NPM's errors in restricted containers -* Add option for rolling/consecutive restarts for deployments -* Fix for enabling root CAs for replication authorization \ No newline at end of file +- Provide statistics on the size of the audit log store +- Fix handling of symlinks to HarperDB package that to avoid NPM's errors in restricted containers +- Add option for rolling/consecutive restarts for deployments +- Fix for enabling root CAs for replication authorization diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.18.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.18.md index cf341732..e7354587 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.18.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.18.md @@ -4,8 +4,9 @@ sidebar_position: 59581 --- ### HarperDB 4.4.18 + 1/29/2025 -* Add option for disabling full table copy in replication -* Add option for startTime in route configuration -* Add/fix option to deploy with package from CLI \ No newline at end of file +- Add option for disabling full table copy in replication +- Add option for startTime in route configuration +- Add/fix option to deploy with package from CLI diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.19.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.19.md index 53d42bb8..5a1cc14e 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.19.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.19.md @@ -4,9 +4,10 @@ sidebar_position: 59580 --- ### HarperDB 4.4.19 + 2/4/2025 -* LMDB upgrade for free-list verification on commit -* Add check to avoid compacting database multiple times with compactOnStart -* Fix handling of denied/absent subscription -* Add support for including symlinked directories in packaging a deployed component \ No newline at end of file +- LMDB upgrade for free-list verification on commit +- Add check to avoid compacting database multiple times with compactOnStart +- Fix handling of denied/absent subscription +- Add support for including symlinked directories in packaging a deployed component diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.2.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.2.md index 6137d48a..53dfbb7b 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.2.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.2.md @@ -4,6 +4,7 @@ sidebar_position: 59597 --- ### HarperDB 4.4.2 + 10/18/2024 -* Republish of 4.4.1 with Git merge correction. \ No newline at end of file +- Republish of 4.4.1 with Git merge correction. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.20.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.20.md index 845129ca..656de065 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.20.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.20.md @@ -4,6 +4,7 @@ sidebar_position: 59579 --- ### HarperDB 4.4.20 + 2/11/2025 -* LMDB upgrade for improved handling of page boundaries with free-space lists +- LMDB upgrade for improved handling of page boundaries with free-space lists diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.21.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.21.md index 74d653bc..c63d84a2 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.21.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.21.md @@ -4,8 +4,9 @@ sidebar_position: 59578 --- ### HarperDB 4.4.21 + 2/25/2025 -* Fix for saving audit log entries for large keys (> 1KB) -* Security fix for handling missing passwords -* Skip bin links for NPM installation to avoid access issues \ No newline at end of file +- Fix for saving audit log entries for large keys (> 1KB) +- Security fix for handling missing passwords +- Skip bin links for NPM installation to avoid access issues diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.22.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.22.md index 85ae1895..d66163f9 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.22.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.22.md @@ -4,6 +4,7 @@ sidebar_position: 59577 --- ### HarperDB 4.4.22 + 3/5/2025 -* Add new http configuration option `corsAccessControlAllowHeaders` \ No newline at end of file +- Add new http configuration option `corsAccessControlAllowHeaders` diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.23.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.23.md index 42e37e0c..9048b3d6 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.23.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.23.md @@ -4,7 +4,8 @@ sidebar_position: 59576 --- ### HarperDB 4.4.23 + 3/7/2025 -* Fix for subscriptions to children of segmented id -* Fix for better error reporting on NPM failures \ No newline at end of file +- Fix for subscriptions to children of segmented id +- Fix for better error reporting on NPM failures diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.24.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.24.md index dbdf7972..324a2423 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.24.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.24.md @@ -4,7 +4,8 @@ sidebar_position: 59575 --- ### HarperDB 4.4.24 + 3/10/2025 -* Use process.exit(0) to restart when enabled by env var -* Reset the cwd on thread restart \ No newline at end of file +- Use process.exit(0) to restart when enabled by env var +- Reset the cwd on thread restart diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.3.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.3.md index e91428c4..4e844820 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.3.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.3.md @@ -4,10 +4,11 @@ sidebar_position: 59596 --- ### HarperDB 4.4.3 + 10/25/2024 -* Fix for notification of records through classes that override get for multi-tier caching -* Fix for CLI operations -* Support for longer route parameters in Fastify routes -* Fix for accessing `harperdb` package/module from user threads -* Improvements to clone node for cloning without credentials \ No newline at end of file +- Fix for notification of records through classes that override get for multi-tier caching +- Fix for CLI operations +- Support for longer route parameters in Fastify routes +- Fix for accessing `harperdb` package/module from user threads +- Improvements to clone node for cloning without credentials diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.4.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.4.md index 8e6a0c48..bbf0df8d 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.4.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.4.md @@ -4,8 +4,9 @@ sidebar_position: 59595 --- ### HarperDB 4.4.4 + 11/4/2024 -* Re-introduce declarative roles and permissions -* Fix for OpenAPI endpoint -* Fix for exports of `harperdb` package/module \ No newline at end of file +- Re-introduce declarative roles and permissions +- Fix for OpenAPI endpoint +- Fix for exports of `harperdb` package/module diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.5.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.5.md index f075ea02..448687c6 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.5.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.5.md @@ -4,12 +4,13 @@ sidebar_position: 59594 --- ### HarperDB 4.4.5 + 11/15/2024 -* Fix for DOS vulnerability in large headers with cache-control and replication headers -* Fix for handling a change in the schema type for sub-fields in a nested object -* Add support for content type handlers to return iterators -* Fix for session management with custom authentication handler -* Updates for Node.js V23 compatibility -* Fix for sorting on nested properties -* Fix for querying on not_equal to a null with object values \ No newline at end of file +- Fix for DOS vulnerability in large headers with cache-control and replication headers +- Fix for handling a change in the schema type for sub-fields in a nested object +- Add support for content type handlers to return iterators +- Fix for session management with custom authentication handler +- Updates for Node.js V23 compatibility +- Fix for sorting on nested properties +- Fix for querying on not_equal to a null with object values diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.6.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.6.md index 2d4b17b6..4cc0cc86 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.6.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.6.md @@ -4,9 +4,10 @@ sidebar_position: 59593 --- ### HarperDB 4.4.6 + 11/25/2024 -* Fix queries with only sorting applied -* Fix for handling invalidation events propagating through sources -* Expanded CLI support for deploying packages -* Support for deploying large packages \ No newline at end of file +- Fix queries with only sorting applied +- Fix for handling invalidation events propagating through sources +- Expanded CLI support for deploying packages +- Support for deploying large packages diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.7.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.7.md index e1723090..a4f6041f 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.7.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.7.md @@ -4,7 +4,8 @@ sidebar_position: 59592 --- ### HarperDB 4.4.7 + 11/27/2024 -* Allow for package to deploy own modules -* Fix for preventing double sourcing of resources \ No newline at end of file +- Allow for package to deploy own modules +- Fix for preventing double sourcing of resources diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.8.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.8.md index 3bb02964..493736a8 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.8.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.8.md @@ -4,6 +4,7 @@ sidebar_position: 59591 --- ### HarperDB 4.4.8 + 12/2/2024 -* Add multiple node versions of published docker containers \ No newline at end of file +- Add multiple node versions of published docker containers diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.9.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.9.md index fa576ba9..077e80cd 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.9.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.4.9.md @@ -4,10 +4,11 @@ sidebar_position: 59590 --- ### HarperDB 4.4.9 + 12/12/2024 -* Change enableRootCAs to default to true -* Fixes for install and clone commands -* Add rejectUnauthorized to the CLI options -* Fixes for cloning -* Install modules in own component when deploying package by payload \ No newline at end of file +- Change enableRootCAs to default to true +- Fixes for install and clone commands +- Add rejectUnauthorized to the CLI options +- Fixes for cloning +- Install modules in own component when deploying package by payload diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.0.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.0.md index 8c1818fc..ab458db1 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.0.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.0.md @@ -10,69 +10,90 @@ sidebar_position: 59499 3/13/2025 ### Blob Storage -4.5 introduces a new [Blob storage system](../../reference/blob), that is designed to efficiently handle large binary objects, with built-in support for streaming large content/media in and out of storage. This provides significantly better performance and functionality for large unstructured data, such as HTML, images, video, and other large files. Components can leverage this functionality through the JavaScript `Blob` interface, and the new `createBlob` function. Blobs are fully replicated and integrated. Harper can also coerce strings to `Blob`s (when dictated by the field type), making it feasible to use blobs for large string data, including with MQTT messaging. + +4.5 introduces a new [Blob storage system](../../reference/blob), that is designed to efficiently handle large binary objects, with built-in support for streaming large content/media in and out of storage. This provides significantly better performance and functionality for large unstructured data, such as HTML, images, video, and other large files. Components can leverage this functionality through the JavaScript `Blob` interface, and the new `createBlob` function. Blobs are fully replicated and integrated. Harper can also coerce strings to `Blob`s (when dictated by the field type), making it feasible to use blobs for large string data, including with MQTT messaging. ### Password Hashing Upgrade + 4.5 adds two new password hashing algorithms for better security (to replace md5): `sha256`: This is a solid general purpose of password hashing, with good security properties and excellent performance. This is the default algorithm in 4.5. -`argon2id`: This provides the highest level of security, and is the recommended algorithm that do not require frequent password verifications. However, it is more CPU intensive, and may not be suitable for environments with a high frequency of password verifications. +`argon2id`: This provides the highest level of security, and is the recommended algorithm that do not require frequent password verifications. However, it is more CPU intensive, and may not be suitable for environments with a high frequency of password verifications. ### Resource and Storage Analytics + 4.5 includes numerous new analytics for resources and storage, including page faults, context switches, free space, disk usage, and other metrics. #### Default Replication Port + The default port for replication has been changed from 9925 to 9933. ### Property Forwarding -Accessing record properties from resource instances should be accessible through standard property access syntax, regardless of whether the property was declared in a schema. Previously only properties declared in a schema were accessible through standard property access syntax. This change allows for more consistent and intuitive access to record properties, regardless of how they were defined. It is still recommended to declare properties in a schema for better performance and documentation. + +Accessing record properties from resource instances should be accessible through standard property access syntax, regardless of whether the property was declared in a schema. Previously only properties declared in a schema were accessible through standard property access syntax. This change allows for more consistent and intuitive access to record properties, regardless of how they were defined. It is still recommended to declare properties in a schema for better performance and documentation. ### Storage Reclamation + Harper now includes functionality for automatically trying to clean up and evict non-essential data when storage is running low. When free space drops below 40% (configurable), Harper will start to: -* Evict older entries from caching tables -* Evict older audit log entries -* Remove older rotated logs files -These efforts will become progressively more aggressive as free space decreases. + +- Evict older entries from caching tables +- Evict older audit log entries +- Remove older rotated logs files + These efforts will become progressively more aggressive as free space decreases. ### Expanded Sharding Functionality + When sharding is being used, Harper can now honor write requests with residency information that will not be written to the local node's table. Harper also now allows nodes to be declaratively configured as part of a shard. ### Certificate Revocation + Certificates can now be revoked by configuring nodes with a list of revoked certificate serial numbers. ### Built-in `loadEnv` Component -There is a [new `loadEnv` component loader](../../../developers/components/built-in) that can be used to load environmental variables from a .env in a component. + +There is a [new `loadEnv` component loader](../../../developers/components/built-in) that can be used to load environmental variables from a .env in a component. ### Cluster Status Information + The [`cluster_status` operation](../../../developers/operations-api/clustering) now includes new statistics for replication, including the timestamps of last received transactions, sent transactions, and committed transactions. ### Improved URL path parsing -Resources can be defined with nested paths and directly accessed by the exact path without requiring a trailing slash. The `id.property` syntax for accessing properties in URLs will only be applied to properties that are declared in a schema. This allows for URLs to generally include dots in paths without being interpreted as property access. A new [`directURLMapping` option/flag](../../../deployments/configuration) on resources that allows for more direct URL path handling as well. + +Resources can be defined with nested paths and directly accessed by the exact path without requiring a trailing slash. The `id.property` syntax for accessing properties in URLs will only be applied to properties that are declared in a schema. This allows for URLs to generally include dots in paths without being interpreted as property access. A new [`directURLMapping` option/flag](../../../deployments/configuration) on resources that allows for more direct URL path handling as well. ### `server.authenticateUser` API + In addition to the `server.getUser` API that allows for retrieval of users by username, the `server.authenticateUser` API is now available which will _always_ verify the user by the provided password. #### Improved Message Delivery + Performance of delivery of messages has been improved. ### HTTP/2 + HarperDB now supports HTTP/2 for all API endpoints. This can be enabled with the `http2` option in the configuration file. ### `harperdb` symlink + Using `import from 'harperdb'` will more consistently work when directly running a component locally. ### Transaction Reuse + By default, transactions can now be reused after calling `transaction.commit()`. ### GraphQL configuration + The GraphQL query endpoint can be configured to listen on different ports. GraphQL query endpoing is now also disabled by default, to avoid any conflicts. ### Glob support for components + Glob file handling for specifying files used by components has been improved for better consistency. ### Table.getRecordCount + `Table.getRecordCount()` is now available to get the number of records in a table. ### Removal of record counts from REST API + Previously the root path for a resource in the REST API would return a record count. However, this is a significant performance hazard and was never documented to exist, so this has been removed to ensure better performance and reliability. -Note that downgrading from 4.5 to 4.4 is *not* supported. \ No newline at end of file +Note that downgrading from 4.5 to 4.4 is _not_ supported. diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.1.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.1.md index a9aaf906..ec431a8a 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.1.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.1.md @@ -4,12 +4,13 @@ sidebar_position: 59498 --- ### HarperDB 4.5.1 + 3/18/2025 -* Fix/implementation for sharding data that is written for cache resolution -* Add support for replication.shard in configuration for defining local node's shard id -* Fix for source map handling in stack traces -* Improved error reporting for syntax errors in component code -* Improved logging on deployment and NPM installation -* Added shard information to cluster_status -* Fix for audit entry eviction when a table is deleted \ No newline at end of file +- Fix/implementation for sharding data that is written for cache resolution +- Add support for replication.shard in configuration for defining local node's shard id +- Fix for source map handling in stack traces +- Improved error reporting for syntax errors in component code +- Improved logging on deployment and NPM installation +- Added shard information to cluster_status +- Fix for audit entry eviction when a table is deleted diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.10.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.10.md index 7d981ff2..b74fbadb 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.10.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.10.md @@ -4,7 +4,8 @@ sidebar_position: 59489 --- ### HarperDB 4.5.10 + 5/20/2025 -* Expose the `resources` map for being able to set and access custom resources -* Fix for cleaning up blob files that are used when a database is deleted \ No newline at end of file +- Expose the `resources` map for being able to set and access custom resources +- Fix for cleaning up blob files that are used when a database is deleted diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.11.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.11.md index cba2d019..d3f9d8fa 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.11.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.11.md @@ -4,7 +4,8 @@ sidebar_position: 59488 --- ### HarperDB 4.5.11 + 6/27/2025 -* Fix bug (workaround Node.js bug) with assigning the ciphers to a server and applying to TLS connections -* Fix for handling TLS array when checking certificates configuration \ No newline at end of file +- Fix bug (workaround Node.js bug) with assigning the ciphers to a server and applying to TLS connections +- Fix for handling TLS array when checking certificates configuration diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.12.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.12.md index 6353bfc2..2312329e 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.12.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.12.md @@ -4,10 +4,11 @@ sidebar_position: 59487 --- ### HarperDB 4.5.12 + 7/9/2025 - Fix for dynamically setting `harperdb` package symlink on deploy - Assign shard numbers from each node's config rather than from routes - Handle certificates without a common name, falling back to the SANs -- Properly clean up blobs that are only transiently used for replication +- Properly clean up blobs that are only transiently used for replication - Ensure that we always set up server.shards even when there are no TLS connections diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.13.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.13.md index 2b8a6149..d4ef7ac7 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.13.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.13.md @@ -4,6 +4,7 @@ sidebar_position: 59486 --- ### HarperDB 4.5.13 + 7/12/2025 - Fix cleaning out audit entries when a blob has been removed diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.14.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.14.md index 0ad8f235..d50482a6 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.14.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.14.md @@ -4,6 +4,7 @@ sidebar_position: 59485 --- ### HarperDB 4.5.14 + 7/15/2025 - Use proper back-pressure when copying a table for initial database sync diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.15.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.15.md index 2387680d..8e5b7821 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.15.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.15.md @@ -4,6 +4,7 @@ sidebar_position: 59484 --- ### HarperDB 4.5.15 + 7/21/2025 - Removed the `copyTablesToCatchUp` option and instead utilized the clone node designation of the leader node to copy tables diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.16.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.16.md index 6874cce9..829cd9d8 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.16.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.16.md @@ -4,6 +4,7 @@ sidebar_position: 59483 --- ### HarperDB 4.5.16 + 7/30/2025 -- Do not free/remove the shared user buffer that is used by all threads as an atomic counter for ids (for blobs and incremented ids), but retain it as a stable allocated buffer +- Do not free/remove the shared user buffer that is used by all threads as an atomic counter for ids (for blobs and incremented ids), but retain it as a stable allocated buffer diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.2.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.2.md index 34fbe309..62468720 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.2.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.2.md @@ -4,9 +4,10 @@ sidebar_position: 59497 --- ### HarperDB 4.5.2 + 3/25/2025 -* For defined schemas, don't allow updates from remote nodes that could cause conflicts and repeated schema change requests -* New harper-chrome docker container for accessing Chrome binaries for use with tools like Puppeteer -* Improved rolling restart handling of errors with reaching individual nodes -* Defined cleaner operation object to avoid accident leaking of credentials with logging \ No newline at end of file +- For defined schemas, don't allow updates from remote nodes that could cause conflicts and repeated schema change requests +- New harper-chrome docker container for accessing Chrome binaries for use with tools like Puppeteer +- Improved rolling restart handling of errors with reaching individual nodes +- Defined cleaner operation object to avoid accident leaking of credentials with logging diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.3.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.3.md index b2a9313e..b0878089 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.3.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.3.md @@ -4,7 +4,8 @@ sidebar_position: 59496 --- ### HarperDB 4.5.3 + 4/3/2025 -* Fix for immediately reloading updated certificates and private key files to ensure that certificates properly match the private key -* Fix for analytics of storage size when tables are deleted \ No newline at end of file +- Fix for immediately reloading updated certificates and private key files to ensure that certificates properly match the private key +- Fix for analytics of storage size when tables are deleted diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.4.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.4.md index e4344e01..2d334a06 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.4.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.4.md @@ -4,8 +4,9 @@ sidebar_position: 59495 --- ### HarperDB 4.5.4 + 4/11/2025 -* Fix for replication of (non-retained) published messages -* Make cookie domain be configurable to allow for cookies shared across sub-hostnames -* Fix for on-demand loading of shared blobs \ No newline at end of file +- Fix for replication of (non-retained) published messages +- Make cookie domain be configurable to allow for cookies shared across sub-hostnames +- Fix for on-demand loading of shared blobs diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.5.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.5.md index 9baf3300..606f8063 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.5.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.5.md @@ -4,7 +4,8 @@ sidebar_position: 59494 --- ### HarperDB 4.5.5 + 4/15/2025 -* Updates for better messaging with symlinks in Windows -* Fix for saving replicated blobs \ No newline at end of file +- Updates for better messaging with symlinks in Windows +- Fix for saving replicated blobs diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.6.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.6.md index b4d304e8..a711a988 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.6.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.6.md @@ -4,8 +4,9 @@ sidebar_position: 59493 --- ### HarperDB 4.5.6 + 4/17/2025 -* Fix for changing the type of the primary key attribute -* Added a new `includeExpensiveRecordCountEstimates` property to the REST component for returning record count estimates -* Fix for dropping attributes \ No newline at end of file +- Fix for changing the type of the primary key attribute +- Added a new `includeExpensiveRecordCountEstimates` property to the REST component for returning record count estimates +- Fix for dropping attributes diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.7.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.7.md index 011ab48e..ce785506 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.7.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.7.md @@ -4,7 +4,8 @@ sidebar_position: 59492 --- ### HarperDB 4.5.7 + 4/23/2025 -* Fix for handling buffers from replicated sharded blob records to prevent overwriting while using -* Updated included studio version for fix for logging in \ No newline at end of file +- Fix for handling buffers from replicated sharded blob records to prevent overwriting while using +- Updated included studio version for fix for logging in diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.8.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.8.md index b6cabf4e..32f43190 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.8.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.8.md @@ -4,9 +4,10 @@ sidebar_position: 59491 --- ### HarperDB 4.5.8 + 4/30/2025 -* Fix MQTT subscription topics with trailing slashes to ensure they are not treated as a wildcard -* Fix the arguments that are used for the default connect/subscribe calls so they pass the second argument from connect like `connect(incomingMessages, query) -> subscribe(query)` -* Add support for replication connections using any configured certificate authorities to verify the server certificates -* Added more descriptive error messages on errors in user residency functions \ No newline at end of file +- Fix MQTT subscription topics with trailing slashes to ensure they are not treated as a wildcard +- Fix the arguments that are used for the default connect/subscribe calls so they pass the second argument from connect like `connect(incomingMessages, query) -> subscribe(query)` +- Add support for replication connections using any configured certificate authorities to verify the server certificates +- Added more descriptive error messages on errors in user residency functions diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.9.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.9.md index a4741506..9d6d13ef 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.9.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/4.5.9.md @@ -4,6 +4,7 @@ sidebar_position: 59490 --- ### HarperDB 4.5.9 + 5/14/2025 -* Remove --no-bin-links directive for NPM that was causing installs of dependencies to fail \ No newline at end of file +- Remove --no-bin-links directive for NPM that was causing installs of dependencies to fail diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/_category_.json b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/_category_.json index 9a7bca50..d20b2f9a 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/_category_.json +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Tucker (Version 4)", - "position": -4 -} \ No newline at end of file + "label": "HarperDB Tucker (Version 4)", + "position": -4 +} diff --git a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/index.md b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/index.md index 7d10beac..266c2e45 100644 --- a/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/index.md +++ b/site/versioned_docs/version-4.5/technical-details/release-notes/v4-tucker/index.md @@ -7,38 +7,39 @@ title: Harper Tucker (Version 4) HarperDB version 4 ([Tucker release](./tucker)) represents major step forward in database technology. This release line has ground-breaking architectural advancements including: ## [4.5](./4.5.0) -* Blob Storage - 4.5 introduces a new [Blob storage system](../../reference/blob). -* Password Hashing Upgrade - two new password hashing algorithms for better security (to replace md5). -* New resource and storage Analytics + +- Blob Storage - 4.5 introduces a new [Blob storage system](../../reference/blob). +- Password Hashing Upgrade - two new password hashing algorithms for better security (to replace md5). +- New resource and storage Analytics ## [4.4](./4.4.0) -* Native replication (codename "Plexus") which is faster, more efficient, secure, and reliable than the previous replication system and provides provisional sharding capabilities with a foundation for the future -* Computed properties that allow applications to define properties that are computed from other properties, allowing for composite properties that are calculated from other data stored in records without requiring actual storage of the computed value -* Custom indexing including composite, full-text indexing, and vector indexing +- Native replication (codename "Plexus") which is faster, more efficient, secure, and reliable than the previous replication system and provides provisional sharding capabilities with a foundation for the future +- Computed properties that allow applications to define properties that are computed from other properties, allowing for composite properties that are calculated from other data stored in records without requiring actual storage of the computed value +- Custom indexing including composite, full-text indexing, and vector indexing ## [4.3](./4.3.0) -* Relationships, joins, and broad new querying capabilities for complex and nested conditions, sorting, joining, and selecting with significant query optimizations -* More advanced transaction support for CRDTs and storage of large integers (with BigInt) -* Better management with new upgraded local studio and new CLI features +- Relationships, joins, and broad new querying capabilities for complex and nested conditions, sorting, joining, and selecting with significant query optimizations +- More advanced transaction support for CRDTs and storage of large integers (with BigInt) +- Better management with new upgraded local studio and new CLI features ## [4.2](./4.2.0) -* New component architecture and Resource API for advanced, robust custom database application development -* Real-time capabilites through MQTT, WebSockets, and Server-Sent Events -* REST interface for intuitive, fast, and standards-compliant HTTP interaction -* Native caching capabilities for high-performance cache scenarios -* Clone node functionality +- New component architecture and Resource API for advanced, robust custom database application development +- Real-time capabilites through MQTT, WebSockets, and Server-Sent Events +- REST interface for intuitive, fast, and standards-compliant HTTP interaction +- Native caching capabilities for high-performance cache scenarios +- Clone node functionality ## [4.1](./4.1.0) -* New streaming iterators mechanism that allows query results to be delivered to clients _while_ querying results are being processed, for incredibly fast time-to-first-byte and concurrent processing/delivery -* New thread-based concurrency model for more efficient resource usage +- New streaming iterators mechanism that allows query results to be delivered to clients _while_ querying results are being processed, for incredibly fast time-to-first-byte and concurrent processing/delivery +- New thread-based concurrency model for more efficient resource usage ## [4.0](./4.0.0) -* New clustering technology that delivers robust, resilient and high-performance replication -* Major storage improvements with highly-efficient adaptive-structure modified MessagePack format, with on-demand deserialization capabilities +- New clustering technology that delivers robust, resilient and high-performance replication +- Major storage improvements with highly-efficient adaptive-structure modified MessagePack format, with on-demand deserialization capabilities Did you know our release names are dedicated to employee pups? For our fourth release, [meet Tucker!](./tucker) diff --git a/site/versioned_docs/version-4.6/administration/_category_.json b/site/versioned_docs/version-4.6/administration/_category_.json index 828e0998..59c33ea4 100644 --- a/site/versioned_docs/version-4.6/administration/_category_.json +++ b/site/versioned_docs/version-4.6/administration/_category_.json @@ -1,12 +1,10 @@ { - "label": "Administration", - "position": 2, - "link": { - "type": "generated-index", - "title": "Administration Documentation", - "description": "Guides for managing and administering HarperDB instances", - "keywords": [ - "administration" - ] - } -} \ No newline at end of file + "label": "Administration", + "position": 2, + "link": { + "type": "generated-index", + "title": "Administration Documentation", + "description": "Guides for managing and administering HarperDB instances", + "keywords": ["administration"] + } +} diff --git a/site/versioned_docs/version-4.6/administration/harper-studio/instances.md b/site/versioned_docs/version-4.6/administration/harper-studio/instances.md index 06ee6c9d..f17acb70 100644 --- a/site/versioned_docs/version-4.6/administration/harper-studio/instances.md +++ b/site/versioned_docs/version-4.6/administration/harper-studio/instances.md @@ -40,11 +40,11 @@ A summary view of all instances within an organization can be viewed by clicking 1. Select Instance Specs 1. Select Instance RAM - _Harper Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance._ _More on instance specs__._ + _Harper Cloud Instances are billed based on Instance RAM, this will select the size of your provisioned instance._ _More on instance specs\_\_._ 1. Select Storage Size - _Each instance has a mounted storage volume where your Harper data will reside. Storage is provisioned based on space and IOPS._ _More on IOPS Impact on Performance__._ + _Each instance has a mounted storage volume where your Harper data will reside. Storage is provisioned based on space and IOPS._ _More on IOPS Impact on Performance\_\_._ 1. Select Instance Region diff --git a/site/versioned_docs/version-4.6/deployments/_category_.json b/site/versioned_docs/version-4.6/deployments/_category_.json index 8fdd6e17..95644c6b 100644 --- a/site/versioned_docs/version-4.6/deployments/_category_.json +++ b/site/versioned_docs/version-4.6/deployments/_category_.json @@ -1,12 +1,10 @@ { - "label": "Deployments", - "position": 3, - "link": { - "type": "generated-index", - "title": "Deployments Documentation", - "description": "Installation and deployment guides for HarperDB", - "keywords": [ - "deployments" - ] - } -} \ No newline at end of file + "label": "Deployments", + "position": 3, + "link": { + "type": "generated-index", + "title": "Deployments Documentation", + "description": "Installation and deployment guides for HarperDB", + "keywords": ["deployments"] + } +} diff --git a/site/versioned_docs/version-4.6/deployments/configuration.md b/site/versioned_docs/version-4.6/deployments/configuration.md index d6b0dd86..40510320 100644 --- a/site/versioned_docs/version-4.6/deployments/configuration.md +++ b/site/versioned_docs/version-4.6/deployments/configuration.md @@ -557,9 +557,9 @@ To access the audit logs, use the API operation `read_audit_log`. It will provid ```json { - "operation": "read_audit_log", - "schema": "dev", - "table": "dog" + "operation": "read_audit_log", + "schema": "dev", + "table": "dog" } ``` @@ -702,7 +702,7 @@ This section defines log configuration for HTTP logging. By default, HTTP reques - `timing` - This will log timing information - `headers` - This will log the headers in each request (which can be very verbose) - `id` - This will assign a unique id to each request and log it in the entry for each request. This is assigned as the `request.requestId` property and can be used to by other logging to track a request. -Note that the `level` will determine which HTTP requests are logged: + Note that the `level` will determine which HTTP requests are logged: - `info` (or more verbose) - All HTTP requests - `warn` - HTTP requests with a status code of 400 or above - `error` - HTTP requests with a status code of 500 @@ -711,10 +711,10 @@ For example: ```yaml http: - logging: + logging: timing: true level: info - path: ~/hdb/log/http.log + path: ~/hdb/log/http.log ... rest of http config ``` @@ -746,7 +746,7 @@ This section defines log configuration for setting up and reading the database f This section defines log configuration for analytics. This takes the standard logging configuration options of `path` (or `root`), `level`, `tag`, and flag to enable/disable logging to `stdStreams`. -*** +--- ### `authentication` diff --git a/site/versioned_docs/version-4.6/deployments/harper-cloud/alarms.md b/site/versioned_docs/version-4.6/deployments/harper-cloud/alarms.md index 8b695c37..372807e5 100644 --- a/site/versioned_docs/version-4.6/deployments/harper-cloud/alarms.md +++ b/site/versioned_docs/version-4.6/deployments/harper-cloud/alarms.md @@ -13,8 +13,8 @@ Harper Cloud instance alarms are triggered when certain conditions are met. Once - **Intervals**: The number of occurrences before an alarm is triggered and the period that the metric is evaluated over. - **Proposed Remedy**: Recommended solution to avoid the alert in the future. -| Alarm | Threshold | Intervals | Proposed Remedy | -| ------- | ---------- | --------- | ------------------------------------------------------------------------------------------------------------------------------ | +| Alarm | Threshold | Intervals | Proposed Remedy | +| ------- | ---------- | --------- | --------------------------------------------------------------------------------------------------------------------------- | | Storage | > 90% Disk | 1 x 5min | [Increased storage volume](../../administration/harper-studio/instance-configuration#update-instance-storage) | | CPU | > 90% Avg | 2 x 5min | [Increase instance size for additional CPUs](../../administration/harper-studio/instance-configuration#update-instance-ram) | | Memory | > 90% RAM | 2 x 5min | [Increase instance size](../../administration/harper-studio/instance-configuration#update-instance-ram) | diff --git a/site/versioned_docs/version-4.6/deployments/upgrade-hdb-instance.md b/site/versioned_docs/version-4.6/deployments/upgrade-hdb-instance.md index 15ebcf7a..768b9323 100644 --- a/site/versioned_docs/version-4.6/deployments/upgrade-hdb-instance.md +++ b/site/versioned_docs/version-4.6/deployments/upgrade-hdb-instance.md @@ -12,11 +12,11 @@ Upgrading Harper is a two-step process. First the latest version of Harper must 1. Install the latest version of Harper using `npm install -g harperdb`. - Note `-g` should only be used if you installed Harper globally (which is recommended). + Note `-g` should only be used if you installed Harper globally (which is recommended). 1. Run `harperdb` to initiate the upgrade process. - Harper will then prompt you for all appropriate inputs and then run the upgrade directives. + Harper will then prompt you for all appropriate inputs and then run the upgrade directives. ## Node Version Manager (nvm) @@ -130,7 +130,7 @@ replication: { "operation": "add_node", "hostname:": "node-1", - "url": "wss://my-cluster-node-1:9925" + "url": "wss://my-cluster-node-1:9925" } ``` diff --git a/site/versioned_docs/version-4.6/developers/_category_.json b/site/versioned_docs/version-4.6/developers/_category_.json index 9fe399bf..fdc723e5 100644 --- a/site/versioned_docs/version-4.6/developers/_category_.json +++ b/site/versioned_docs/version-4.6/developers/_category_.json @@ -1,12 +1,10 @@ { - "label": "Developers", - "position": 1, - "link": { - "type": "generated-index", - "title": "Developers Documentation", - "description": "Comprehensive guides and references for building applications with HarperDB", - "keywords": [ - "developers" - ] - } -} \ No newline at end of file + "label": "Developers", + "position": 1, + "link": { + "type": "generated-index", + "title": "Developers Documentation", + "description": "Comprehensive guides and references for building applications with HarperDB", + "keywords": ["developers"] + } +} diff --git a/site/versioned_docs/version-4.6/developers/applications/caching.md b/site/versioned_docs/version-4.6/developers/applications/caching.md index b1c57fc5..29fec826 100644 --- a/site/versioned_docs/version-4.6/developers/applications/caching.md +++ b/site/versioned_docs/version-4.6/developers/applications/caching.md @@ -33,8 +33,8 @@ Next, you need to define the source for your cache. External data sources could ```javascript class ThirdPartyAPI extends Resource { async get() { - return (await fetch(`https://some-api.com/${this.getId()}`)).json(); - } + return (await fetch(`https://some-api.com/${this.getId()}`)).json(); + } } ``` @@ -69,11 +69,11 @@ In the example above, we simply retrieved data to fulfill a cache request. We ma ```javascript class ThirdPartyAPI extends Resource { - async get() { - let response = await fetch(`https://some-api.com/${this.getId()}`); - this.getContext().lastModified = response.headers.get('Last-Modified'); - return response.json(); - } + async get() { + let response = await fetch(`https://some-api.com/${this.getId()}`); + this.getContext().lastModified = response.headers.get('Last-Modified'); + return response.json(); + } } ``` @@ -109,11 +109,11 @@ One way to provide more active caching is to specifically invalidate individual ```javascript const { MyTable } = tables; export class MyTableEndpoint extends MyTable { - async post(data) { - if (data.invalidate) - // use this flag as a marker - this.invalidate(); - } + async post(data) { + if (data.invalidate) + // use this flag as a marker + this.invalidate(); + } } ``` @@ -176,13 +176,13 @@ An alternative to using asynchronous generators is to use a subscription stream ```javascript class ThirdPartyAPI extends Resource { - subscribe() { - const subscription = super.subscribe(); - setupListeningToRemoteService().on('update', (event) => { - subscription.send(event); - }); - return subscription; - } + subscribe() { + const subscription = super.subscribe(); + setupListeningToRemoteService().on('update', (event) => { + subscription.send(event); + }); + return subscription; + } } ``` @@ -218,12 +218,12 @@ When you are using a caching table, it is important to remember that any resourc ```javascript class MyCache extends tables.MyCache { - async post(data) { - // if the data is not cached locally, retrieves from source: - await this.ensuredLoaded(); - // now we can be sure that the data is loaded, and can access properties - this.quantity = this.quantity - data.purchases; - } + async post(data) { + // if the data is not cached locally, retrieves from source: + await this.ensuredLoaded(); + // now we can be sure that the data is loaded, and can access properties + this.quantity = this.quantity - data.purchases; + } } ``` diff --git a/site/versioned_docs/version-4.6/developers/applications/data-loader.md b/site/versioned_docs/version-4.6/developers/applications/data-loader.md index 488b7b19..9aed9546 100644 --- a/site/versioned_docs/version-4.6/developers/applications/data-loader.md +++ b/site/versioned_docs/version-4.6/developers/applications/data-loader.md @@ -27,22 +27,22 @@ Create a data file in your component's data directory (one table per file): ```json { - "database": "myapp", - "table": "users", - "records": [ - { - "id": 1, - "username": "admin", - "email": "admin@example.com", - "role": "administrator" - }, - { - "id": 2, - "username": "user1", - "email": "user1@example.com", - "role": "standard" - } - ] + "database": "myapp", + "table": "users", + "records": [ + { + "id": 1, + "username": "admin", + "email": "admin@example.com", + "role": "administrator" + }, + { + "id": 2, + "username": "user1", + "email": "user1@example.com", + "role": "standard" + } + ] } ``` @@ -51,21 +51,23 @@ Create a data file in your component's data directory (one table per file): To load data into multiple tables, create separate data files for each table: **users.json:** + ```json { - "database": "myapp", - "table": "users", - "records": [ - { - "id": 1, - "username": "admin", - "email": "admin@example.com" - } - ] + "database": "myapp", + "table": "users", + "records": [ + { + "id": 1, + "username": "admin", + "email": "admin@example.com" + } + ] } ``` **settings.yaml:** + ```yaml database: myapp table: settings @@ -75,7 +77,7 @@ records: setting_value: My Application - id: 2 setting_name: version - setting_value: "1.0.0" + setting_value: '1.0.0' ``` ## File Organization @@ -83,21 +85,24 @@ records: You can organize your data files in various ways: ### Single File Pattern + ```yaml dataLoader: files: 'data/seed-data.json' ``` ### Multiple Files Pattern + ```yaml dataLoader: - files: + files: - 'data/users.json' - 'data/settings.yaml' - 'data/initial-products.json' ``` ### Glob Pattern + ```yaml dataLoader: files: 'data/**/*.{json,yaml,yml}' @@ -173,4 +178,4 @@ rest: true - [Built-In Components](../../technical-details/reference/components/built-in-extensions) - [Extensions](../../technical-details/reference/components/extensions) -- [Bulk Operations](../operations-api/bulk-operations) - For loading data via the Operations API \ No newline at end of file +- [Bulk Operations](../operations-api/bulk-operations) - For loading data via the Operations API diff --git a/site/versioned_docs/version-4.6/developers/applications/index.md b/site/versioned_docs/version-4.6/developers/applications/index.md index c82072a0..5d65225e 100644 --- a/site/versioned_docs/version-4.6/developers/applications/index.md +++ b/site/versioned_docs/version-4.6/developers/applications/index.md @@ -202,7 +202,7 @@ const { Breed } = tables; // our Breed table class BreedSource extends Resource { // define a data source async get(target) { - return (await fetch(`https://best-dog-site.com/${target}`)).json(); + return (await fetch(`https://best-dog-site.com/${target}`)).json(); } } // define that our breed table is a cache of data from the data source above, with a specified expiration diff --git a/site/versioned_docs/version-4.6/developers/operations-api/advanced-json-sql-examples.md b/site/versioned_docs/version-4.6/developers/operations-api/advanced-json-sql-examples.md index 9613d0fb..ec300e2e 100644 --- a/site/versioned_docs/version-4.6/developers/operations-api/advanced-json-sql-examples.md +++ b/site/versioned_docs/version-4.6/developers/operations-api/advanced-json-sql-examples.md @@ -90,7 +90,7 @@ Inserts data from a hosted CSV file into the "movie" table using the 'csv_url_lo "operation": "csv_url_load", "database": "movies", "table": "movie", - "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/movie.csv" + "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/movie.csv" } ``` @@ -98,7 +98,7 @@ Inserts data from a hosted CSV file into the "movie" table using the 'csv_url_lo ```json { - "message": "Starting job with id 1889eee4-23c1-4945-9bb7-c805fc20726c" + "message": "Starting job with id 1889eee4-23c1-4945-9bb7-c805fc20726c" } ``` @@ -112,10 +112,10 @@ Inserts data from a hosted CSV file into the "credits" table using the 'csv_url_ ```json { - "operation": "csv_url_load", - "database": "movies", - "table": "credits", - "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/credits.csv" + "operation": "csv_url_load", + "database": "movies", + "table": "credits", + "csv_url": "https://search-json-sample-data.s3.us-east-2.amazonaws.com/credits.csv" } ``` diff --git a/site/versioned_docs/version-4.6/developers/operations-api/analytics.md b/site/versioned_docs/version-4.6/developers/operations-api/analytics.md index 548a2ed5..9d43c9ee 100644 --- a/site/versioned_docs/version-4.6/developers/operations-api/analytics.md +++ b/site/versioned_docs/version-4.6/developers/operations-api/analytics.md @@ -5,31 +5,32 @@ title: Analytics Operations # Analytics Operations ## get_analytics + Retrieves analytics data from the server. -* operation _(required)_ - must always be `get_analytics` -* metric _(required)_ - any value returned by `list_metrics` -* start_time _(optional)_ - Unix timestamp in seconds -* end_time _(optional)_ - Unix timestamp in seconds -* get_attributes _(optional)_ - array of attribute names to retrieve -* conditions _(optional)_ - array of conditions to filter results (see [search_by_conditions docs](./nosql-operations) for details) +- operation _(required)_ - must always be `get_analytics` +- metric _(required)_ - any value returned by `list_metrics` +- start*time *(optional)\_ - Unix timestamp in seconds +- end*time *(optional)\_ - Unix timestamp in seconds +- get*attributes *(optional)\_ - array of attribute names to retrieve +- conditions _(optional)_ - array of conditions to filter results (see [search_by_conditions docs](./nosql-operations) for details) ### Body ```json { - "operation": "get_analytics", - "metric": "resource-usage", - "start_time": 1609459200, - "end_time": 1609545600, - "get_attributes": ["id", "metric", "userCPUTime", "systemCPUTime"], - "conditions": [ - { - "attribute": "node", - "operator": "equals", - "value": "node1.example.com" - } - ] + "operation": "get_analytics", + "metric": "resource-usage", + "start_time": 1609459200, + "end_time": 1609545600, + "get_attributes": ["id", "metric", "userCPUTime", "systemCPUTime"], + "conditions": [ + { + "attribute": "node", + "operator": "equals", + "value": "node1.example.com" + } + ] } ``` @@ -37,61 +38,56 @@ Retrieves analytics data from the server. ```json [ - { - "id": "12345", - "metric": "resource-usage", - "userCPUTime": 100, - "systemCPUTime": 50 - }, - { - "id": "67890", - "metric": "resource-usage", - "userCPUTime": 150, - "systemCPUTime": 75 - } + { + "id": "12345", + "metric": "resource-usage", + "userCPUTime": 100, + "systemCPUTime": 50 + }, + { + "id": "67890", + "metric": "resource-usage", + "userCPUTime": 150, + "systemCPUTime": 75 + } ] ``` ## list_metrics + Returns a list of available metrics that can be queried. -* operation _(required)_ - must always be `list_metrics` -* metric_types _(optional)_ - array of metric types to filter results; one or both of `custom` and `builtin`; default is `builtin` +- operation _(required)_ - must always be `list_metrics` +- metric*types *(optional)\_ - array of metric types to filter results; one or both of `custom` and `builtin`; default is `builtin` ### Body ```json { - "operation": "list_metrics", - "metric_types": ["custom", "builtin"] + "operation": "list_metrics", + "metric_types": ["custom", "builtin"] } ``` ### Response 200 ```json -[ - "resource-usage", - "table-size", - "database-size", - "main-thread-utilization", - "utilization", - "storage-volume" -] +["resource-usage", "table-size", "database-size", "main-thread-utilization", "utilization", "storage-volume"] ``` ## describe_metric + Provides detailed information about a specific metric, including its structure and available parameters. -* operation _(required)_ - must always be `describe_metric` -* metric _(required)_ - name of the metric to describe +- operation _(required)_ - must always be `describe_metric` +- metric _(required)_ - name of the metric to describe ### Body ```json { - "operation": "describe_metric", - "metric": "resource-usage" + "operation": "describe_metric", + "metric": "resource-usage" } ``` @@ -99,27 +95,27 @@ Provides detailed information about a specific metric, including its structure a ```json { - "attributes": [ - { - "name": "id", - "type": "number" - }, - { - "name": "metric", - "type": "string" - }, - { - "name": "userCPUTime", - "type": "number" - }, - { - "name": "systemCPUTime", - "type": "number" - }, - { - "name": "node", - "type": "string" - } - ] + "attributes": [ + { + "name": "id", + "type": "number" + }, + { + "name": "metric", + "type": "string" + }, + { + "name": "userCPUTime", + "type": "number" + }, + { + "name": "systemCPUTime", + "type": "number" + }, + { + "name": "node", + "type": "string" + } + ] } ``` diff --git a/site/versioned_docs/version-4.6/developers/operations-api/bulk-operations.md b/site/versioned_docs/version-4.6/developers/operations-api/bulk-operations.md index 95a962f6..2e7d7f45 100644 --- a/site/versioned_docs/version-4.6/developers/operations-api/bulk-operations.md +++ b/site/versioned_docs/version-4.6/developers/operations-api/bulk-operations.md @@ -56,7 +56,7 @@ Ingests CSV data, provided directly in the operation as an `insert`, `update` or "database": "dev", "action": "insert", "table": "breed", - "data": "id,name,section,country,image\n1,ENGLISH POINTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/001g07.jpg\n2,ENGLISH SETTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/002g07.jpg\n3,KERRY BLUE TERRIER,Large and medium sized Terriers,IRELAND,\n" + "data": "id,name,section,country,image\n1,ENGLISH POINTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/001g07.jpg\n2,ENGLISH SETTER,British and Irish Pointers and Setters,GREAT BRITAIN,https://www.fci.be/Nomenclature/Illustrations/002g07.jpg\n3,KERRY BLUE TERRIER,Large and medium sized Terriers,IRELAND,\n" } ``` @@ -124,7 +124,7 @@ Ingests CSV data, provided via URL, as an `insert`, `update` or `upsert` into th "action": "insert", "database": "dev", "table": "breed", - "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" + "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" } ``` diff --git a/site/versioned_docs/version-4.6/developers/operations-api/clustering.md b/site/versioned_docs/version-4.6/developers/operations-api/clustering.md index 42160862..5533d1af 100644 --- a/site/versioned_docs/version-4.6/developers/operations-api/clustering.md +++ b/site/versioned_docs/version-4.6/developers/operations-api/clustering.md @@ -16,7 +16,7 @@ _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `add_node` - hostname or url _(required)_ - one of these fields is required. You must provide either the `hostname` or the `url` of the node you want to add -- verify_tls _(optional)_ - a boolean which determines if the TLS certificate should be verified. This will allow the Harper default self-signed certificates to be accepted. Defaults to `true` +- verify*tls *(optional)\_ - a boolean which determines if the TLS certificate should be verified. This will allow the Harper default self-signed certificates to be accepted. Defaults to `true` - authorization _(optional)_ - an object or a string which contains the authorization information for the node being added. If it is an object, it should contain `username` and `password` fields. If it is a string, it should use HTTP `Authorization` style credentials - retain*authorization *(optional)\_ - a boolean which determines if the authorization credentials should be retained/stored and used everytime a connection is made to this node. If `true`, the authorization will be stored on the node record. Generally this should not be used, as mTLS/certificate based authorization is much more secure and safe, and avoids the need for storing credentials. Defaults to `false`. - revoked*certificates *(optional)\_ - an array of revoked certificates serial numbers. If a certificate is revoked, it will not be accepted for any connections. @@ -260,12 +260,12 @@ _Operation is restricted to super_user roles only_ { "operation": "cluster_set_routes", "routes": [ - "wss://server-two:9925", - { - "hostname": "server-three", - "port": 9930 - } - ] + "wss://server-two:9925", + { + "hostname": "server-three", + "port": 9930 + } + ] } ``` @@ -273,15 +273,15 @@ _Operation is restricted to super_user roles only_ ```json { - "message": "cluster routes successfully set", - "set": [ - "wss://server-two:9925", - { - "hostname": "server-three", - "port": 9930 - } - ], - "skipped": [] + "message": "cluster routes successfully set", + "set": [ + "wss://server-two:9925", + { + "hostname": "server-three", + "port": 9930 + } + ], + "skipped": [] } ``` @@ -299,7 +299,7 @@ _Operation is restricted to super_user roles only_ ```json { - "operation": "cluster_get_routes" + "operation": "cluster_get_routes" } ``` @@ -307,7 +307,7 @@ _Operation is restricted to super_user roles only_ ```json [ - "wss://server-two:9925", + "wss://server-two:9925", { "hostname": "server-three", "port": 9930 diff --git a/site/versioned_docs/version-4.6/developers/operations-api/components.md b/site/versioned_docs/version-4.6/developers/operations-api/components.md index 276c9fb9..fa301fdc 100644 --- a/site/versioned_docs/version-4.6/developers/operations-api/components.md +++ b/site/versioned_docs/version-4.6/developers/operations-api/components.md @@ -81,7 +81,7 @@ _Operation is restricted to super_user roles only_ - payload _(optional)_ - a base64-encoded string representation of the .tar file. Must be a string - restart _(optional)_ - must be either a boolean or the string `rolling`. If set to `rolling`, a rolling restart will be triggered after the component is deployed, meaning that each node in the cluster will be sequentially restarted (waiting for the last restart to start the next). If set to `true`, the restart will not be rolling, all nodes will be restarted in parallel. If `replicated` is `true`, the restart operations will be replicated across the cluster. - replicated _(optional)_ - if true, Harper will replicate the component to all nodes in the cluster. Must be a boolean. -- install_command _(optional)_ - A command to use when installing the component. Must be a string. This can be used to install dependencies with pnpm or yarn, for example, like: `"install_command": "npm install -g pnpm && pnpm install"` +- install*command *(optional)\_ - A command to use when installing the component. Must be a string. This can be used to install dependencies with pnpm or yarn, for example, like: `"install_command": "npm install -g pnpm && pnpm install"` ### Body @@ -120,7 +120,7 @@ _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `package_component` - project _(required)_ - the name of the project you wish to package -- skip_node_modules _(optional)_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean +- skip*node_modules *(optional)\_ - if true, creates option for tar module that will exclude the project's node_modules directory. Must be a boolean ### Body @@ -343,7 +343,7 @@ _Operation is restricted to super_user roles only_ * key _(required)_ - the private key contents. Line breaks must be delimited with * host _(required)_ - the host for the ssh config (see below). Used as part of the `package` url when deploying a component using this key * hostname _(required)_ - the hostname for the ssh config (see below). Used to map `host` to an actual domain (e.g. `github.com`) -* known_hosts _(optional)_ - the public SSH keys of the host your component will be retrieved from. If `hostname` is `github.com` this will be retrieved automatically. Line breaks must be delimited with +* known*hosts *(optional)\_ - the public SSH keys of the host your component will be retrieved from. If `hostname` is `github.com` this will be retrieved automatically. Line breaks must be delimited with * replicated _(optional)_ - if true, Harper will replicate the key to all nodes in the cluster. Must be a boolean. ### Body @@ -482,7 +482,7 @@ Sets the SSH known_hosts file. This will overwrite the file. _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `set_ssh_known_hosts` -- known_hosts _(required)_ - The contents to set the known_hosts to. Line breaks must be delimite d with +- known*hosts *(required)\_ - The contents to set the known_hosts to. Line breaks must be delimite d with - replicated _(optional)_ - if true, Harper will replicate the known hosts to all nodes in the cluster. Must be a boolean. ### Body diff --git a/site/versioned_docs/version-4.6/developers/operations-api/configuration.md b/site/versioned_docs/version-4.6/developers/operations-api/configuration.md index 98686029..99599843 100644 --- a/site/versioned_docs/version-4.6/developers/operations-api/configuration.md +++ b/site/versioned_docs/version-4.6/developers/operations-api/configuration.md @@ -77,7 +77,7 @@ _Operation is restricted to super_user roles only_ "hostname": "node1", "databases": "*", "routes": null, - "url": "wss://127.0.0.1:9925" + "url": "wss://127.0.0.1:9925" }, "componentsRoot": "/Users/hdb/components", "localStudio": { diff --git a/site/versioned_docs/version-4.6/developers/operations-api/index.md b/site/versioned_docs/version-4.6/developers/operations-api/index.md index 3dd43c80..e2a648f0 100644 --- a/site/versioned_docs/version-4.6/developers/operations-api/index.md +++ b/site/versioned_docs/version-4.6/developers/operations-api/index.md @@ -19,24 +19,24 @@ Content-Type: application/json The operations API reference is available below and categorized by topic: -* [Quick Start Examples](./quickstart-examples) -* [Databases and Tables](./databases-and-tables) -* [NoSQL Operations](./nosql-operations) -* [Bulk Operations](./bulk-operations) -* [Users and Roles](./users-and-roles) -* [Clustering](./clustering) -* [Clustering with NATS](./clustering-nats) -* [Components](./components) -* [Registration](./registration) -* [Jobs](./jobs) -* [Logs](./logs) -* [System Operations](./system-operations) -* [Configuration](./configuration) -* [Certificate Management](./certificate-management) -* [Token Authentication](./token-authentication) -* [SQL Operations](./sql-operations) -* [Advanced JSON SQL Examples](./advanced-json-sql-examples) -* [Analytics](./analytics) +- [Quick Start Examples](./quickstart-examples) +- [Databases and Tables](./databases-and-tables) +- [NoSQL Operations](./nosql-operations) +- [Bulk Operations](./bulk-operations) +- [Users and Roles](./users-and-roles) +- [Clustering](./clustering) +- [Clustering with NATS](./clustering-nats) +- [Components](./components) +- [Registration](./registration) +- [Jobs](./jobs) +- [Logs](./logs) +- [System Operations](./system-operations) +- [Configuration](./configuration) +- [Certificate Management](./certificate-management) +- [Token Authentication](./token-authentication) +- [SQL Operations](./sql-operations) +- [Advanced JSON SQL Examples](./advanced-json-sql-examples) +- [Analytics](./analytics) • [Past Release API Documentation](https://olddocs.harperdb.io) diff --git a/site/versioned_docs/version-4.6/developers/operations-api/logs.md b/site/versioned_docs/version-4.6/developers/operations-api/logs.md index 17eba72f..7b173585 100644 --- a/site/versioned_docs/version-4.6/developers/operations-api/logs.md +++ b/site/versioned_docs/version-4.6/developers/operations-api/logs.md @@ -306,8 +306,8 @@ _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `read_audit_log` - schema _(required)_ - schema under which the transaction log resides - table _(required)_ - table under which the transaction log resides -- search_type _(optional)_ - possibilities are `hash_value`, `timestamp` and `username` -- search_values _(optional)_ - an array of string or numbers relating to search_type +- search*type *(optional)\_ - possibilities are `hash_value`, `timestamp` and `username` +- search*values *(optional)\_ - an array of string or numbers relating to search_type ### Body @@ -401,8 +401,8 @@ _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `read_audit_log` - schema _(required)_ - schema under which the transaction log resides - table _(required)_ - table under which the transaction log resides -- search_type _(optional)_ - timestamp -- search_values _(optional)_ - an array containing a maximum of two values \[`from_timestamp`, `to_timestamp`] defining the range of transactions you would like to view. +- search*type *(optional)\_ - timestamp +- search*values *(optional)\_ - an array containing a maximum of two values \[`from_timestamp`, `to_timestamp`] defining the range of transactions you would like to view. - Timestamp format is millisecond-based epoch in UTC - If no items are supplied then all transactions are returned - If only one entry is supplied then all transactions after the supplied timestamp will be returned @@ -522,8 +522,8 @@ _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `read_audit_log` - schema _(required)_ - schema under which the transaction log resides - table _(required)_ - table under which the transaction log resides -- search_type _(optional)_ - username -- search_values _(optional)_ - the Harper user for whom you would like to view transactions +- search*type *(optional)\_ - username +- search*values *(optional)\_ - the Harper user for whom you would like to view transactions ### Body @@ -642,8 +642,8 @@ _Operation is restricted to super_user roles only_ - operation _(required)_ - must always be `read_audit_log` - schema _(required)_ - schema under which the transaction log resides - table _(required)_ - table under which the transaction log resides -- search_type _(optional)_ - hash_value -- search_values _(optional)_ - an array of hash_attributes for which you wish to see transaction logs +- search*type *(optional)\_ - hash_value +- search*values *(optional)\_ - an array of hash_attributes for which you wish to see transaction logs ### Body diff --git a/site/versioned_docs/version-4.6/developers/operations-api/quickstart-examples.md b/site/versioned_docs/version-4.6/developers/operations-api/quickstart-examples.md index 93660289..a6c8f637 100644 --- a/site/versioned_docs/version-4.6/developers/operations-api/quickstart-examples.md +++ b/site/versioned_docs/version-4.6/developers/operations-api/quickstart-examples.md @@ -240,9 +240,9 @@ Each header in a column will be considered as an attribute, and each row in the ```json { - "operation": "csv_url_load", - "table": "breed", - "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" + "operation": "csv_url_load", + "table": "breed", + "csv_url": "https://s3.amazonaws.com/complimentarydata/breeds.csv" } ``` diff --git a/site/versioned_docs/version-4.6/developers/rest.md b/site/versioned_docs/version-4.6/developers/rest.md index 21f976e6..0e52ac8f 100644 --- a/site/versioned_docs/version-4.6/developers/rest.md +++ b/site/versioned_docs/version-4.6/developers/rest.md @@ -81,13 +81,13 @@ Generally the POST method can be used for custom actions since POST has the broa This is handled by the Resource method `post(data)`, which is a good method to extend to make various other types of modifications. Also, with a table you can create a new record without specifying a primary key, for example: -````http +`````http ````http POST /MyTable/ Content-Type: application/json `{ "name": "some data" }` -```` +````` This will create a new record, auto-assigning a primary key, which will be returned in the `Location` header. @@ -402,3 +402,4 @@ Content-Type: image/gif ...image data... ``` +```` diff --git a/site/versioned_docs/version-4.6/developers/security/basic-auth.md b/site/versioned_docs/version-4.6/developers/security/basic-auth.md index 5a04f8ef..96d5d28a 100644 --- a/site/versioned_docs/version-4.6/developers/security/basic-auth.md +++ b/site/versioned_docs/version-4.6/developers/security/basic-auth.md @@ -6,7 +6,7 @@ title: Basic Authentication Harper uses Basic Auth and JSON Web Tokens (JWTs) to secure our HTTP requests. In the context of an HTTP transaction, **basic access authentication** is a method for an HTTP user agent to provide a username and password when making a request. -** _**You do not need to log in separately. Basic Auth is added to each HTTP request like create_database, create_table, insert etc… via headers.**_ ** +** \_**You do not need to log in separately. Basic Auth is added to each HTTP request like create*database, create_table, insert etc… via headers.\*\** \*\* A header is added to each HTTP request. The header key is **“Authorization”** the header value is **“Basic <<your username and password buffer token>>”** diff --git a/site/versioned_docs/version-4.6/developers/sql-guide/json-search.md b/site/versioned_docs/version-4.6/developers/sql-guide/json-search.md index 13bd3b90..507473f3 100644 --- a/site/versioned_docs/version-4.6/developers/sql-guide/json-search.md +++ b/site/versioned_docs/version-4.6/developers/sql-guide/json-search.md @@ -12,7 +12,7 @@ Harper automatically indexes all top level attributes in a row / object written ## Syntax -SEARCH_JSON(_expression, attribute_) +SEARCH*JSON(\_expression, attribute*) Executes the supplied string _expression_ against data of the defined top level _attribute_ for each row. The expression both filters and defines output from the JSON document. diff --git a/site/versioned_docs/version-4.6/technical-details/_category_.json b/site/versioned_docs/version-4.6/technical-details/_category_.json index 69ce80a6..b965ef06 100644 --- a/site/versioned_docs/version-4.6/technical-details/_category_.json +++ b/site/versioned_docs/version-4.6/technical-details/_category_.json @@ -1,12 +1,10 @@ { - "label": "Technical Details", - "position": 4, - "link": { - "type": "generated-index", - "title": "Technical Details Documentation", - "description": "Reference documentation and technical specifications", - "keywords": [ - "technical-details" - ] - } -} \ No newline at end of file + "label": "Technical Details", + "position": 4, + "link": { + "type": "generated-index", + "title": "Technical Details Documentation", + "description": "Reference documentation and technical specifications", + "keywords": ["technical-details"] + } +} diff --git a/site/versioned_docs/version-4.6/technical-details/reference/components/applications.md b/site/versioned_docs/version-4.6/technical-details/reference/components/applications.md index 31daf0e1..0f8a659e 100644 --- a/site/versioned_docs/version-4.6/technical-details/reference/components/applications.md +++ b/site/versioned_docs/version-4.6/technical-details/reference/components/applications.md @@ -166,7 +166,7 @@ Harper will generate a `package.json` like: "myNPMComponent": "npm:harperdb", "myTarBall": "file:/Users/harper/cool-component.tar", "myLocal": "file:/Users/harper/local", - "myWebsite": "https://harperdb-component" + "myWebsite": "https://harperdb-component" } } ``` diff --git a/site/versioned_docs/version-4.6/technical-details/reference/resources/index.md b/site/versioned_docs/version-4.6/technical-details/reference/resources/index.md index 236bd83f..b5985741 100644 --- a/site/versioned_docs/version-4.6/technical-details/reference/resources/index.md +++ b/site/versioned_docs/version-4.6/technical-details/reference/resources/index.md @@ -420,11 +420,11 @@ This will return the number of records in the table. By default, this will retur This is called by static methods when they are responding to a URL (from HTTP request, for example), and translates the path to an id. By default, this will parse `.property` suffixes for accessing properties and specifying preferred content type in the URL (and for older tables it will convert a multi-segment path to multipart an array id). However, in some situations you may wish to preserve the path directly as a string. You can override `parsePath` for simpler path to id preservation: -````javascript +```javascript static parsePath(path) { return path; // return the path as the id } -```` +``` ### `getRecordCount: Promise<{}>` diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v1-alby/_category_.json b/site/versioned_docs/version-4.6/technical-details/release-notes/v1-alby/_category_.json index e33195ec..9eded684 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v1-alby/_category_.json +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v1-alby/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Alby (Version 1)", - "position": -1 -} \ No newline at end of file + "label": "HarperDB Alby (Version 1)", + "position": -1 +} diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v2-penny/_category_.json b/site/versioned_docs/version-4.6/technical-details/release-notes/v2-penny/_category_.json index 285eecf7..28f86bc1 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v2-penny/_category_.json +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v2-penny/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Penny (Version 2)", - "position": -2 -} \ No newline at end of file + "label": "HarperDB Penny (Version 2)", + "position": -2 +} diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v3-monkey/_category_.json b/site/versioned_docs/version-4.6/technical-details/release-notes/v3-monkey/_category_.json index 0103ac36..71bea62a 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v3-monkey/_category_.json +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v3-monkey/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Monkey (Version 3)", - "position": -3 -} \ No newline at end of file + "label": "HarperDB Monkey (Version 3)", + "position": -3 +} diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.11.md b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.11.md index cba2d019..d3f9d8fa 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.11.md +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.11.md @@ -4,7 +4,8 @@ sidebar_position: 59488 --- ### HarperDB 4.5.11 + 6/27/2025 -* Fix bug (workaround Node.js bug) with assigning the ciphers to a server and applying to TLS connections -* Fix for handling TLS array when checking certificates configuration \ No newline at end of file +- Fix bug (workaround Node.js bug) with assigning the ciphers to a server and applying to TLS connections +- Fix for handling TLS array when checking certificates configuration diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.12.md b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.12.md index 6353bfc2..2312329e 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.12.md +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.12.md @@ -4,10 +4,11 @@ sidebar_position: 59487 --- ### HarperDB 4.5.12 + 7/9/2025 - Fix for dynamically setting `harperdb` package symlink on deploy - Assign shard numbers from each node's config rather than from routes - Handle certificates without a common name, falling back to the SANs -- Properly clean up blobs that are only transiently used for replication +- Properly clean up blobs that are only transiently used for replication - Ensure that we always set up server.shards even when there are no TLS connections diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.13.md b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.13.md index 2b8a6149..d4ef7ac7 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.13.md +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.13.md @@ -4,6 +4,7 @@ sidebar_position: 59486 --- ### HarperDB 4.5.13 + 7/12/2025 - Fix cleaning out audit entries when a blob has been removed diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.14.md b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.14.md index 0ad8f235..d50482a6 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.14.md +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.14.md @@ -4,6 +4,7 @@ sidebar_position: 59485 --- ### HarperDB 4.5.14 + 7/15/2025 - Use proper back-pressure when copying a table for initial database sync diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.15.md b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.15.md index 2387680d..8e5b7821 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.15.md +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.15.md @@ -4,6 +4,7 @@ sidebar_position: 59484 --- ### HarperDB 4.5.15 + 7/21/2025 - Removed the `copyTablesToCatchUp` option and instead utilized the clone node designation of the leader node to copy tables diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.16.md b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.16.md index 6874cce9..829cd9d8 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.16.md +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.5.16.md @@ -4,6 +4,7 @@ sidebar_position: 59483 --- ### HarperDB 4.5.16 + 7/30/2025 -- Do not free/remove the shared user buffer that is used by all threads as an atomic counter for ids (for blobs and incremented ids), but retain it as a stable allocated buffer +- Do not free/remove the shared user buffer that is used by all threads as an atomic counter for ids (for blobs and incremented ids), but retain it as a stable allocated buffer diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.0.md b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.0.md index 7614ef03..4311b387 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.0.md +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.0.md @@ -20,12 +20,12 @@ Harper 4.6 now includes support for vector indexing, which allows for efficient ### Logging Improvements 4.6 includes significant expansions to logging configurability, allowing for specific logging configurations of individual components. This also leverages the new extension API to allow for dynamic reloading of logging configuration. With the more granular logging, logs can be directed to different files and/or different log levels. -The logger includes support for HTTP logging, which configurability for logging standard HTTP methods and paths as well headers, ids, and timing information. It also supports distinct logging configuration for different components. +The logger includes support for HTTP logging, which configurability for logging standard HTTP methods and paths as well headers, ids, and timing information. It also supports distinct logging configuration for different components. The new logger is now based on the Node.js Console API, with improved the formatting of log messages for various types of objects. An important change is that logging to standard out/error will _not_ include the timestamp. And console logging does not get logged to the log files by default. - ### Data Loader + 4.6 includes a new [data loader](../../../../developers/applications/data-loader) that can be used to load data into HarperDB as part of a component. The data loader can be used to load data from JSON file and can be deployed and distributed with a component to provide a reliable mechanism for ensuring specific records are loaded into Harper. ### Resource API Upgrades @@ -33,4 +33,5 @@ An important change is that logging to standard out/error will _not_ include the 4.6 includes an upgraded form of the Resource API that can be selected with significant improvements in ease of use. ### only-if-cached behavior -Previously when the `only-in-cached` caching directive was used and the entry was not cached, Harper would return a 504, but still make a request to origin in the background. Now, Harper will no longer a request to origin for `only-if-cached`. \ No newline at end of file + +Previously when the `only-in-cached` caching directive was used and the entry was not cached, Harper would return a 504, but still make a request to origin in the background. Now, Harper will no longer a request to origin for `only-if-cached`. diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.1.md b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.1.md index cf8ccd2c..c073d5a2 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.1.md +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.1.md @@ -4,6 +4,7 @@ sidebar_position: 59398 --- # 4.6.1 + 7/10/2025 - Plugin API updates to use plugin nomenclature diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.2.md b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.2.md index 579f26df..147dad18 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.2.md +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.2.md @@ -4,8 +4,9 @@ sidebar_position: 59397 --- # 4.6.2 + 7/15/2025 - Use proper back-pressure when copying a table for initial database sync - Fix cleaning out audit entries when a blob has been removed -- Fix for running CLI operations when a Harper DB is not installed \ No newline at end of file +- Fix for running CLI operations when a Harper DB is not installed diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.3.md b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.3.md index ea6092aa..e0dce66a 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.3.md +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/4.6.3.md @@ -4,6 +4,7 @@ sidebar_position: 59396 --- # 4.6.3 + 7/30/2025 - Fix for calling table.operation() diff --git a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/_category_.json b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/_category_.json index 9a7bca50..d20b2f9a 100644 --- a/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/_category_.json +++ b/site/versioned_docs/version-4.6/technical-details/release-notes/v4-tucker/_category_.json @@ -1,4 +1,4 @@ { - "label": "HarperDB Tucker (Version 4)", - "position": -4 -} \ No newline at end of file + "label": "HarperDB Tucker (Version 4)", + "position": -4 +} diff --git a/site/versioned_sidebars/version-4.1-sidebars.json b/site/versioned_sidebars/version-4.1-sidebars.json index 1e3daab3..88acbe5c 100644 --- a/site/versioned_sidebars/version-4.1-sidebars.json +++ b/site/versioned_sidebars/version-4.1-sidebars.json @@ -1,169 +1,169 @@ { - "docsSidebar": [ - { - "type": "doc", - "id": "index", - "label": "Developer Documentation" - }, - { - "type": "category", - "label": "Install HarperDB", - "items": [ - { - "type": "autogenerated", - "dirName": "install-harperdb" - } - ] - }, - { - "type": "category", - "label": "Getting Started", - "items": [ - { - "type": "autogenerated", - "dirName": "getting-started" - } - ] - }, - { - "type": "link", - "label": "Full API Documentation", - "href": "https://api.harperdb.io/" - }, - { - "type": "category", - "label": "HarperDB Studio", - "items": [ - { - "type": "autogenerated", - "dirName": "harperdb-studio" - } - ] - }, - { - "type": "category", - "label": "HarperDB Cloud", - "items": [ - { - "type": "autogenerated", - "dirName": "harperdb-cloud" - } - ] - }, - { - "type": "category", - "label": "Security", - "items": [ - { - "type": "autogenerated", - "dirName": "security" - } - ] - }, - { - "type": "category", - "label": "Clustering", - "items": [ - { - "type": "autogenerated", - "dirName": "clustering" - } - ] - }, - { - "type": "category", - "label": "Custom Functions", - "items": [ - { - "type": "autogenerated", - "dirName": "custom-functions" - } - ] - }, - { - "type": "category", - "label": "Add-ons and SDKs", - "items": [ - { - "type": "autogenerated", - "dirName": "add-ons-and-sdks" - } - ] - }, - { - "type": "category", - "label": "SQL Guide", - "items": [ - { - "type": "autogenerated", - "dirName": "sql-guide" - } - ] - }, - "harperdb-cli", - "configuration", - "logging", - "transaction-logging", - "audit-logging", - "jobs", - "upgrade-hdb-instance", - { - "type": "category", - "label": "Reference", - "items": [ - { - "type": "autogenerated", - "dirName": "reference" - } - ] - }, - "support", - { - "type": "category", - "label": "Release Notes", - "items": [ - "release-notes/index", - { - "type": "category", - "label": "HarperDB Tucker (Version 4)", - "items": [ - { - "type": "autogenerated", - "dirName": "release-notes/v4-tucker" - } - ] - }, - { - "type": "category", - "label": "HarperDB Monkey (Version 3)", - "items": [ - { - "type": "autogenerated", - "dirName": "release-notes/v3-monkey" - } - ] - }, - { - "type": "category", - "label": "HarperDB Penny (Version 2)", - "items": [ - { - "type": "autogenerated", - "dirName": "release-notes/v2-penny" - } - ] - }, - { - "type": "category", - "label": "HarperDB Alby (Version 1)", - "items": [ - { - "type": "autogenerated", - "dirName": "release-notes/v1-alby" - } - ] - } - ] - } - ] -} \ No newline at end of file + "docsSidebar": [ + { + "type": "doc", + "id": "index", + "label": "Developer Documentation" + }, + { + "type": "category", + "label": "Install HarperDB", + "items": [ + { + "type": "autogenerated", + "dirName": "install-harperdb" + } + ] + }, + { + "type": "category", + "label": "Getting Started", + "items": [ + { + "type": "autogenerated", + "dirName": "getting-started" + } + ] + }, + { + "type": "link", + "label": "Full API Documentation", + "href": "https://api.harperdb.io/" + }, + { + "type": "category", + "label": "HarperDB Studio", + "items": [ + { + "type": "autogenerated", + "dirName": "harperdb-studio" + } + ] + }, + { + "type": "category", + "label": "HarperDB Cloud", + "items": [ + { + "type": "autogenerated", + "dirName": "harperdb-cloud" + } + ] + }, + { + "type": "category", + "label": "Security", + "items": [ + { + "type": "autogenerated", + "dirName": "security" + } + ] + }, + { + "type": "category", + "label": "Clustering", + "items": [ + { + "type": "autogenerated", + "dirName": "clustering" + } + ] + }, + { + "type": "category", + "label": "Custom Functions", + "items": [ + { + "type": "autogenerated", + "dirName": "custom-functions" + } + ] + }, + { + "type": "category", + "label": "Add-ons and SDKs", + "items": [ + { + "type": "autogenerated", + "dirName": "add-ons-and-sdks" + } + ] + }, + { + "type": "category", + "label": "SQL Guide", + "items": [ + { + "type": "autogenerated", + "dirName": "sql-guide" + } + ] + }, + "harperdb-cli", + "configuration", + "logging", + "transaction-logging", + "audit-logging", + "jobs", + "upgrade-hdb-instance", + { + "type": "category", + "label": "Reference", + "items": [ + { + "type": "autogenerated", + "dirName": "reference" + } + ] + }, + "support", + { + "type": "category", + "label": "Release Notes", + "items": [ + "release-notes/index", + { + "type": "category", + "label": "HarperDB Tucker (Version 4)", + "items": [ + { + "type": "autogenerated", + "dirName": "release-notes/v4-tucker" + } + ] + }, + { + "type": "category", + "label": "HarperDB Monkey (Version 3)", + "items": [ + { + "type": "autogenerated", + "dirName": "release-notes/v3-monkey" + } + ] + }, + { + "type": "category", + "label": "HarperDB Penny (Version 2)", + "items": [ + { + "type": "autogenerated", + "dirName": "release-notes/v2-penny" + } + ] + }, + { + "type": "category", + "label": "HarperDB Alby (Version 1)", + "items": [ + { + "type": "autogenerated", + "dirName": "release-notes/v1-alby" + } + ] + } + ] + } + ] +} diff --git a/site/versioned_sidebars/version-4.2-sidebars.json b/site/versioned_sidebars/version-4.2-sidebars.json index dc492023..33d81913 100644 --- a/site/versioned_sidebars/version-4.2-sidebars.json +++ b/site/versioned_sidebars/version-4.2-sidebars.json @@ -1,50 +1,50 @@ { - "docsSidebar": [ - { - "type": "doc", - "id": "index", - "label": "Harper Docs" - }, - "getting-started", - { - "type": "category", - "label": "Developers", - "items": [ - { - "type": "autogenerated", - "dirName": "developers" - } - ] - }, - { - "type": "category", - "label": "Administration", - "items": [ - { - "type": "autogenerated", - "dirName": "administration" - } - ] - }, - { - "type": "category", - "label": "Deployments", - "items": [ - { - "type": "autogenerated", - "dirName": "deployments" - } - ] - }, - { - "type": "category", - "label": "Technical Details", - "items": [ - { - "type": "autogenerated", - "dirName": "technical-details" - } - ] - } - ] -} \ No newline at end of file + "docsSidebar": [ + { + "type": "doc", + "id": "index", + "label": "Harper Docs" + }, + "getting-started", + { + "type": "category", + "label": "Developers", + "items": [ + { + "type": "autogenerated", + "dirName": "developers" + } + ] + }, + { + "type": "category", + "label": "Administration", + "items": [ + { + "type": "autogenerated", + "dirName": "administration" + } + ] + }, + { + "type": "category", + "label": "Deployments", + "items": [ + { + "type": "autogenerated", + "dirName": "deployments" + } + ] + }, + { + "type": "category", + "label": "Technical Details", + "items": [ + { + "type": "autogenerated", + "dirName": "technical-details" + } + ] + } + ] +} diff --git a/site/versioned_sidebars/version-4.3-sidebars.json b/site/versioned_sidebars/version-4.3-sidebars.json index dc492023..33d81913 100644 --- a/site/versioned_sidebars/version-4.3-sidebars.json +++ b/site/versioned_sidebars/version-4.3-sidebars.json @@ -1,50 +1,50 @@ { - "docsSidebar": [ - { - "type": "doc", - "id": "index", - "label": "Harper Docs" - }, - "getting-started", - { - "type": "category", - "label": "Developers", - "items": [ - { - "type": "autogenerated", - "dirName": "developers" - } - ] - }, - { - "type": "category", - "label": "Administration", - "items": [ - { - "type": "autogenerated", - "dirName": "administration" - } - ] - }, - { - "type": "category", - "label": "Deployments", - "items": [ - { - "type": "autogenerated", - "dirName": "deployments" - } - ] - }, - { - "type": "category", - "label": "Technical Details", - "items": [ - { - "type": "autogenerated", - "dirName": "technical-details" - } - ] - } - ] -} \ No newline at end of file + "docsSidebar": [ + { + "type": "doc", + "id": "index", + "label": "Harper Docs" + }, + "getting-started", + { + "type": "category", + "label": "Developers", + "items": [ + { + "type": "autogenerated", + "dirName": "developers" + } + ] + }, + { + "type": "category", + "label": "Administration", + "items": [ + { + "type": "autogenerated", + "dirName": "administration" + } + ] + }, + { + "type": "category", + "label": "Deployments", + "items": [ + { + "type": "autogenerated", + "dirName": "deployments" + } + ] + }, + { + "type": "category", + "label": "Technical Details", + "items": [ + { + "type": "autogenerated", + "dirName": "technical-details" + } + ] + } + ] +} diff --git a/site/versioned_sidebars/version-4.4-sidebars.json b/site/versioned_sidebars/version-4.4-sidebars.json index dc492023..33d81913 100644 --- a/site/versioned_sidebars/version-4.4-sidebars.json +++ b/site/versioned_sidebars/version-4.4-sidebars.json @@ -1,50 +1,50 @@ { - "docsSidebar": [ - { - "type": "doc", - "id": "index", - "label": "Harper Docs" - }, - "getting-started", - { - "type": "category", - "label": "Developers", - "items": [ - { - "type": "autogenerated", - "dirName": "developers" - } - ] - }, - { - "type": "category", - "label": "Administration", - "items": [ - { - "type": "autogenerated", - "dirName": "administration" - } - ] - }, - { - "type": "category", - "label": "Deployments", - "items": [ - { - "type": "autogenerated", - "dirName": "deployments" - } - ] - }, - { - "type": "category", - "label": "Technical Details", - "items": [ - { - "type": "autogenerated", - "dirName": "technical-details" - } - ] - } - ] -} \ No newline at end of file + "docsSidebar": [ + { + "type": "doc", + "id": "index", + "label": "Harper Docs" + }, + "getting-started", + { + "type": "category", + "label": "Developers", + "items": [ + { + "type": "autogenerated", + "dirName": "developers" + } + ] + }, + { + "type": "category", + "label": "Administration", + "items": [ + { + "type": "autogenerated", + "dirName": "administration" + } + ] + }, + { + "type": "category", + "label": "Deployments", + "items": [ + { + "type": "autogenerated", + "dirName": "deployments" + } + ] + }, + { + "type": "category", + "label": "Technical Details", + "items": [ + { + "type": "autogenerated", + "dirName": "technical-details" + } + ] + } + ] +} diff --git a/site/versioned_sidebars/version-4.5-sidebars.json b/site/versioned_sidebars/version-4.5-sidebars.json index 87f86c81..2811a133 100644 --- a/site/versioned_sidebars/version-4.5-sidebars.json +++ b/site/versioned_sidebars/version-4.5-sidebars.json @@ -1,59 +1,59 @@ { - "docsSidebar": [ - { - "type": "doc", - "id": "index", - "label": "Harper Docs" - }, - { - "type": "category", - "label": "Getting Started", - "items": [ - { - "type": "autogenerated", - "dirName": "getting-started" - } - ] - }, - { - "type": "category", - "label": "Developers", - "items": [ - { - "type": "autogenerated", - "dirName": "developers" - } - ] - }, - { - "type": "category", - "label": "Administration", - "items": [ - { - "type": "autogenerated", - "dirName": "administration" - } - ] - }, - { - "type": "category", - "label": "Deployments", - "items": [ - { - "type": "autogenerated", - "dirName": "deployments" - } - ] - }, - { - "type": "category", - "label": "Technical Details", - "items": [ - { - "type": "autogenerated", - "dirName": "technical-details" - } - ] - } - ] -} \ No newline at end of file + "docsSidebar": [ + { + "type": "doc", + "id": "index", + "label": "Harper Docs" + }, + { + "type": "category", + "label": "Getting Started", + "items": [ + { + "type": "autogenerated", + "dirName": "getting-started" + } + ] + }, + { + "type": "category", + "label": "Developers", + "items": [ + { + "type": "autogenerated", + "dirName": "developers" + } + ] + }, + { + "type": "category", + "label": "Administration", + "items": [ + { + "type": "autogenerated", + "dirName": "administration" + } + ] + }, + { + "type": "category", + "label": "Deployments", + "items": [ + { + "type": "autogenerated", + "dirName": "deployments" + } + ] + }, + { + "type": "category", + "label": "Technical Details", + "items": [ + { + "type": "autogenerated", + "dirName": "technical-details" + } + ] + } + ] +} diff --git a/site/versioned_sidebars/version-4.6-sidebars.json b/site/versioned_sidebars/version-4.6-sidebars.json index 87f86c81..2811a133 100644 --- a/site/versioned_sidebars/version-4.6-sidebars.json +++ b/site/versioned_sidebars/version-4.6-sidebars.json @@ -1,59 +1,59 @@ { - "docsSidebar": [ - { - "type": "doc", - "id": "index", - "label": "Harper Docs" - }, - { - "type": "category", - "label": "Getting Started", - "items": [ - { - "type": "autogenerated", - "dirName": "getting-started" - } - ] - }, - { - "type": "category", - "label": "Developers", - "items": [ - { - "type": "autogenerated", - "dirName": "developers" - } - ] - }, - { - "type": "category", - "label": "Administration", - "items": [ - { - "type": "autogenerated", - "dirName": "administration" - } - ] - }, - { - "type": "category", - "label": "Deployments", - "items": [ - { - "type": "autogenerated", - "dirName": "deployments" - } - ] - }, - { - "type": "category", - "label": "Technical Details", - "items": [ - { - "type": "autogenerated", - "dirName": "technical-details" - } - ] - } - ] -} \ No newline at end of file + "docsSidebar": [ + { + "type": "doc", + "id": "index", + "label": "Harper Docs" + }, + { + "type": "category", + "label": "Getting Started", + "items": [ + { + "type": "autogenerated", + "dirName": "getting-started" + } + ] + }, + { + "type": "category", + "label": "Developers", + "items": [ + { + "type": "autogenerated", + "dirName": "developers" + } + ] + }, + { + "type": "category", + "label": "Administration", + "items": [ + { + "type": "autogenerated", + "dirName": "administration" + } + ] + }, + { + "type": "category", + "label": "Deployments", + "items": [ + { + "type": "autogenerated", + "dirName": "deployments" + } + ] + }, + { + "type": "category", + "label": "Technical Details", + "items": [ + { + "type": "autogenerated", + "dirName": "technical-details" + } + ] + } + ] +} diff --git a/site/versions.json b/site/versions.json index 9e930d7d..740d5077 100644 --- a/site/versions.json +++ b/site/versions.json @@ -1,8 +1 @@ -[ - "4.6", - "4.5", - "4.4", - "4.3", - "4.2", - "4.1" -] \ No newline at end of file +["4.6", "4.5", "4.4", "4.3", "4.2", "4.1"]