diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cb7a3eb
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,93 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Build/Runtime
+build/
+deploy/
+dev/
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Test/Coverage
+lib-cov
+coverage
+*.lcov
+.nyc_output
+mocha.js
+mocha.js.map
+
+# Grunt/Bower
+.grunt
+bower_components
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional stylelint cache
+.stylelintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variable files
+.env
+.env.*
+!.env.example
+
+# cache directories
+.cache
+.cache/
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v3
+.pnp.*
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/releases
+!.yarn/sdks
+!.yarn/versions
+
+# macOS
+.DS_Store
+.AppleDouble
+.apdisk
+
+# Windows
+Thumbs.db
+ehthumbs.db
+*.lnk
+
+# IDEs
+.vscode/
+.idea/
+*.sublime-project
+*.sublime-workspace
\ No newline at end of file
diff --git a/README.md b/README.md
index ef06c12..318356f 100644
--- a/README.md
+++ b/README.md
@@ -1,46 +1,914 @@
-# starter-microservice
----
+# Starter-Microservice
This is a starter microservice that allows you to start developing an edge microservice.
# How to use it?
----
-#### If this is your first time developing an edge microservice, please follow the [developer documentation quick start guide](https://devdocs.mimik.com/tutorials/01-submenu).
+If this is your first time developing an edge microservice, please follow the [developer documentation quick start guide](https://devdocs.mimik.com/tutorials/01-submenu).
-#### Before you use it, you must build the microservice and later deploy it to mim OE.
+Before you use it, you must build the microservice and later deploy it to mim OE.
# Build Process
----
-The build script **default.yml** is specified under **config** directory.
+As this microservice is a nodejs application, we need to first run `npm install` to install the dependencies. In the next stage, we build and package the microservice. And this requires the setup in **default.yml** file, which is in the **config** directory. You can build, and then package the microservice using the following.
+
+1. npm run build
+2. npm run package
+
+The setup in **default.yml** contains a special property _outputFolder_. It is very important for two reasons.
-1. Install dependencies: ```npm install```
-2. Run the build script: ```npm run build```
-3. Package to container: ```npm run package```
+- During the Build Process: When package step is being executed, the path/folder indicated by _outputFolder_ is where the microservice gets saved as tar
+
+- During the Deploy Process: While deploying the microservice, the path/folder with tar is used in the http request to send it as form data to mim OE
+
+> **Note** If your deploy folder is located in a parent path, then you would need to update the _outputFolder_ to **../deploy**, otherwise it can cause development errors.
# Deployment
----
+
+Following section describes details on deploying the (packaged) microservice on mim OE - for mobile (app) environment, and desktop (cli) environment.
+
+## Mobile-App
For **mobile application development**, deployment is programmatically by **Android or iOS Client Libraries**, learn more about it:
- Android: [Link](https://devdocs.mimik.com/key-concepts/11-index)
- iOS: [Link](https://devdocs.mimik.com/key-concepts/10-index) [github](https://github.com/mimikgit/cocoapod-EdgeCore?tab=readme-ov-file#mimik-client-library-cocoapods)
+## Desktop-Cli
+
For **microservice development**, things you will need:
-- mim OE running on the deployment targeted device.
-- Obtained edge Access Token and associated the device from **[mimik-edge-cli](https://www.npmjs.com/package/@mimik/mimik-edge-cli)** that is installed:```npm install -g @mimik/mimik-edge-cli```. For more information, go [here](https://devdocs.mimik.com/api/01-index).
-- Run the following commands under the same directory of your containerized microservice file:
+| Step | Description |
+| ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| 1. | Ensure **mim OE** is running on the target deployment device. |
+| 2. | Obtain an **Edge Access Token** and associate the device using [`mimik-edge-cli`](https://www.npmjs.com/package/@mimik/mimik-edge-cli)
`npm install -g @mimik/mimik-edge-cli` (more info on [Mimik API Docs](https://devdocs.mimik.com/api/01-index)). |
+| 3. | In the same directory as your containerized microservice file, run
`http -i -H 'Authorization: Bearer ' -F "image=@.tar" http://:8083/mcm/v1/images`
to upload the microservice image to the target device. |
+| 4. | To run the microservice after deployment, use
`http -i -H 'Authorization: Bearer ' -d '{ "name": , "image": , "env": { "MCM.BASE_API_PATH": "", "MCM.WEBSOCKET_SUPPORT": "true", "": "" } }' http://:8083/mcm/v1/containers`, which starts the container with specified environment variables. |
+
+> **Note** For more information and explanation, you can visit our [command line tool reference](https://devdocs.mimik.com/api/01-index) and [general guide on packaging, deployment, and exporting microservice](https://devdocs.mimik.com/key-concepts/02-index).
+
+# API Endpoints
+
+Following sections describe various api endpoints added to the starter-microservice example, with some overview information in sections 1, 2 and 3.
+
+## 1. Overview: Promise-Centric Architecture
+
+Every route handler wraps its logic in a promise chain, starting with `Promise.resolve(...)`. This ensures a uniform async interface—even for synchronous code—so you can:
+
+- Chain further `.then(...)` calls without nesting callbacks.
+- Handle all errors in a single `.catch(...)` block.
+- Return or end the response in the last step of your chain.
+
+This style decouples control flow from callback hell and centralizes error handling.
+
+## 2. Overview: API Response
+
+At a basic level, each api is constructed using a callback, as seen in the following code. The callback receives a request and a response object. To return the response, use the `end` method of the response object.
+
+```js
+app.get('/', (req, res) => {
+ res.end('Hello World!')
+})
+```
+
+> **Note** Irrespective of the data returned, the default response header has `application/json` as its `content-type`. To override this default behavior, the response header can be directly added before the call to the `end` method.
+
+
+
+**Figure 1:** Default Response
+
+We can also modify the response header `content-type`. Please examine the following code taken from the sample code which returns html directly in the response. In this case it is important to set the associated `content-type` for html, otherwise the html will not render correctly in the browser.
+
+```js
+app.get('/raw-html', (req, res) => {
+ res.setHeader('content-type', 'text/html')
+ res.end('raw html response')
+})
+```
+
+> **Note** The above response has very basic html usage. If there is a special scenario to return more html in response, it is better to `b64` encode your html file, and return in response. Please read the html sample codes for more details (for example, see the `/html` route for this, and related preview-figure in readme images). The goal of this sample is to focus on microservice endpoints and not html.
+
+## 3. Overview: Storage Use Case and Functionality
+
+Following sections describe the storage api from a use-case and a functionality perspective.
+
+### Storage - Saving Data
+
+The basic unit of data that gets stored is a string.
+
+- Everything gets stored as a string.
+- If data is a complex object, store it as a stringified json.
+- Storing any other type, say number, gives error `key or value are not type string`.
+
+### Storage - Unique/Tagged Group
+
+When you persist a storage record, say a _server configuration_, you choose between:
+- **Unique data**
+
+ - One record per key.
+ - Methods: `setItem(key, value)` and `removeItem(key)`.
+ - Ideal for unique data such as single server config (`appId`).
+
+- **Non-unique data (tagged group)**
+ - Multiple records under the same tag.
+ - Methods:
+ - `setItemWithTag(tag, value, key)` stores `value` with a secondary `key`.
+ - `removeItemsByTag(tag)` deletes all items sharing the `tag`.
+ - Perfect for grouping several server configs under one logical set (`name`).
+
+| Method | Scope | Use Case |
+| --------------------------------------- | -------------- | ---------------------------------------- |
+| `storage.setItem(key, val)` | Unique per key | Save single server or admin config |
+| `storage.removeItem(key)` | Unique per key | Delete one config |
+| `storage.setItemWithTag(key, val, tag)` | Tagged group | Save multiple server configs under a tag |
+| `storage.removeItemsByTag(tag)` | Tagged group | Bulk-delete configs by tag |
+| `storage.eachItem(cb)` | All | Bulk-read all configs (with/without tag) |
+| `storage.eachItemByTag(tag, cb)` | Tagged group | Bulk-read configs by tag |
+
+For reading this data in a simple manner, consider the following.
+
+- To read all the data in storage, we can use `storage.eachItem` function.
+- To read all the data in storage _belonging to a specific tag_, we can use `storage.eachItemByTag` function.
+- The `cb` param in `eachItem` and `eachItemByTag` denotes callback function.
+- Next, please understand the following sample code.
+
+```js
+// sample code to read all the data (with/without tag)
+app.get(
+ '/sample/read/all/data',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const { storage } = context
+ const result = {}
+ storage.eachItem((k, v) => {
+ result[k] = v
+ })
+ res.end(JSON.stringify({ result }))
+ }) // ... error handling
+)
+```
+
+### Storage - Pagination
+
+When you need to access json records in a paginated manner, it can be done using `getJsonItemsPaginated` method from the storage api. It has the following parameters. The `options` parameter is actually used to select relevant records from the database. Using the pagination parameters (_offset_, _limit_) a subset of records is selected.
+
+- **offset**: number of records to skip
+- **limit**: count of number of records to fetch
+- **callback**: receives items (as stringified json) and total number of records
+- **options**: filtering options, say to filter by tag, properties, and also order/group records
+
+In particular, the `offset` and `limit` parameters are most useful to paginate the records. The sample code provides an api to read very simple records, which are inserted for a test scenario (you can create them too, using `/config/server/multiple` and `/config/admin` endpoints). As seen in the following figure, when a `curl` request is made to the endpoint (which uses `getJsonItemsPaginated`), only items that are json representable are returned in the response.
+
+
+
+**Figure 2:** Reading Json Records
+
+> **Note** This method _only reads records that are json representable_ (i.e. have json format). It _does not separately return the key_ of the record in the stringified json output. This method is important for _reading indexed records_ where the index/key itself is unique.
+
+### Storage - Encryption
+
+In its default mode, database is _unencrypted_ meaning it can be viewed if anyone has access to the `.db` database file. However, the database is stored within the container, so it needs to be accessed from the folder where mimOE runtime is getting executed, otherwise it is not possible to read it. The encryption can be enabled while starting the container (as seen in the following code). Encryption is necessary when database is being used to store sensitive details. This, combined with an authentication token architecture, can enhance the security of the database, and the application.
+
+```http
+POST http://localhost:8083/mcm/v1/containers
+// Content-Type (header) is optional
+Content-Type: application/json
+Authorization: Bearer {{edgeToken}}
+
+{
+ "name": "microservice-v1",
+ "image": "microservice-v1",
+ "env": {
+ "MCM.BASE_API_PATH": "/microservice/v1",
+ // API_ALIAS (env) is optional
+ "MCM.API_ALIAS": "true",
+ // WEBSOCKET_SUPPORT (env) is optional
+ "MCM.WEBSOCKET_SUPPORT": "true",
+ // DB_ENCRYPTION_SUPPORT (env) is required for encryption
+ "MCM.DB_ENCRYPTION_SUPPORT": "true"
+ }
+}
```
-curl -i -H 'Authorization: Bearer ' -F "image=@.tar" http://:8083/mcm/v1/images
+
+
+
+**Figure 3:** Viewing Database Directly
+
+The left part in the above figure shows what happens when we try to view an encrypted database file directly. If the database file is unencrypted, we can see all of its contents.
+
+## 4. Routes
+
+Following sections go into details of these api endpoints. These include base samples, followed by use-cases to store unique data by key or tagged group data.
+
+### A. Base Samples
+
+These base samples are the building blocks to later create more advanced routes.
+
+---
+
+#### a. `GET /promise`
+
+Basic sample endpoint to show promise usage.
+
+1. Immediately resolves with a static object `{ name: 'Alice', age: 30 }`.
+2. On success: `res.end()` with JSON payload.
+3. On error: `res.end()` with `{ error: err.message }`.
+
+```js
+app.get('/promise', (req, res) =>
+ Promise.resolve({ name: 'Alice', age: 30 })
+ .then(data => res.end(JSON.stringify(data)))
+ .catch(err => res.end(JSON.stringify({ error: err.message })))
+)
```
-- To run the microservice after successful deployment, with environment variables:
+---
+#### b. `GET /external/:domain`
+
+Sample endpoint demonstrating use of `Promise`, external API calls, and filtering based on dynamic route parameters.
+
+1. Resolves with a context object via `Promise.resolve(global.context)`.
+2. Makes an HTTP GET request to an external endpoint `https://jsonplaceholder.typicode.com/users`.
+3. Filters the list of users whose website domain name matches `:domain` parameter in the route.
+4. Creates appropriate response for success and error scenarios.
+
+```js
+app.get(
+ '/external/:domain',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const externalApiEndpoint = 'https://jsonplaceholder.typicode.com/users'
+ const filterDomainName = req.params.domain
+ context.http.request({
+ type: 'GET',
+ url: externalApiEndpoint,
+ success: result => {
+ const { data } = result
+ const usersList = JSON.parse(data)
+ const users = usersList.filter(x => {
+ const domainName = x.website.split('.')[1]
+ return domainName === filterDomainName
+ })
+ res.end(JSON.stringify({ success: true, externalApiEndpoint, users }))
+ },
+ error: err => {
+ res.end(JSON.stringify({ error: err.message || err }))
+ }
+ })
+ }) // ... error handling
+)
```
-curl -i -H 'Authorization: Bearer ' -d '{"name": , "image": , "env": {"MCM.BASE_API_PATH": "", "MCM.WEBSOCKET_SUPPORT": "true", "": ""} }' http://:8083/mcm/v1/containers
+
+### B. Config Server Single
+
+Sample use-case to demonstrate storing unique data by key. For e.g. storing one configuration per `appId`.
+
+---
+
+#### a. `POST /config/server/single`
+
+Sample endpoint demonstrating post request handling to store unique data by `appId`.
+
+1. Wrap `global.context` in a promise.
+2. Extract `storage` from context.
+3. Parse `req.body` for `appId`, `name`, `address`, `port`, `enableSSL`.
+4. Build `configWithName = { name, address, port, enableSSL }`.
+5. Store uniquely: `storage.setItem(appId, JSON.stringify(configWithName))`.
+6. Respond with `{ saved: true }`.
+7. Errors bubble to the `.catch(...)`, returning `{ saved: false, error }`.
+
+```js
+app.post(
+ '/config/server/single',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const { storage } = context
+ const { appId, name, address, port, enableSSL } = JSON.parse(req.body)
+ const configWithName = { name, address, port, enableSSL }
+ storage.setItem(appId, JSON.stringify(configWithName))
+ res.end(JSON.stringify({ saved: true }))
+ }) // ... error handling
+)
+```
+
+---
+
+#### b. `DELETE /config/server/single/:appId`
+
+Sample endpoint demonstrating deletion of unique data by `appId`.
+
+1. Resolve context and grab `storage`.
+2. Read `appId` from `req.params`.
+3. If missing, end with `{ deleted: false }`.
+4. Otherwise, call `storage.removeItem(appId)` and return `{ deleted: true }`.
+5. Errors yield `{ deleted: false, error }`.
+
+```js
+app.delete(
+ '/config/server/single/:appId',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const { storage } = context
+ const appId = req.params.appId
+ if (!appId) {
+ return res.end(JSON.stringify({ deleted: false }))
+ }
+ storage.removeItem(appId)
+ res.end(JSON.stringify({ deleted: true }))
+ }) // ... error handling
+)
+```
+
+### C. Config Server Multiple
+
+Sample use-case to demonstrate storing multiple records under a tagged-group. For e.g. grouping many server configs under one `appId` tag.
+
+---
+
+#### a. `POST /config/server/multiple`
+
+Sample endpoint to store multiple records, representing multiple server configs within an `appId`.
+
+1. Resolve context, extract `storage`.
+2. Parse `appId`, `name`, `address`, `port`, `enableSSL` from `req.body`.
+3. Build `config = { address, port, enableSSL }`.
+4. Store under a tag using `storage.setItemWithTag(name, JSON.stringify(config), appId)`.
+5. Return `{ saved: true }` or `{ saved: false, error }`.
+
+```js
+app.post(
+ '/config/server/multiple',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const { storage } = context
+ const { appId, name, address, port, enableSSL } = JSON.parse(req.body)
+ const config = { address, port, enableSSL }
+ storage.setItemWithTag(name, JSON.stringify(config), appId)
+ res.end(JSON.stringify({ saved: true }))
+ }) // ... error handling
+)
+```
+
+---
+
+#### b. `DELETE /config/server/multiple/key/:key`
+
+Sample endpoint demonstrating deletion of a server config by its unique `key`.
+
+1. Retrieves the contextual environment to access persistent storage.
+2. Calls `storage.removeItem(req.params.key)` to delete the config value tied to the specified key in the path parameter.
+3. Creates appropriate response for success and error scenarios.
+
+```js
+app.delete(
+ '/config/server/multiple/key/:key',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const { storage } = context
+ storage.removeItem(req.params.key)
+ res.end(JSON.stringify({ deleted: true }))
+ }) // ... error handling
+)
+```
+
+---
+
+#### c. `DELETE /config/server/multiple/tag/:tag`
+
+Endpoint for removing multiple server configurations associated with a specific tag.
+
+1. Resolves the global execution context to retrieve the `storage` mechanism used for managing config data.
+2. Executes `storage.removeItemsByTag(req.params.tag)` to delete every config entry that shares the specified tag, allowing bulk deletion.
+3. Creates appropriate response for success and error scenarios.
+
+```js
+app.delete(
+ '/config/server/multiple/tag/:tag',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const { storage } = context
+ storage.removeItemsByTag(req.params.tag)
+ res.end(JSON.stringify({ deleted: true }))
+ }) // ... error handling
+)
+```
+
+### D. Handling JSON Records
+
+To simplify reading of JSON records, use the `getJsonItemsPaginated` method from the storage api. Following sections give detailed information for routes `/some/test/get-json-items` and `/some/test/get-json-items/filter/:networkPrefix`, which make use of this api.
+
+---
+
+#### a. `GET /some/test/get-json-items`
+
+Endpoint for retrieving a paginated subset of JSON items from the configuration storage.
+
+1. Asynchronously retrieves the global execution context to access the configured `storage` mechanism.
+2. Invokes `storage.getJsonItemsPaginated(start, limit, callback)` with parameters `(0, 10)` to fetch the first ten JSON items.
+3. On success responds with the JSON array of items. The default `Content-Type` header is automatically set to `application/json`.
+
+```js
+app.get(
+ '/some/test/get-json-items',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const { storage } = context
+ let result = ''
+ storage.getJsonItemsPaginated(0, 10, (items, total) => {
+ result = items
+ })
+ res.end(result)
+ }) // ... error handling
+)
+```
+
+---
+
+#### b. `GET /some/test/get-json-items/filter/:networkPrefix`
+
+Endpoint for retrieving a paginated set of JSON items filtered by a given network prefix.
+
+1. Asynchronously obtains the global context to access the `storage` service for configuration data.
+2. **Filtering Logic**:
+ - Extracts `networkPrefix` from the URL parameter.
+ - Constructs a filter object targeting the `address` field using a JSONPath expression and the `LIKE` comparison operator.
+ - Applies the filter to retrieve items where the address begins with the provided network prefix (e.g., `10.0.%`).
+3. Executes `storage.getJsonItemsPaginated(0, 10, callback, filter)` to retrieve the first ten matching items.
+4. On success responds with the JSON array of items. The default `Content-Type` header is automatically set to `application/json`.
+
+```js
+app.get(
+ '/some/test/get-json-items/filter/:networkPrefix',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const { storage } = context
+ const networkPrefix = req.params.networkPrefix
+ const filter = {
+ tag: '',
+ filters: [
+ {
+ jsonPath: '$.address',
+ comparisonOperator: 'LIKE',
+ value: `${networkPrefix}.%`
+ }
+ ]
+ }
+ let result = ''
+ storage.getJsonItemsPaginated(
+ 0,
+ 10,
+ (items, total) => {
+ result = items
+ },
+ filter
+ )
+ res.end(result)
+ }) // ... error handling
+)
+```
+
+
+
+**Figure 4:** Fetching Json Items
+
+### E. Sample Data
+
+Following are some endpoints to test sample data which is generated using `transactions.json` file under `src/dataset` folder.
+
+---
+
+#### a. `POST /storage/use-case/transactions/setup`
+
+Endpoint to setup dataset by storing multiple transaction records under a tagged-group.
+
+1. Retrieve `context` and access `storage`.
+2. Parse `copies` value from request body.
+3. Clear previous items tagged `'transactions'`.
+4. For each transaction item in `data`, store multiple copies with a unique ID and tag.
+5. Respond with success or error status.
+
+```js
+app.post(
+ '/storage/use-case/transactions/setup',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const tag = 'transactions'
+ const { storage } = context
+ const { copies } = JSON.parse(req.body)
+ try {
+ storage.removeItemsByTag(tag)
+ // ... code to iterate over sample data then create copies of records
+ res.end(JSON.stringify({ saved: true }))
+ } catch (err) {
+ res.end(JSON.stringify({ saved: false, error: err.message || err }))
+ }
+ }) // ... error handling
+)
+```
+
+---
+
+#### b. `GET /storage/use-case/transactions/category/:categoryName/gpu/:onBoardGPU`
+
+Retrieves filtered transaction records by _product category_ and _onboard GPU_ presence.
+
+1. Extracts `categoryName` and `onBoardGPU` from request parameters.
+2. Checks if `categoryName` exists in the `categories` mapping.
+3. Iterates over stored items tagged `'transactions'`.
+4. Filters for items matching the given product category and onboard GPU flag.
+5. Returns matched records or error status.
+
+```js
+app.get(
+ '/storage/use-case/transactions/category/:categoryName/gpu/:onBoardGPU',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const tag = 'transactions'
+ const { storage } = context
+ try {
+ const categoryName = req.params.categoryName
+ const onBoardGPU = req.params.onBoardGPU === 'true'
+ const keys = Object.keys(categories)
+ const result = []
+ const products = categories[categoryName]
+ storage.eachItemByTag(tag, (k, v) => {
+ const record = JSON.parse(v)
+ // ... code to save matching records
+ })
+ res.end(JSON.stringify({ success: true, result }))
+ } catch (err) {
+ res.end(JSON.stringify({ saved: false, error: err.message || err }))
+ }
+ }) // ... error handling
+)
+```
+
+---
+
+#### c. `GET /storage/use-case/transactions/page/simple-filter`
+
+Retrieves paginated transaction records with basic filtering and sorting.
+
+1. Extracts pagination and sorting parameters from query string.
+2. Applies a filter to include records with non-null emails.
+3. Orders results based on timestamp using the specified direction.
+4. Retrieves items in chunks with count and offset.
+5. Returns paginated results and the applied filter configuration.
+
+```js
+app.get(
+ '/storage/use-case/transactions/page/simple-filter',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const { storage } = context
+ // ... code to fetch query parameters and initialize result object
+ const filter = {
+ filters: [
+ {
+ jsonPath: '$.email',
+ comparisonOperator: 'IS NOT NULL',
+ value: 0
+ }
+ ],
+ groupBy: [],
+ orderBy: [
+ {
+ jsonPath: '$.timestamp',
+ order: sortingOrder
+ }
+ ]
+ }
+
+ storage.getJsonItemsPaginated(
+ skip,
+ count,
+ (items, total) => {
+ result.items = JSON.parse(items)
+ result.count = total
+ },
+ filter
+ )
+ res.end(JSON.stringify({ data: result, filter }))
+ }) // ... error handling
+)
+```
+
+---
+
+#### d. `GET /storage/use-case/transactions/page/advanced-filter`
+
+Retrieves paginated transaction records using advanced filters and grouping.
+
+1. Parses pagination and sorting options from query parameters.
+2. Applies multiple filters to ensure only meaningful, higher-priced records are included.
+3. Groups results by product name and orders them by timestamp.
+4. Returns paginated and grouped results with the filter configuration.
+
+```js
+app.get(
+ '/storage/use-case/transactions/page/advanced-filter',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const { storage } = context
+ // ... code to fetch query parameters and initialize result object
+ const filter = {
+ filters: [
+ {
+ jsonPath: '$.email',
+ comparisonOperator: 'IS NOT NULL',
+ value: 0
+ },
+ {
+ jsonPath: '$.price',
+ comparisonOperator: '>=',
+ value: 390
+ }
+ ],
+ groupBy: ['$.product'],
+ orderBy: [
+ {
+ jsonPath: '$.timestamp',
+ order: sortingOrder
+ }
+ ]
+ }
+
+ storage.getJsonItemsPaginated(
+ skip,
+ count,
+ (items, total) => {
+ result.items = JSON.parse(items)
+ result.count = total
+ },
+ filter
+ )
+
+ res.end(JSON.stringify({ data: result, filter }))
+ }) // ... error handling
+)
+```
+
+### F. Config Admin
+
+Manages a single admin credential per `email`.
+
+---
+
+#### a. `POST /config/admin`
+
+Sample endpoint to save admin credential using `email` as the key. Please also read the following note.
+
+1. Resolve context and get `storage`.
+2. Parse `email` and `password` from `req.body`.
+3. If either is missing, respond `{ saved: false }`.
+4. Otherwise, store uniquely: `storage.setItem(email, password)`.
+5. Return `{ saved: true }` or error.
+
+```js
+app.post(
+ '/config/admin',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const { storage } = context
+ const { email, password } = JSON.parse(req.body)
+ if (!email || !password) {
+ return res.end(JSON.stringify({ saved: false }))
+ }
+ storage.setItem(email, password)
+ res.end(JSON.stringify({ saved: true }))
+ }) // ... error handling
+)
+```
+
+> **Note** If the microservice is to be used for storing sensitive data, then please start the container using `DB_ENCRYPTION_SUPPORT` option as `true`. This is explained in the section titled `Storage - Encryption`.
+
+---
+
+#### b. `DELETE /config/admin/:email`
+
+Following endpoint deletes a unique admin record using `email` as the key.
+
+1. Resolve context, extract `storage`.
+2. Read `email` from `req.params`.
+3. If missing, return `{ deleted: false }`.
+4. Else, `storage.removeItem(email)` and `{ deleted: true }`.
+5. Errors map to `{ deleted: false, error }`.
+
+```js
+app.delete(
+ '/config/admin/:email',
+ (req, res) =>
+ Promise.resolve(global.context).then(context => {
+ const { storage } = context
+ const email = req.params.email
+ if (!email) {
+ return res.end(JSON.stringify({ deleted: false }))
+ }
+ storage.removeItem(email)
+ res.end(JSON.stringify({ deleted: true }))
+ }) // ... error handling
+)
+```
+
+## 5. Curl Testing
+
+For the above api endpoints, the following section includes equivalent `curl` requests. These requests are written in a format compatible with [REST Client](https://marketplace.visualstudio.com/items/?itemName=humao.rest-client) extension.
+
+---
+
+#### getPromise
+
+```http
+GET http://localhost:8083/api/microservice/v1/promise
+```
+
+---
+
+#### testExternalDomain(domain)
+
+```http
+@domain="info"
+
+GET http://localhost:8083/api/microservice/v1/external/{{domain}}
+```
+
+---
+
+#### readSingleServerConfig(key)
+
+```http
+@key="PrimaryServer"
+
+GET http://localhost:8083/api/microservice/v1/config/server/single/{{key}}
+```
+
+---
+
+#### readMultipleServerConfig(appId)
+
+```http
+@appId="app1234"
+
+GET http://localhost:8083/api/microservice/v1/config/server/multiple/{{appId}}
+```
+
+---
+
+#### readAllStorage
+
+```http
+GET http://localhost:8083/api/microservice/v1/storage/all
+```
+
+---
+
+#### getJsonItems
+
+```http
+GET http://localhost:8083/api/microservice/v1/some/test/get-json-items
+```
+
+---
+
+#### getJsonItemsFilter(networkPrefix)
+
+```http
+GET http://localhost:8083/api/microservice/v1/some/test/get-json-items/filter/{{networkPrefix}}
+```
+
+---
+
+#### postSingleServerConfig(appId)
+
+```http
+@appId="app1234"
+
+POST http://localhost:8083/api/microservice/v1/config/server/single
+Content-Type: application/json
+
+{
+ "appId": "{{appId}}",
+ "name": "MainServer",
+ "address": "192.168.1.100",
+ "port": 8080,
+ "enableSSL": true
+}
+```
+
+---
+
+#### deleteSingleServerConfig(appId)
+
+```http
+@appId="app1234"
+
+DELETE http://localhost:8083/api/microservice/v1/config/server/single/{{appId}}
+```
+
+---
+
+#### postMultipleServerConfig(appId, name, address)
+
+```http
+@appId="app1234"
+@name="MainServer"
+@address="192.168.1.100"
+
+POST http://localhost:8083/api/microservice/v1/config/server/multiple
+Content-Type: application/json
+
+{
+ "appId": "{{appId}}", // this can be fixed for the example
+ "name": "{{name}}", // this can be changed for the example
+ "address": "{{address}}",
+ "port": 8083,
+ "enableSSL": true
+}
+```
+
+---
+
+#### deleteMultipleServerConfigByKey(key)
+
+```http
+@key="PrimaryServer"
+
+DELETE http://localhost:8083/api/microservice/v1/config/server/multiple/key/{{key}}
+```
+
+---
+
+#### deleteMultipleServerConfigByTag(tag)
+
+```http
+@tag="app1234"
+
+DELETE http://localhost:8083/api/microservice/v1/config/server/multiple/tag/{{tag}}
+```
+
+---
+
+#### setupTransactions(copies)
+
+```http
+@copies=2
+
+POST http://localhost:8083/api/microservice/v1/storage/use-case/transactions/setup
+Content-Type: application/json
+
+{ "copies": {{copies}} }
+```
+
+---
+
+#### readPageUsingSimpleFilter
+
+```http
+GET http://localhost:8083/api/microservice/v1/storage/use-case/transactions/page/simple-filter?skip=0&count=20&increasing=1
+```
+
+---
+
+#### readPageUsingAdvancedFilter
+
+```http
+GET http://localhost:8083/api/microservice/v1/storage/use-case/transactions/page/advanced-filter?skip=0&count=20&increasing=1
+```
+
+---
+
+#### findTransactionsByDetails(categoryName, onBoardGPU)
+
+```http
+@categoryName="SmartHome-LifestyleGadgets"
+@onBoardGPU="true"
+
+GET http://localhost:8083/api/microservice/v1/storage/use-case/transactions/category/{{categoryName}}/gpu/{{onBoardGPU}}
+```
+
+---
+
+#### postAdminConfig
+
+```http
+POST http://localhost:8083/api/microservice/v1/config/admin
+Content-Type: application/json
+
+{ "email": "admin@example.com", "password": "securepassword123" }
+```
+
+> **Note** In a real-world testing scenario, you can use `curl`, and can generate unique data for tokens, password, etc. from bash using `password=$(openssl rand -hex 16 | openssl dgst -md5 | awk '{print $2}')`. Here, password is a variable which can be used in `curl` requests.
+
+---
+
+#### deleteAdminConfig(email)
+
+```http
+@email="admin@example.com"
+
+DELETE http://localhost:8083/api/microservice/v1/config/admin/{{email}}
```
-- For more information and explanation, you can visit our [command line tool reference](https://devdocs.mimik.com/api/01-index) and [general guide on packaging, deployment, and exporting microservice](https://devdocs.mimik.com/key-concepts/02-index).
+> **Note** The above `curl` requests can be saved to a `.http` file, and can be executed say on Visual Studio Code using the [REST Client](https://marketplace.visualstudio.com/items/?itemName=humao.rest-client) extension.
diff --git a/config/default.yml b/config/default.yml
index 5efe289..0ed1c4b 100644
--- a/config/default.yml
+++ b/config/default.yml
@@ -1,5 +1,5 @@
package:
imageName: microservice
imageIndexFilePath: ./build/index.js
- outputFolder: ./build
+ outputFolder: ./deploy
\ No newline at end of file
diff --git a/deploy/build_tar_here b/deploy/build_tar_here
new file mode 100644
index 0000000..e69de29
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 0000000..76921da
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,56 @@
+const js = require('@eslint/js');
+const globals = require('globals');
+
+module.exports = [
+ js.configs.recommended,
+ {
+ files: ['**/*.js'],
+ languageOptions: {
+ globals: {
+ ...globals.node,
+ mimikModule: true,
+ globalThis: true,
+ Duktape: true
+ }
+ },
+ rules: {
+ 'arrow-spacing': ['error', { before: true, after: true }],
+ 'block-spacing': ['error', 'always'],
+ 'comma-spacing': ['error', { before: false, after: true }],
+ "semi-spacing": ["error", { "before": false, "after": true }],
+ "no-multi-spaces": ["error", {
+ exceptions: {
+ Property: false,
+ BinaryExpression: false,
+ VariableDeclarator: false
+ }
+ }],
+ 'consistent-return': 'error',
+ 'curly': ['error', 'multi-line'],
+ 'eol-last': ['error', 'always'],
+ 'eqeqeq': ['error', 'always'],
+ 'func-call-spacing': ['error', 'never'],
+ 'indent': ['error', 2, { SwitchCase: 1 }],
+ 'key-spacing': ['error', { beforeColon: false, afterColon: true }],
+ 'keyword-spacing': ['error', { before: true, after: true }],
+ 'max-len': ['error', { code: 180 }],
+ 'linebreak-style': 'off',
+ 'no-warning-comments': 'off',
+ 'no-console': 'off',
+ 'no-underscore-dangle': 'off',
+ 'no-unused-vars': [
+ 'warn',
+ { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }
+ ],
+ 'no-use-before-define': ['error', { functions: false, classes: true }],
+ 'object-curly-spacing': ['error', 'always'],
+ 'prefer-const': 'error',
+ 'quotes': ['error', 'single', { allowTemplateLiterals: true }],
+ 'semi': ['error', 'always'],
+ 'space-before-blocks': ['error', 'always'],
+ 'space-before-function-paren': ['error', 'never'],
+ 'space-in-parens': ['error', 'never'],
+ 'spaced-comment': ['error', 'always', { markers: ['/'] }]
+ }
+ }
+];
diff --git a/package-lock.json b/package-lock.json
index 29368d4..cdbb073 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,17 +1,15 @@
{
"name": "microservice",
- "version": "1.0.3",
+ "version": "1.0.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "microservice",
- "version": "1.0.3",
+ "version": "1.0.4",
"license": "ISC",
"dependencies": {
"parseurl": "1.3.3",
- "q": "^1.5.1",
- "query-string": "4.3.4",
"router": "1.3.3",
"url": "^0.11.0"
},
@@ -20,10 +18,10 @@
"@babel/preset-env": "7.20.2",
"@mimik/edge-ms-packager": "1.1.5",
"@mimik/swagger-mw-codegen": "1.4.6",
- "babel-eslint": "10.1.0",
"babel-loader": "9.1.0",
- "eslint-config-airbnb-base": "15.0.0",
- "eslint-loader": "4.0.2",
+ "core-js": "^3.36.1",
+ "eslint": "^9.31.0",
+ "eslint-webpack-plugin": "^5.0.2",
"terser-webpack-plugin": "5.3.6",
"webpack": "^5.87.0",
"webpack-cli": "4.10.0"
@@ -1645,64 +1643,326 @@
"node": ">=10.0.0"
}
},
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
+ "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
+ "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.6",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz",
+ "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
+ "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
"node_modules/@eslint/eslintrc": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
- "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
"dev": true,
- "peer": true,
"dependencies": {
"ajv": "^6.12.4",
- "debug": "^4.1.1",
- "espree": "^7.3.0",
- "globals": "^13.9.0",
- "ignore": "^4.0.6",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
"import-fresh": "^3.2.1",
- "js-yaml": "^3.13.1",
- "minimatch": "^3.0.4",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
"strip-json-comments": "^3.1.1"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
+ "node_modules/@eslint/eslintrc/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==",
+ "dev": true
+ },
"node_modules/@eslint/eslintrc/node_modules/globals": {
- "version": "13.20.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
- "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/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==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.31.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz",
+ "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+ "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz",
+ "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/core": "^0.15.1",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.6",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
+ "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+ "dev": true,
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+ "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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/@jest/types/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
- "peer": true,
"dependencies": {
- "type-fest": "^0.20.2"
+ "color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
- "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
+ "node_modules/@jest/types/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
- "peer": true,
"dependencies": {
- "@humanwhocodes/object-schema": "^1.2.0",
- "debug": "^4.1.1",
- "minimatch": "^3.0.4"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@jest/types/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
},
"engines": {
- "node": ">=10.10.0"
+ "node": ">=7.0.0"
}
},
- "node_modules/@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "node_modules/@jest/types/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/@jest/types/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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/types/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==",
"dev": true,
- "peer": true
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.1.1",
@@ -1847,10 +2107,16 @@
"node": ">=4"
}
},
+ "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==",
+ "dev": true
+ },
"node_modules/@types/eslint": {
- "version": "8.21.1",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz",
- "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==",
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
+ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
"dev": true,
"dependencies": {
"@types/estree": "*",
@@ -1868,23 +2134,40 @@
}
},
"node_modules/@types/estree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
- "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true
},
- "node_modules/@types/json-schema": {
- "version": "7.0.11",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
- "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "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==",
"dev": true
},
- "node_modules/@types/json5": {
- "version": "0.0.29",
- "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
- "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "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==",
+ "dev": true,
+ "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==",
"dev": true,
- "peer": true
+ "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==",
+ "dev": true
},
"node_modules/@types/node": {
"version": "18.14.6",
@@ -1892,6 +2175,21 @@
"integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==",
"dev": true
},
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
"node_modules/@webassemblyjs/ast": {
"version": "1.11.6",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
@@ -2087,11 +2385,10 @@
"dev": true
},
"node_modules/acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
- "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -2104,7 +2401,6 @@
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
- "peer": true,
"peerDependencies": {
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
@@ -2173,26 +2469,6 @@
"ajv": "^6.9.1"
}
},
- "node_modules/ansi-colors": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
- "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "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==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
@@ -2219,154 +2495,53 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz",
"integrity": "sha512-Ylfqm/V1V/VKGazsJeRDZ31wV9gdNeK3ZsvwbYBAVSNgH8o8CMLfdx/ofn9pnMVsvTMfvC3yfcBYzGpD1vxnlw=="
},
- "node_modules/array-includes": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
- "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "dev": true
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
+ "node_modules/babel-loader": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.0.tgz",
+ "integrity": "sha512-Antt61KJPinUMwHwIIz9T5zfMgevnfZkEVWYDWlG888fgdvRRGD0JTuf/fFozQnfT+uq64sk1bmdHDy/mOEWnA==",
"dev": true,
- "peer": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "get-intrinsic": "^1.1.3",
- "is-string": "^1.0.7"
+ "find-cache-dir": "^3.3.2",
+ "schema-utils": "^4.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">= 14.15.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "@babel/core": "^7.12.0",
+ "webpack": ">=5"
}
},
- "node_modules/array.prototype.flat": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
- "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz",
+ "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==",
"dev": true,
- "peer": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
+ "@babel/compat-data": "^7.17.7",
+ "@babel/helper-define-polyfill-provider": "^0.3.3",
+ "semver": "^6.1.1"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/array.prototype.flatmap": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
- "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "dev": true
- },
- "node_modules/astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "dev": true
- },
- "node_modules/available-typed-arrays": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/babel-eslint": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
- "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
- "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "@babel/parser": "^7.7.0",
- "@babel/traverse": "^7.7.0",
- "@babel/types": "^7.7.0",
- "eslint-visitor-keys": "^1.0.0",
- "resolve": "^1.12.0"
- },
- "engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "eslint": ">= 4.12.1"
- }
- },
- "node_modules/babel-loader": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.0.tgz",
- "integrity": "sha512-Antt61KJPinUMwHwIIz9T5zfMgevnfZkEVWYDWlG888fgdvRRGD0JTuf/fFozQnfT+uq64sk1bmdHDy/mOEWnA==",
- "dev": true,
- "dependencies": {
- "find-cache-dir": "^3.3.2",
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 14.15.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.12.0",
- "webpack": ">=5"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz",
- "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==",
- "dev": true,
- "dependencies": {
- "@babel/compat-data": "^7.17.7",
- "@babel/helper-define-polyfill-provider": "^0.3.3",
- "semver": "^6.1.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz",
- "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==",
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz",
+ "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==",
"dev": true,
"dependencies": {
"@babel/helper-define-polyfill-provider": "^0.3.3",
@@ -2392,8 +2567,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "peer": true
+ "dev": true
},
"node_modules/base64-js": {
"version": "1.5.1",
@@ -2415,15 +2589,6 @@
}
]
},
- "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==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
"node_modules/bl": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
@@ -2440,12 +2605,23 @@
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
- "peer": true,
"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==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/browserslist": {
"version": "4.21.5",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
@@ -2537,7 +2713,6 @@
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true,
- "peer": true,
"engines": {
"node": ">=6"
}
@@ -2587,6 +2762,21 @@
"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==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/clone-deep": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
@@ -2659,8 +2849,7 @@
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
- "peer": true
+ "dev": true
},
"node_modules/config": {
"version": "2.0.2",
@@ -2686,12 +2875,6 @@
"json5": "lib/cli.js"
}
},
- "node_modules/confusing-browser-globals": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
- "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
- "dev": true
- },
"node_modules/convert-source-map": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
@@ -2705,12 +2888,15 @@
"dev": true
},
"node_modules/core-js": {
- "version": "2.6.12",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
- "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
- "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+ "version": "3.44.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.44.0.tgz",
+ "integrity": "sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==",
"dev": true,
- "hasInstallScript": true
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
},
"node_modules/core-js-compat": {
"version": "3.29.0",
@@ -2726,9 +2912,9 @@
}
},
"node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"dependencies": {
"path-key": "^3.1.0",
@@ -2769,8 +2955,7 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true,
- "peer": true
+ "dev": true
},
"node_modules/deepdash": {
"version": "4.6.2",
@@ -2782,22 +2967,6 @@
"lodash-es": "^4.17.15"
}
},
- "node_modules/define-properties": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
- "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
- "dev": true,
- "dependencies": {
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -2826,41 +2995,12 @@
"wrappy": "1"
}
},
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/electron-to-chromium": {
"version": "1.4.320",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.320.tgz",
"integrity": "sha512-h70iRscrNluMZPVICXYl5SSB+rBKo22XfuIS1ER0OQxQZpKTnFpuS6coj7wY9M/3trv7OR88rRMOlKmRvDty7Q==",
"dev": true
},
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "peer": true
- },
- "node_modules/emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
"node_modules/end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
@@ -2883,19 +3023,6 @@
"node": ">=10.13.0"
}
},
- "node_modules/enquirer": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
- "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-colors": "^4.1.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
"node_modules/envinfo": {
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
@@ -2908,100 +3035,12 @@
"node": ">=4"
}
},
- "node_modules/es-abstract": {
- "version": "1.21.1",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz",
- "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==",
- "dev": true,
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "es-set-tostringtag": "^2.0.1",
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "function.prototype.name": "^1.1.5",
- "get-intrinsic": "^1.1.3",
- "get-symbol-description": "^1.0.0",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
- "has": "^1.0.3",
- "has-property-descriptors": "^1.0.0",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.4",
- "is-array-buffer": "^3.0.1",
- "is-callable": "^1.2.7",
- "is-negative-zero": "^2.0.2",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.10",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.12.2",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.4.3",
- "safe-regex-test": "^1.0.0",
- "string.prototype.trimend": "^1.0.6",
- "string.prototype.trimstart": "^1.0.6",
- "typed-array-length": "^1.0.4",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.9"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/es-module-lexer": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz",
"integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==",
"dev": true
},
- "node_modules/es-set-tostringtag": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
- "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3",
- "has": "^1.0.3",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-shim-unscopables": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
- "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "has": "^1.0.3"
- }
- },
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -3021,224 +3060,65 @@
}
},
"node_modules/eslint": {
- "version": "7.32.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
- "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@babel/code-frame": "7.12.11",
- "@eslint/eslintrc": "^0.4.3",
- "@humanwhocodes/config-array": "^0.5.0",
- "ajv": "^6.10.0",
+ "version": "9.31.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz",
+ "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.0",
+ "@eslint/config-helpers": "^0.3.0",
+ "@eslint/core": "^0.15.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.31.0",
+ "@eslint/plugin-kit": "^0.3.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
"chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.0.1",
- "doctrine": "^3.0.0",
- "enquirer": "^2.3.5",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
"escape-string-regexp": "^4.0.0",
- "eslint-scope": "^5.1.1",
- "eslint-utils": "^2.1.0",
- "eslint-visitor-keys": "^2.0.0",
- "espree": "^7.3.1",
- "esquery": "^1.4.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^5.1.2",
- "globals": "^13.6.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.0.0",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
- "js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
"lodash.merge": "^4.6.2",
- "minimatch": "^3.0.4",
+ "minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
- "optionator": "^0.9.1",
- "progress": "^2.0.0",
- "regexpp": "^3.1.0",
- "semver": "^7.2.1",
- "strip-ansi": "^6.0.0",
- "strip-json-comments": "^3.1.0",
- "table": "^6.0.9",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
+ "optionator": "^0.9.3"
},
"bin": {
"eslint": "bin/eslint.js"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-config-airbnb-base": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
- "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
- "dev": true,
- "dependencies": {
- "confusing-browser-globals": "^1.0.10",
- "object.assign": "^4.1.2",
- "object.entries": "^1.1.5",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "url": "https://eslint.org/donate"
},
"peerDependencies": {
- "eslint": "^7.32.0 || ^8.2.0",
- "eslint-plugin-import": "^2.25.2"
- }
- },
- "node_modules/eslint-import-resolver-node": {
- "version": "0.3.7",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz",
- "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "debug": "^3.2.7",
- "is-core-module": "^2.11.0",
- "resolve": "^1.22.1"
- }
- },
- "node_modules/eslint-import-resolver-node/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-loader": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-4.0.2.tgz",
- "integrity": "sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw==",
- "deprecated": "This loader has been deprecated. Please use eslint-webpack-plugin",
- "dev": true,
- "dependencies": {
- "find-cache-dir": "^3.3.1",
- "fs-extra": "^8.1.0",
- "loader-utils": "^2.0.0",
- "object-hash": "^2.0.3",
- "schema-utils": "^2.6.5"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0",
- "webpack": "^4.0.0 || ^5.0.0"
- }
- },
- "node_modules/eslint-loader/node_modules/schema-utils": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
- "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
- "dev": true,
- "dependencies": {
- "@types/json-schema": "^7.0.5",
- "ajv": "^6.12.4",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 8.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/eslint-module-utils": {
- "version": "2.7.4",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz",
- "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "debug": "^3.2.7"
- },
- "engines": {
- "node": ">=4"
+ "jiti": "*"
},
"peerDependenciesMeta": {
- "eslint": {
+ "jiti": {
"optional": true
}
}
},
- "node_modules/eslint-module-utils/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import": {
- "version": "2.27.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz",
- "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flat": "^1.3.1",
- "array.prototype.flatmap": "^1.3.1",
- "debug": "^3.2.7",
- "doctrine": "^2.1.0",
- "eslint-import-resolver-node": "^0.3.7",
- "eslint-module-utils": "^2.7.4",
- "has": "^1.0.3",
- "is-core-module": "^2.11.0",
- "is-glob": "^4.0.3",
- "minimatch": "^3.1.2",
- "object.values": "^1.1.6",
- "resolve": "^1.22.1",
- "semver": "^6.3.0",
- "tsconfig-paths": "^3.14.1"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -3252,39 +3132,68 @@
"node": ">=8.0.0"
}
},
- "node_modules/eslint-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
- "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "node_modules/eslint-webpack-plugin": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-5.0.2.tgz",
+ "integrity": "sha512-cB7EO2o+4gPUzK6zxgegSet8uu/hHwzOiG+2976MHWiwWFj9mmPbTrzlW0InFl6hl89S1D9MPKK5F7vNFpZc4g==",
"dev": true,
- "peer": true,
"dependencies": {
- "eslint-visitor-keys": "^1.1.0"
+ "@types/eslint": "^9.6.1",
+ "flatted": "^3.3.3",
+ "jest-worker": "^29.7.0",
+ "micromatch": "^4.0.8",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^4.3.0"
},
"engines": {
- "node": ">=6"
+ "node": ">= 18.12.0"
},
"funding": {
- "url": "https://github.com/sponsors/mysticatea"
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "eslint": "^8.0.0 || ^9.0.0",
+ "webpack": "^5.0.0"
}
},
- "node_modules/eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "node_modules/eslint-webpack-plugin/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==",
"dev": true,
"engines": {
- "node": ">=4"
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/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==",
+ "dev": true,
+ "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/eslint/node_modules/@babel/code-frame": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
- "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+ "node_modules/eslint-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==",
"dev": true,
- "peer": true,
"dependencies": {
- "@babel/highlight": "^7.10.4"
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/eslint/node_modules/ansi-styles": {
@@ -3292,7 +3201,6 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
- "peer": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -3308,7 +3216,6 @@
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
- "peer": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -3325,7 +3232,6 @@
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
- "peer": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -3337,15 +3243,13 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "peer": true
+ "dev": true
},
"node_modules/eslint/node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
- "peer": true,
"engines": {
"node": ">=10"
},
@@ -3353,27 +3257,54 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
"node_modules/eslint/node_modules/eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
- "peer": true,
"engines": {
- "node": ">=10"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
}
},
- "node_modules/eslint/node_modules/globals": {
- "version": "13.20.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
- "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "node_modules/eslint/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
- "peer": true,
"dependencies": {
- "type-fest": "^0.20.2"
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -3384,38 +3315,53 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
- "peer": true,
"engines": {
"node": ">=8"
}
},
- "node_modules/eslint/node_modules/lru-cache": {
+ "node_modules/eslint/node_modules/locate-path": {
"version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
- "peer": true,
"dependencies": {
- "yallist": "^4.0.0"
+ "p-locate": "^5.0.0"
},
"engines": {
"node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint/node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "node_modules/eslint/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
- "peer": true,
"dependencies": {
- "lru-cache": "^6.0.0"
+ "yocto-queue": "^0.1.0"
},
- "bin": {
- "semver": "bin/semver.js"
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
},
"engines": {
"node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint/node_modules/supports-color": {
@@ -3423,7 +3369,6 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
- "peer": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -3431,26 +3376,33 @@
"node": ">=8"
}
},
- "node_modules/eslint/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true,
- "peer": true
- },
"node_modules/espree": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
- "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
"dev": true,
- "peer": true,
"dependencies": {
- "acorn": "^7.4.0",
- "acorn-jsx": "^5.3.1",
- "eslint-visitor-keys": "^1.3.0"
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
"node_modules/esprima": {
@@ -3471,7 +3423,6 @@
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
"integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
"dev": true,
- "peer": true,
"dependencies": {
"estraverse": "^5.1.0"
},
@@ -3484,7 +3435,6 @@
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
- "peer": true,
"engines": {
"node": ">=4.0"
}
@@ -3559,8 +3509,7 @@
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true,
- "peer": true
+ "dev": true
},
"node_modules/fast-safe-stringify": {
"version": "2.1.1",
@@ -3578,16 +3527,27 @@
}
},
"node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "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==",
"dev": true,
- "peer": true,
"dependencies": {
- "flat-cache": "^3.0.4"
+ "to-regex-range": "^5.0.1"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": ">=8"
}
},
"node_modules/find-cache-dir": {
@@ -3621,34 +3581,23 @@
}
},
"node_modules/flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
"dev": true,
- "peer": true,
"dependencies": {
- "flatted": "^3.1.0",
- "rimraf": "^3.0.2"
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": ">=16"
}
},
"node_modules/flatted": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
- "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.3"
- }
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true
},
"node_modules/form-data": {
"version": "4.0.0",
@@ -3714,53 +3663,12 @@
"minipass": "^2.6.0"
}
},
- "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==",
- "dev": true,
- "peer": true
- },
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
- "node_modules/function.prototype.name": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
- "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.0",
- "functions-have-names": "^1.2.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
- "dev": true,
- "peer": true
- },
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "dev": true,
- "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",
@@ -3784,54 +3692,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "peer": true,
- "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==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
- "peer": true,
"dependencies": {
- "is-glob": "^4.0.1"
+ "is-glob": "^4.0.3"
},
"engines": {
- "node": ">= 6"
+ "node": ">=10.13.0"
}
},
"node_modules/glob-to-regexp": {
@@ -3849,33 +3719,6 @@
"node": ">=4"
}
},
- "node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/graceful-fs": {
"version": "4.2.10",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
@@ -3924,15 +3767,6 @@
"node": ">= 0.4.0"
}
},
- "node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -3942,30 +3776,6 @@
"node": ">=4"
}
},
- "node_modules/has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
@@ -3978,21 +3788,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/hexoid": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz",
@@ -4051,21 +3846,19 @@
]
},
"node_modules/ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
- "peer": true,
"engines": {
"node": ">= 4"
}
},
"node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
"dev": true,
- "peer": true,
"dependencies": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
@@ -4090,114 +3883,34 @@
"import-local-fixture": "fixtures/cli.js"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "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==",
- "dev": true,
- "peer": true,
- "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==",
- "dev": true
- },
- "node_modules/internal-slot": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
- "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.2.0",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/interpret": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
- "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
- "dev": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/is-array-buffer": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
- "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.0",
- "is-typed-array": "^1.1.10"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "dev": true,
- "dependencies": {
- "has-bigints": "^1.0.1"
+ "node": ">=8"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=0.8.19"
}
},
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/interpret": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
"dev": true,
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 0.10"
}
},
"node_modules/is-core-module": {
@@ -4212,47 +3925,20 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
- "peer": true,
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
- "peer": true,
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -4260,31 +3946,13 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-negative-zero": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "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==",
"dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=0.12.0"
}
},
"node_modules/is-plain-object": {
@@ -4299,114 +3967,112 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "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==",
+ "dev": true
},
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "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==",
"dev": true,
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "@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": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "node_modules/jest-util/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": {
- "has-symbols": "^1.0.2"
+ "color-convert": "^2.0.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/is-typed-array": {
- "version": "1.1.10",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
- "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
+ "node_modules/jest-util/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "node_modules/jest-util/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2"
+ "color-name": "~1.1.4"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=7.0.0"
}
},
- "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==",
+ "node_modules/jest-util/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
+ "node_modules/jest-util/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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "node_modules/jest-util/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==",
"dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
}
},
"node_modules/jest-worker": {
@@ -4490,6 +4156,12 @@
"node": ">=4"
}
},
+ "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==",
+ "dev": true
+ },
"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",
@@ -4553,8 +4225,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true,
- "peer": true
+ "dev": true
},
"node_modules/json5": {
"version": "2.2.3",
@@ -4586,6 +4257,15 @@
"node": ">=10.0.0"
}
},
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
"node_modules/kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -4600,7 +4280,6 @@
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
- "peer": true,
"dependencies": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
@@ -4618,20 +4297,6 @@
"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==",
- "dev": true,
- "dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- },
- "engines": {
- "node": ">=8.9.0"
- }
- },
"node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -4678,15 +4343,7 @@
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/lodash.truncate": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
- "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
- "dev": true,
- "peer": true
+ "dev": true
},
"node_modules/lru-cache": {
"version": "5.1.1",
@@ -4726,6 +4383,19 @@
"node": ">= 0.6"
}
},
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
"node_modules/mime": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
@@ -4764,7 +4434,6 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
- "peer": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
@@ -4834,8 +4503,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true,
- "peer": true
+ "dev": true
},
"node_modules/neo-async": {
"version": "2.6.2",
@@ -4849,21 +4517,13 @@
"integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
"dev": true
},
- "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==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-hash": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
- "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
+ "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==",
"dev": true,
"engines": {
- "node": ">= 6"
+ "node": ">=0.10.0"
}
},
"node_modules/object-inspect": {
@@ -4875,65 +4535,6 @@
"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==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
- "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "has-symbols": "^1.0.3",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.entries": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
- "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.values": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
- "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -4953,18 +4554,17 @@
}
},
"node_modules/optionator": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
- "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
- "peer": true,
"dependencies": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
"type-check": "^0.4.0",
- "word-wrap": "^1.2.3"
+ "word-wrap": "^1.2.5"
},
"engines": {
"node": ">= 0.8.0"
@@ -5011,7 +4611,6 @@
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
- "peer": true,
"dependencies": {
"callsites": "^3.0.0"
},
@@ -5036,16 +4635,6 @@
"node": ">=8"
}
},
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -5082,6 +4671,18 @@
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -5099,19 +4700,8 @@
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true,
- "peer": true,
"engines": {
- "node": ">=0.4.0"
+ "node": ">= 0.8.0"
}
},
"node_modules/pump": {
@@ -5133,15 +4723,6 @@
"node": ">=6"
}
},
- "node_modules/q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
- "engines": {
- "node": ">=0.6.0",
- "teleport": ">=0.2.0"
- }
- },
"node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
@@ -5157,18 +4738,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/query-string": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
- "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==",
- "dependencies": {
- "object-assign": "^4.1.0",
- "strict-uri-encode": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/querystring": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
@@ -5261,36 +4830,6 @@
"@babel/runtime": "^7.8.4"
}
},
- "node_modules/regexp.prototype.flags": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
- "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "functions-have-names": "^1.2.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/regexpp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
- "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/mysticatea"
- }
- },
"node_modules/regexpu-core": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.1.tgz",
@@ -5381,27 +4920,10 @@
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true,
- "peer": true,
"engines": {
"node": ">=4"
}
},
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/router": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/router/-/router-1.3.3.tgz",
@@ -5457,20 +4979,6 @@
}
]
},
- "node_modules/safe-regex-test": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
- "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "is-regex": "^1.1.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -5478,18 +4986,18 @@
"dev": true
},
"node_modules/schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
+ "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==",
"dev": true,
"dependencies": {
"@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
+ "ajv": "^8.9.0",
"ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
+ "ajv-keywords": "^5.1.0"
},
"engines": {
- "node": ">= 12.13.0"
+ "node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
@@ -5616,60 +5124,6 @@
"node": ">=8"
}
},
- "node_modules/slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
- "node_modules/slice-ansi/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/slice-ansi/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/slice-ansi/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "peer": true
- },
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -5713,14 +5167,6 @@
"node": ">= 0.8"
}
},
- "node_modules/strict-uri-encode": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
- "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@@ -5730,78 +5176,11 @@
"safe-buffer": "~5.2.0"
}
},
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string.prototype.trimend": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
- "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
- "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
"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==",
"dev": true,
- "peer": true,
"engines": {
"node": ">=8"
},
@@ -5940,47 +5319,6 @@
"isarray": "0.0.1"
}
},
- "node_modules/table": {
- "version": "6.8.1",
- "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
- "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ajv": "^8.0.1",
- "lodash.truncate": "^4.4.2",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/table/node_modules/ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/table/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true,
- "peer": true
- },
"node_modules/tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -6106,31 +5444,12 @@
"url": "https://opencollective.com/webpack"
}
},
- "node_modules/terser/node_modules/acorn": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
- "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/terser/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true,
- "peer": true
- },
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -6140,6 +5459,18 @@
"node": ">=4"
}
},
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "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",
@@ -6149,38 +5480,11 @@
"node": ">=0.6"
}
},
- "node_modules/tsconfig-paths": {
- "version": "3.14.2",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
- "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/json5": "^0.0.29",
- "json5": "^1.0.2",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
- }
- },
- "node_modules/tsconfig-paths/node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "minimist": "^1.2.0"
- },
- "bin": {
- "json5": "lib/cli.js"
- }
- },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
- "peer": true,
"dependencies": {
"prelude-ls": "^1.2.1"
},
@@ -6188,33 +5492,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/typed-array-length": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
- "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "is-typed-array": "^1.1.9"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/uglify-js": {
"version": "3.17.4",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
@@ -6228,21 +5505,6 @@
"node": ">=0.8.0"
}
},
- "node_modules/unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -6364,13 +5626,6 @@
"node": ">= 0.4.0"
}
},
- "node_modules/v8-compile-cache": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
- "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
- "dev": true,
- "peer": true
- },
"node_modules/validator": {
"version": "10.11.0",
"resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz",
@@ -6518,18 +5773,6 @@
"node": ">=10.13.0"
}
},
- "node_modules/webpack/node_modules/acorn": {
- "version": "8.9.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz",
- "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/webpack/node_modules/acorn-import-assertions": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
@@ -6606,42 +5849,6 @@
"node": ">= 8"
}
},
- "node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "dev": true,
- "dependencies": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-typed-array": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
- "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
- "dev": true,
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0",
- "is-typed-array": "^1.1.10"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/wildcard": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
@@ -6649,11 +5856,10 @@
"dev": true
},
"node_modules/word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"dev": true,
- "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -6676,6 +5882,18 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true
},
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/z-schema": {
"version": "3.25.1",
"resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.25.1.tgz",
@@ -6700,6 +5918,14 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"optional": true
+ },
+ "node_modules/z-schema/node_modules/core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+ "dev": true,
+ "hasInstallScript": true
}
}
}
diff --git a/package.json b/package.json
index 0373a70..0affee5 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "microservice",
- "version": "1.0.3",
+ "version": "1.0.4",
"description": "This is a sample edge microservice.",
"main": "index.js",
"scripts": {
@@ -14,18 +14,16 @@
"@babel/preset-env": "7.20.2",
"@mimik/edge-ms-packager": "1.1.5",
"@mimik/swagger-mw-codegen": "1.4.6",
- "babel-eslint": "10.1.0",
"babel-loader": "9.1.0",
- "eslint-config-airbnb-base": "15.0.0",
- "eslint-loader": "4.0.2",
+ "core-js": "^3.36.1",
+ "eslint": "^9.31.0",
+ "eslint-webpack-plugin": "^5.0.2",
"terser-webpack-plugin": "5.3.6",
"webpack": "^5.87.0",
"webpack-cli": "4.10.0"
},
"dependencies": {
- "q": "^1.5.1",
"parseurl": "1.3.3",
- "query-string": "4.3.4",
"router": "1.3.3",
"url": "^0.11.0"
}
diff --git a/readme_img/db_json.png b/readme_img/db_json.png
new file mode 100644
index 0000000..6537f13
Binary files /dev/null and b/readme_img/db_json.png differ
diff --git a/readme_img/db_view.png b/readme_img/db_view.png
new file mode 100644
index 0000000..21078f0
Binary files /dev/null and b/readme_img/db_view.png differ
diff --git a/readme_img/default_response.png b/readme_img/default_response.png
new file mode 100644
index 0000000..e07879e
Binary files /dev/null and b/readme_img/default_response.png differ
diff --git a/readme_img/html_response.png b/readme_img/html_response.png
new file mode 100644
index 0000000..3c21b26
Binary files /dev/null and b/readme_img/html_response.png differ
diff --git a/readme_img/json_items_filter.png b/readme_img/json_items_filter.png
new file mode 100644
index 0000000..9e8bcb4
Binary files /dev/null and b/readme_img/json_items_filter.png differ
diff --git a/requests.http b/requests.http
new file mode 100644
index 0000000..44d0b73
--- /dev/null
+++ b/requests.http
@@ -0,0 +1,101 @@
+///////////////////////////////////////////////////////////////////////////////
+//// NOTE: ////
+//// > This is a REST Client file, and is compatible with curl. ////
+//// > If there is any issue with curl, use doublequotes around the url. ////
+///////////////////////////////////////////////////////////////////////////////
+
+
+#### getPromise()
+GET http://localhost:8083/api/microservice/v1/promise
+
+
+#### testExternalDomain(domain)
+GET http://localhost:8083/api/microservice/v1/external/info
+
+
+#### readSingleServerConfig(key)
+GET http://localhost:8083/api/microservice/v1/config/server/single/PrimaryServer
+
+
+#### readMultipleServerConfig(appId)
+GET http://localhost:8083/api/microservice/v1/config/server/multiple/app1234
+
+
+#### readAllStorage()
+GET http://localhost:8083/api/microservice/v1/storage/all
+
+
+#### getJsonItems()
+GET http://localhost:8083/api/microservice/v1/some/test/get-json-items
+
+
+#### getJsonItemsFilter(networkPrefix)
+GET http://localhost:8083/api/microservice/v1/some/test/get-json-items/filter/172
+
+
+#### postSingleServerConfig(appId)
+POST http://localhost:8083/api/microservice/v1/config/server/single
+ContentType: application/json
+
+{
+ "appId": "app1234",
+ "name": "MainServer",
+ "address": "192.168.1.100",
+ "port": 8080,
+ "enableSSL": true
+}
+
+
+#### deleteSingleServerConfig(appId)
+DELETE http://localhost:8083/api/microservice/v1/config/server/single/app1234
+
+
+#### postMultipleServerConfig(appId, name, address)
+POST http://localhost:8083/api/microservice/v1/config/server/multiple
+ContentType: application/json
+
+{
+ "appId": "app1234", // this can be fixed for the example
+ "name": "MainServer", // this can be changed for the example
+ "address": "192.168.1.100",
+ "port": 8083,
+ "enableSSL": true
+}
+
+
+#### deleteMultipleServerConfigByKey(key)
+DELETE http://localhost:8083/api/microservice/v1/config/server/multiple/key/PrimaryServer
+
+
+#### deleteMultipleServerConfigByTag(tag)
+DELETE http://localhost:8083/api/microservice/v1/config/server/multiple/tag/app1234
+
+
+#### setupTransactions(copies)
+POST http://localhost:8083/api/microservice/v1/storage/usecase/transactions/setup
+ContentType: application/json
+
+{ "copies": 2 }
+
+
+#### readPageUsingSimpleFilter()
+GET http://localhost:8083/api/microservice/v1/storage/usecase/transactions/page/simplefilter?skip=0&count=20&increasing=1
+
+
+#### readPageUsingAdvancedFilter()
+GET http://localhost:8083/api/microservice/v1/storage/usecase/transactions/page/advancedfilter?skip=0&count=20&increasing=1
+
+
+#### findTransactionsByDetails(categoryName, onBoardGPU)
+GET http://localhost:8083/api/microservice/v1/storage/usecase/transactions/category/SmartHomeLifestyleGadgets/gpu/true
+
+
+#### postAdminConfig(config)
+POST http://localhost:8083/api/microservice/v1/config/admin
+ContentType: application/json
+
+{ "email": "admin@example.com", "password": "securepassword123" }
+
+
+#### deleteAdminConfig(email)
+DELETE http://localhost:8083/api/microservice/v1/config/admin/admin@example.com
diff --git a/src/dataset/categories.json b/src/dataset/categories.json
new file mode 100644
index 0000000..d88af20
--- /dev/null
+++ b/src/dataset/categories.json
@@ -0,0 +1,20 @@
+{
+ "Audio-Entertainment": [
+ "Bluetooth Speaker",
+ "Wireless Earbuds",
+ "Noise Cancelling Headphones"
+ ],
+ "MobileDevices-Accessories": [
+ "Smartphone",
+ "Smartwatch",
+ "Tablet"
+ ],
+ "ComputerPeripherals-Gaming": [
+ "Gaming Mouse",
+ "VR Headset"
+ ],
+ "SmartHome-LifestyleGadgets": [
+ "Digital Photo Frame",
+ "Portable Projector"
+ ]
+}
\ No newline at end of file
diff --git a/src/dataset/transactions.json b/src/dataset/transactions.json
new file mode 100644
index 0000000..23b74c4
--- /dev/null
+++ b/src/dataset/transactions.json
@@ -0,0 +1,94 @@
+{
+ "data": [
+ {
+ "id": "TXN001",
+ "email": "user12@test.com",
+ "timestamp": "2025-07-19T14:32:10Z",
+ "buyerAgeGroup": "teen",
+ "product": "Bluetooth Speaker",
+ "price": 49.99,
+ "onBoardGPU": false
+ },
+ {
+ "id": "TXN002",
+ "email": "user19@test.com",
+ "timestamp": "2025-07-20T10:07:52Z",
+ "buyerAgeGroup": "adult",
+ "product": "Smartphone",
+ "price": 799.00,
+ "onBoardGPU": true
+ },
+ {
+ "id": "TXN003",
+ "email": "user15@test.com",
+ "timestamp": "2025-07-19T17:25:41Z",
+ "buyerAgeGroup": "young adult",
+ "product": "Wireless Earbuds",
+ "price": 129.99,
+ "onBoardGPU": false
+ },
+ {
+ "id": "TXN004",
+ "email": "user20@test.com",
+ "timestamp": "2025-07-20T09:14:26Z",
+ "buyerAgeGroup": "senior",
+ "product": "Digital Photo Frame",
+ "price": 89.50,
+ "onBoardGPU": true
+ },
+ {
+ "id": "TXN005",
+ "email": "user12@test.com",
+ "timestamp": "2025-07-20T19:33:04Z",
+ "buyerAgeGroup": "teen",
+ "product": "Gaming Mouse",
+ "price": 59.99,
+ "onBoardGPU": false
+ },
+ {
+ "id": "TXN006",
+ "email": "user19@test.com",
+ "timestamp": "2025-07-19T21:48:18Z",
+ "buyerAgeGroup": "adult",
+ "product": "Smartwatch",
+ "price": 249.99,
+ "onBoardGPU": true
+ },
+ {
+ "id": "TXN007",
+ "email": "user15@test.com",
+ "timestamp": "2025-07-20T16:06:33Z",
+ "buyerAgeGroup": "young adult",
+ "product": "Tablet",
+ "price": 399.00,
+ "onBoardGPU": true
+ },
+ {
+ "id": "TXN008",
+ "email": "user20@test.com",
+ "timestamp": "2025-07-19T08:55:12Z",
+ "buyerAgeGroup": "senior",
+ "product": "Noise Cancelling Headphones",
+ "price": 199.95,
+ "onBoardGPU": false
+ },
+ {
+ "id": "TXN009",
+ "email": "user19@test.com",
+ "timestamp": "2025-07-20T13:20:47Z",
+ "buyerAgeGroup": "adult",
+ "product": "Portable Projector",
+ "price": 299.99,
+ "onBoardGPU": true
+ },
+ {
+ "id": "TXN010",
+ "email": "user15@test.com",
+ "timestamp": "2025-07-19T11:11:11Z",
+ "buyerAgeGroup": "young adult",
+ "product": "VR Headset",
+ "price": 499.00,
+ "onBoardGPU": true
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/helper.js b/src/helper.js
deleted file mode 100644
index 57ccc6d..0000000
--- a/src/helper.js
+++ /dev/null
@@ -1,7 +0,0 @@
-function env() {
- return global.context.env;
-}
-
-module.exports = {
- env,
-};
diff --git a/src/index.js b/src/index.js
index c5f4dea..a3d79b6 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,7 +1,8 @@
import Router from 'router';
-import queryString from 'query-string';
-import Q from 'q';
-import { env } from './helper';
+import { libQueryToObject, uuid } from './libhelper';
+import { form } from './ui/form.json';
+import { data } from './dataset/transactions.json';
+import * as categories from './dataset/categories.json';
const app = Router({
mergeParams: true,
@@ -10,6 +11,7 @@ const app = Router({
mimikModule.exports = (context, req, res) => {
global.context = context;
app(req, res, (e) => {
+ // catches and re-throws any runtime exception
res.end(JSON.stringify({ code: e ? 400 : 404, message: e || 'Not Found' }));
});
};
@@ -19,31 +21,370 @@ app.get('/', (req, res) => {
res.end('Hello World!');
});
-// Sample HTTP Request to return the environment variables
-app.get('/env', (req, res) => {
- res.end(JSON.stringify(env()));
-});
+// Sample HTTP Request: return the environment variables
+app.get('/env', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { env } = context;
+ res.end(JSON.stringify(env));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ error: err.message || err }));
+ })
+);
-// Sample HTTP Request with Parameters
+// Sample HTTP Request: using path parameter
app.get('/sayHello/:name', (req, res) => {
res.end(`Hello ${req.params.name}`);
});
-// Sample HTTP Request with Query
+// Sample HTTP Request: using query parameters
app.get('/add', (req, res) => {
- const query = queryString.parse(req._parsedUrl.query);
+ const query = libQueryToObject(req._parsedUrl.query);
res.end(`result is ${Number(query.x) + Number(query.y)}`);
});
-// Sample Promise with Q
-app.get('/promise', (req, res) => {
- const simplePromise = Q.Promise((resolve) => {
- resolve('From the Q promise.');
- });
- simplePromise.then((answer) => res.end(answer));
+// Sample Promise
+app.get('/promise', (req, res) => Promise.resolve({ name: 'Alice', age: 30 })
+ .then((data) => {
+ res.end(JSON.stringify(data));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ error: err.message || err }));
+ })
+);
+
+// Sample Raw-HTML Response
+app.get('/raw-html', (req, res) => {
+ res.setHeader('content-type', 'text/html');
+ res.end('raw html response');
});
-// Sample HTTP request with JSON Body and return it
-app.post('/form', (req, res) => {
- res.end(req.body);
+// Sample HTML (B64) Response
+app.get('/html', (req, res) => {
+ res.setHeader('content-type', form.mimeType);
+ const buf = Duktape.dec('base64', form.content);
+ const txt = new TextDecoder().decode(buf);
+ res.end(txt);
+});
+app.post('/html', (req, res) => {
+ console.log(req.body);
+ res.end(JSON.stringify({ data: req.body }));
});
+
+// Sample External Endpoint
+app.get('/external/:domain', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const externalApiEndpoint = 'https://jsonplaceholder.typicode.com/users';
+ const filterDomainName = req.params.domain;
+ context.http.request(({
+ type: 'GET',
+ url: externalApiEndpoint,
+ success: (result) => {
+ const { data } = result;
+ const usersList = JSON.parse(data);
+ const users = usersList.filter((x) => {
+ const domainName = x.website.split('.')[1];
+ return domainName === filterDomainName;
+ });
+ res.end(JSON.stringify({ success: true, externalApiEndpoint, users }));
+ },
+ error: (err) => {
+ res.end(JSON.stringify({ error: err.message || err }));
+ }
+ }));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ error: err.message || err }));
+ })
+);
+
+// Sample Read Single Record
+app.get('/config/server/single/:appId', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ const appId = req.params.appId;
+ const result = storage.getItem(appId);
+ res.end(JSON.stringify({ data: { appId: result } }));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ data: {}, error: err.message || err }));
+ })
+);
+
+// Sample Read Multiple Records
+app.get('/config/server/multiple/:appId', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ const appId = req.params.appId;
+ const result = {};
+ storage.eachItemByTag(appId, (k, v) => {
+ result[k] = v;
+ });
+ res.end(JSON.stringify({ data: result }));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ data: {}, error: err.message || err }));
+ })
+);
+
+// Sample Read All Records
+app.get('/storage/all', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ const result = {};
+ storage.eachItem((k, v) => {
+ result[k] = v;
+ });
+ res.end(JSON.stringify({ data: result }));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ data: {}, error: err.message || err }));
+ })
+);
+
+// Sample Read All JSON Records
+app.get('/some/test/get-json-items', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ let result = '';
+ storage.getJsonItemsPaginated(0, 10, (items, total) => {
+ result = items;
+ });
+ res.end(result); // default response header content-type is application/json
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ error: err.message || err }));
+ })
+);
+
+// Sample Use-Case: read all json records with filter
+app.get('/some/test/get-json-items/filter/:networkPrefix', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ const networkPrefix = req.params.networkPrefix;
+ const filter = {
+ tag: '',
+ filters: [
+ { jsonPath: '$.address', comparisonOperator: 'LIKE', value: `${networkPrefix}.%` }
+ ]
+ };
+ let result = '';
+ storage.getJsonItemsPaginated(0, 10, (items, total) => {
+ result = items;
+ }, filter);
+ res.end(result); // default response header content-type is application/json
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ error: err.message || err }));
+ })
+);
+
+// Sample Use-Case: save/delete unique server config
+app.post('/config/server/single', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ const { appId, name, address, port, enableSSL } = JSON.parse(req.body);
+ const configWithName = { name, address, port, enableSSL };
+ storage.setItem(appId, JSON.stringify(configWithName));
+ res.end(JSON.stringify({ saved: true }));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ saved: false, error: err.message || err }));
+ })
+);
+app.delete('/config/server/single/:appId', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ const appId = req.params.appId;
+ if (!appId) {
+ res.end(JSON.stringify({ deleted: false }));
+ }
+ storage.removeItem(appId);
+ res.end(JSON.stringify({ deleted: true }));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ deleted: false, error: err.message || err }));
+ })
+);
+
+// Sample Use-Case: save/delete multiple server config
+app.post('/config/server/multiple', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ const { appId, name, address, port, enableSSL } = JSON.parse(req.body);
+ const config = { address, port, enableSSL };
+ storage.setItemWithTag(name, JSON.stringify(config), appId);
+ res.end(JSON.stringify({ saved: true }));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ saved: false, error: err.message || err }));
+ })
+);
+app.delete('/config/server/multiple/key/:key', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ const key = req.params.key;
+ storage.removeItem(key);
+ res.end(JSON.stringify({ deleted: true }));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ deleted: false, error: err.message || err }));
+ })
+);
+app.delete('/config/server/multiple/tag/:tag', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ const tag = req.params.tag;
+ storage.removeItemsByTag(tag);
+ res.end(JSON.stringify({ deleted: true }));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ deleted: false, error: err.message || err }));
+ })
+);
+
+// Sample Use-Case: sample transactions db setup, search records, read paginated records
+app.post('/storage/use-case/transactions/setup', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const tag = 'transactions';
+ const { storage } = context;
+ const { copies } = JSON.parse(req.body);
+ try {
+ storage.removeItemsByTag(tag);
+ data.forEach((item) => {
+ const count = Number(copies);
+ for (let index = 0; index < count; index++) {
+ const id = uuid();
+ const { email, timestamp, buyerAgeGroup, product, price, onBoardGPU } = item;
+ const record = {
+ email, timestamp, buyerAgeGroup, product, price, onBoardGPU
+ };
+ console.log(JSON.stringify(record));
+ storage.setItemWithTag(id, JSON.stringify(record), tag);
+ }
+ });
+ res.end(JSON.stringify({ saved: true }));
+ } catch (err) {
+ res.end(JSON.stringify({ saved: false, error: err.message || err }));
+ }
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ saved: false, error: err.message || err }));
+ })
+);
+app.get('/storage/use-case/transactions/category/:categoryName/gpu/:onBoardGPU', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const tag = 'transactions';
+ const { storage } = context;
+ try {
+ const categoryName = req.params.categoryName;
+ const onBoardGPU = req.params.onBoardGPU === 'true';
+ const keys = Object.keys(categories);
+ if (!keys.includes(categoryName)) {
+ res.end(JSON.stringify({ success: false }));
+ }
+ const result = [];
+ const products = categories[categoryName];
+ storage.eachItemByTag(tag, (k, v) => {
+ const record = JSON.parse(v);
+ if (products.includes(record.product)) {
+ console.log(JSON.stringify(record));
+ if (record.onBoardGPU === onBoardGPU) {
+ result.push(record);
+ }
+ }
+ });
+ res.end(JSON.stringify({ success: true, result }));
+ } catch (err) {
+ res.end(JSON.stringify({ success: false, error: err.message || err }));
+ }
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ saved: false, error: err.message || err }));
+ })
+);
+app.get('/storage/use-case/transactions/page/simple-filter', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ const query = libQueryToObject(req._parsedUrl.query);
+ const skip = Number(query.skip); // number of records to skip from start
+ const count = Number(query.count); // total number of records to fetch
+ const sortingOrder = Number(query.increasing); // use negative integer for descending order
+ const result = { count: 0 };
+ const filter = {
+ filters: [{ jsonPath: '$.email', comparisonOperator: 'IS NOT NULL', value: 0 }],
+ groupBy: [],
+ orderBy: [{ jsonPath: '$.timestamp', order: sortingOrder }]
+ };
+ storage.getJsonItemsPaginated(skip, count, (items, total) => {
+ result.items = JSON.parse(items);
+ result.count = total;
+ }, filter);
+ res.end(JSON.stringify({ data: result, filter }));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ data: {}, error: err.message || err }));
+ })
+);
+app.get('/storage/use-case/transactions/page/advanced-filter', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ const query = libQueryToObject(req._parsedUrl.query);
+ const skip = Number(query.skip); // number of records to skip from start
+ const count = Number(query.count); // total number of records to fetch
+ const sortingOrder = Number(query.increasing); // use negative integer for descending order
+ const result = { count: 0 };
+ const filter = {
+ filters: [
+ { jsonPath: '$.email', comparisonOperator: 'IS NOT NULL', value: 0 },
+ { jsonPath: '$.price', comparisonOperator: '>=', value: 390 }
+ ],
+ groupBy: ['$.product'],
+ orderBy: [{ jsonPath: '$.timestamp', order: sortingOrder }]
+ };
+ storage.getJsonItemsPaginated(skip, count, (items, total) => {
+ result.items = JSON.parse(items);
+ result.count = total;
+ }, filter);
+ res.end(JSON.stringify({ data: result, filter }));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ data: {}, error: err.message || err }));
+ })
+);
+
+/*
+// ------------------------------------------------------------
+// Bonus: please uncomment these, and build the microservice
+// ------------------------------------------------------------
+
+// Sample Use-Case: save/delete unique admin config
+app.post('/config/admin', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ const { email, password } = JSON.parse(req.body);
+ if (!email || !password) {
+ res.end(JSON.stringify({ saved: false }));
+ }
+ storage.setItem(email, password);
+ res.end(JSON.stringify({ saved: true }));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ saved: false, error: err.message || err }));
+ })
+);
+app.delete('/config/admin/:email', (req, res) => Promise.resolve(global.context)
+ .then((context) => {
+ const { storage } = context;
+ const email = req.params.email;
+ if (!email) {
+ res.end(JSON.stringify({ deleted: false }));
+ }
+ storage.removeItem(email);
+ res.end(JSON.stringify({ deleted: true }));
+ })
+ .catch((err) => {
+ res.end(JSON.stringify({ deleted: false, error: err.message || err }));
+ })
+);
+*/
diff --git a/src/libhelper.js b/src/libhelper.js
new file mode 100644
index 0000000..41ffbe4
--- /dev/null
+++ b/src/libhelper.js
@@ -0,0 +1,37 @@
+export function uuid() {
+
+ var lut = []; for (var i = 0; i < 256; i++) {
+ lut[i] = (i < 16 ? '0' : '') + (i).toString(16);
+ }
+ var d0 = Math.random() * 0xffffffff | 0;
+ var d1 = Math.random() * 0xffffffff | 0;
+ var d2 = Math.random() * 0xffffffff | 0;
+ var d3 = Math.random() * 0xffffffff | 0;
+ return lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' +
+ lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' +
+ lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] +
+ lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff];
+
+}
+
+export function libQueryToObject(query) {
+ if (!query) {
+ return {};
+ }
+ const searchParams = new URLSearchParams(query);
+ const result = {};
+ for (const param of searchParams.keys()) {
+ const value = searchParams.get(param);
+ result[param] = value;
+ }
+ return result;
+}
+
+export function libSetTimeout(cb, delayInMs) {
+ // returns value after a delay
+ const startTime = Date.now();
+ while (Date.now() - startTime < delayInMs) {
+ // no-op
+ }
+ return cb();
+}
diff --git a/src/ui/form.json b/src/ui/form.json
new file mode 100644
index 0000000..75be5ac
--- /dev/null
+++ b/src/ui/form.json
@@ -0,0 +1 @@
+{"form":{"content": "PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KCjxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+CiAgICA8dGl0bGU+U2VydmVyIENvbmZpZ3VyYXRpb248L3RpdGxlPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8c3R5bGU+CiAgICAgICAgYm9keSB7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwogICAgICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgIH0KCiAgICAgICAgZm9ybSB7CiAgICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgICAgIGdhcDogMTVweDsKICAgICAgICAgICAgbWF4LXdpZHRoOiA1MDBweDsKICAgICAgICAgICAgbWFyZ2luOiBhdXRvOwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOwogICAgICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgfQoKICAgICAgICBpbnB1dCwKICAgICAgICBzZWxlY3QgewogICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQoKICAgICAgICBidXR0b24gewogICAgICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICMwMDdiZmY7CiAgICAgICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH0KCiAgICAgICAgYnV0dG9uOmhvdmVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogIzAwNTZiMzsKICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cgo8Ym9keT4KICAgIDxmb3JtIGlkPSJzZXJ2ZXJDb25maWdGb3JtIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgIFNlcnZlciBOYW1lOgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic2VydmVyTmFtZSIgcmVxdWlyZWQgLz4KICAgICAgICA8L2xhYmVsPgoKICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgIFBvcnQ6CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIG5hbWU9InBvcnQiIG1pbj0iMSIgbWF4PSI2NTUzNSIgLz4KICAgICAgICA8L2xhYmVsPgoKICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgIEFkbWluIEVtYWlsOgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iZW1haWwiIG5hbWU9ImFkbWluRW1haWwiIC8+CiAgICAgICAgPC9sYWJlbD4KCiAgICAgICAgPGxhYmVsPgogICAgICAgICAgICBBZG1pbiBQYXNzd29yZDoKICAgICAgICAgICAgPGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJhZG1pblBhc3N3b3JkIiAvPgogICAgICAgIDwvbGFiZWw+CgogICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgU1NMIENlcnRpZmljYXRlIEV4cGlyeToKICAgICAgICAgICAgPGlucHV0IHR5cGU9ImRhdGUiIG5hbWU9InNzbEV4cGlyeURhdGUiIC8+CiAgICAgICAgPC9sYWJlbD4KCiAgICAgICAgPGxhYmVsPgogICAgICAgICAgICBFbmFibGUgU1NMOgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImVuYWJsZVNTTCIgLz4KICAgICAgICA8L2xhYmVsPgoKICAgICAgICA8ZmllbGRzZXQ+CiAgICAgICAgICAgIDxsZWdlbmQ+TG9nIExldmVsPC9sZWdlbmQ+CiAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0ibG9nTGV2ZWwiIHZhbHVlPSJlcnJvciIgLz4KICAgICAgICAgICAgICAgIEVycm9yCiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0ibG9nTGV2ZWwiIHZhbHVlPSJ3YXJuaW5nIiAvPgogICAgICAgICAgICAgICAgV2FybmluZwogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImxvZ0xldmVsIiB2YWx1ZT0iaW5mbyIgLz4KICAgICAgICAgICAgICAgIEluZm8KICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgIFJlZ2lvbjoKICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJyZWdpb24iPgogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5TZWxlY3TigKY8L29wdGlvbj4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InVzLWVhc3QtMSI+dXMtZWFzdC0xPC9vcHRpb24+CiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ1cy13ZXN0LTIiPnVzLXdlc3QtMjwvb3B0aW9uPgogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZXUtY2VudHJhbC0xIj5ldS1jZW50cmFsLTE8L29wdGlvbj4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImFwLXNvdXRoZWFzdC0xIj5hcC1zb3V0aGVhc3QtMTwvb3B0aW9uPgogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ic2EtZWFzdC0xIj5zYS1lYXN0LTE8L29wdGlvbj4KICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgPC9sYWJlbD4KCiAgICAgICAgPGxhYmVsPgogICAgICAgICAgICBVSSBUaGVtZSBDb2xvcjoKICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNvbG9yIiBuYW1lPSJ1aVRoZW1lQ29sb3IiIHZhbHVlPSIjZTY2NDY1IiAvPgogICAgICAgIDwvbGFiZWw+CgogICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgVXBsb2FkIFNTTCBDZXJ0aWZpY2F0ZToKICAgICAgICAgICAgPGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9InNzbENlcnRGaWxlIiBhY2NlcHQ9Ii5jcnQsLnBlbSIgLz4KICAgICAgICA8L2xhYmVsPgoKICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCI+QXBwbHkgQ29uZmlndXJhdGlvbjwvYnV0dG9uPgogICAgPC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gewogICAgICAgICAgICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoZSkgPT4gewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgY29uc3QgZm9ybSA9IGUudGFyZ2V0OwogICAgICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7CiAgICAgICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gdXJsLm9yaWdpbjsKICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGZvcm0pOwogICAgICAgICAgICAgICAgY29uc3QganNvbk9iamVjdCA9IHt9OwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZm9ybURhdGEuZW50cmllcygpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25PYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqZWN0W2tleV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uT2JqZWN0W2tleV0ucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uT2JqZWN0W2tleV0gPSBbanNvbk9iamVjdFtrZXldLCB2YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBqc29uT2JqZWN0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBwb3N0UmVxdWVzdENvbmZpZyA9IHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIgfSwKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShqc29uT2JqZWN0KQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZldGNoKGAke2Jhc2VVcmx9L2FwaS9taWNyb3NlcnZpY2UvdjEvaHRtbGAsIHBvc3RSZXF1ZXN0Q29uZmlnKQogICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpCiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmVyQ29uZmlnRm9ybScpOwogICAgICAgICAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGhhbmRsZVN1Ym1pdCk7CiAgICAgICAgfSk7CiAgICA8L3NjcmlwdD4KPC9ib2R5PgoKPC9odG1sPg==", "mimeType": "text/html", "extension": "html"}}
\ No newline at end of file
diff --git a/webpack.config.js b/webpack.config.js
index ddb1519..b10b68c 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -1,8 +1,9 @@
-const TerserPlugin = require('terser-webpack-plugin');
-const path = require('path');
+const TerserPlugin = require('terser-webpack-plugin')
+const ESLintPlugin = require('eslint-webpack-plugin')
+const path = require('path')
-const BUILD_DIR = path.resolve(__dirname, 'build');
-const SRC_DIR = path.resolve(__dirname, 'src');
+const BUILD_DIR = path.resolve(__dirname, 'build')
+const SRC_DIR = path.resolve(__dirname, 'src')
module.exports = {
mode: 'production',
@@ -10,7 +11,7 @@ module.exports = {
entry: [`${SRC_DIR}/index.js`],
output: {
path: BUILD_DIR,
- filename: 'index.js',
+ filename: 'index.js'
},
optimization: {
minimize: true,
@@ -18,36 +19,43 @@ module.exports = {
new TerserPlugin({
terserOptions: {
output: {
- comments: false,
- },
+ comments: false
+ }
}
- }),
+ })
],
- concatenateModules: true,
+ concatenateModules: true
},
+ plugins: [
+ new ESLintPlugin({
+ extensions: ['js', 'cjs', 'mjs'],
+ fix: true,
+ emitWarning: true
+ })
+ ],
module: {
rules: [
{
- enforce: 'pre',
test: /\.js$/,
exclude: /node_modules/,
- use: ['eslint-loader'],
- },
- {
- test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
- presets: ['@babel/preset-env']
- },
- },
- },
- ],
+ presets: [
+ ['@babel/preset-env', {
+ useBuiltIns: 'usage',
+ corejs: 3
+ }]
+ ]
+ }
+ }
+ }
+ ]
},
resolve: {
- extensions: ['*', '.js'],
+ extensions: ['.ts', '.js', '.json'],
fallback: {
- "url": require.resolve("url/"),
- },
+ url: require.resolve('url/')
+ }
}
-};
+}