diff --git a/.gitignore b/.gitignore index 30bf52f..c2eeb4b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ node_modules/ local/ _site/ *.private.env.json -*.env \ No newline at end of file +*.env +.clinic \ No newline at end of file diff --git a/doc/README.md b/doc/README.md index a68e385..635de20 100644 --- a/doc/README.md +++ b/doc/README.md @@ -4,6 +4,6 @@ This `doc` folder forms the basis of the **m-ld** Gateway public documentation. The folder is built using Eleventy to the `_site` folder, and then served by the running Gateway in the class `GatewayWebsite`. -cURLs in markdown files are generated from the corresponding .http files using `http-client.env.json`, please keep them in sync. +cURLs in markdown files are generated from the corresponding .http files in the `http` folder using `http-client.env.json`, please keep them in sync. All files are treated as Liquid templates. They are processed once by Eleventy, and then _again_ by the gateway – hence the occasional use of double-encoded template tags such as `{{ '{{ origin }}' }}`. \ No newline at end of file diff --git a/doc/_data/eleventyComputed.cjs b/doc/_data/eleventyComputed.cjs new file mode 100644 index 0000000..c2923a3 --- /dev/null +++ b/doc/_data/eleventyComputed.cjs @@ -0,0 +1,4 @@ +/** + * @see https://www.11ty.dev/docs/data-computed/#advanced-details + */ +module.exports = require('../_includes/http/http-client.env.json').doc; \ No newline at end of file diff --git a/doc/_includes/http/accounts/activation.http b/doc/_includes/http/accounts/activation.http new file mode 100644 index 0000000..f493cbc --- /dev/null +++ b/doc/_includes/http/accounts/activation.http @@ -0,0 +1,5 @@ +POST {{origin}}/api/v1/user/{{account}}/activation +Accept: application/json +Content-Type: application/json + +{ "email": "{{email}}" } diff --git a/doc/_includes/http/accounts/insert-remotes-auth.http b/doc/_includes/http/accounts/insert-remotes-auth.http new file mode 100644 index 0000000..da89c0a --- /dev/null +++ b/doc/_includes/http/accounts/insert-remotes-auth.http @@ -0,0 +1,6 @@ +PATCH {{origin}}/api/v1/user/{{account}} +Authorization: Basic {{digest}} +Accept: application/json +Content-Type: application/json + +{ "@insert": { "remotesAuth": "{{remotesAuth}}" } } \ No newline at end of file diff --git a/doc/_includes/http/accounts/key-using-activation.http b/doc/_includes/http/accounts/key-using-activation.http new file mode 100644 index 0000000..d67ac0b --- /dev/null +++ b/doc/_includes/http/accounts/key-using-activation.http @@ -0,0 +1,4 @@ +POST {{origin}}/api/v1/user/{{account}}/key +Authorization: Bearer {{jwe}} +X-Activation-Code: {{activation}} +Accept: application/json diff --git a/doc/_includes/http/accounts/key-using-root.http b/doc/_includes/http/accounts/key-using-root.http new file mode 100644 index 0000000..36fa22b --- /dev/null +++ b/doc/_includes/http/accounts/key-using-root.http @@ -0,0 +1,3 @@ +POST {{origin}}/api/v1/user/{{account}}/key +Authorization: Basic {{rootAccount}} {{rootKey}} +Accept: application/json diff --git a/doc/_includes/http/clone-api/async-read.http b/doc/_includes/http/clone-api/async-read.http new file mode 100644 index 0000000..c3915ef --- /dev/null +++ b/doc/_includes/http/clone-api/async-read.http @@ -0,0 +1,5 @@ +GET {{origin}}/api/v1/domain/{{account}}/{{subdomain}}/state +Authorization: Basic {{digest}} +Accept: application/json +[QueryStringParams] +q: {{read}} # to be URL-encoded as the query string \ No newline at end of file diff --git a/doc/_includes/http/clone-api/async-write.http b/doc/_includes/http/clone-api/async-write.http new file mode 100644 index 0000000..f6a1a78 --- /dev/null +++ b/doc/_includes/http/clone-api/async-write.http @@ -0,0 +1,8 @@ +POST {{origin}}/api/v1/domain/{{account}}/{{subdomain}}/state +Authorization: Basic {{digest}} +Content-Type: application/json + +{ + "@id": "Client-0005", + "company_name": "The Flintstones" +} diff --git a/doc/_includes/http/http-client.env.json b/doc/_includes/http/http-client.env.json new file mode 100644 index 0000000..3a7da60 --- /dev/null +++ b/doc/_includes/http/http-client.env.json @@ -0,0 +1,29 @@ +{ + "local": { + "origin": "http://localhost:3000", + "account": "my-account", + "remotesAuth": "anon", + "subdomain": "my-subdomain", + "read": "{\"@describe\":\"?id\",\"@where\":{\"@id\":\"?id\"}}" + }, + "doc": { + "origin": "{{ '{{ origin }}' }}", + "rootAccount": "{{ '{{ root }}' }}", + "rootKey": "≪root key≫", + "account": "≪account name≫", + "accountKey": "≪account key≫", + "email": "≪user email≫", + "jwe": "≪jwe≫", + "activation": "≪emailed activation code≫", + "remotesAuth": "≪remotes auth option≫", + "subdomain": "≪subdomain≫", + "read": "{\"@describe\":\"?id\",\"@where\":{\"@id\":\"?id\"}}", + "digest": "≪base64(≪account name≫:≪account key≫)≫" + }, + "prod": { + "origin": "https://gw.m-ld.org", + "account": "public", + "remotesAuth": "anon", + "read": "{\"@describe\":\"?id\",\"@where\":{\"@id\":\"?id\"}}" + } +} \ No newline at end of file diff --git a/doc/_includes/http/named-subdomains/create.http b/doc/_includes/http/named-subdomains/create.http new file mode 100644 index 0000000..0b8a68d --- /dev/null +++ b/doc/_includes/http/named-subdomains/create.http @@ -0,0 +1,3 @@ +PUT {{origin}}/api/v1/domain/{{account}}/{{subdomain}} +Accept: application/json +Authorization: Basic {{digest}} diff --git a/doc/_includes/http/uuid-subdomains/generate.http b/doc/_includes/http/uuid-subdomains/generate.http new file mode 100644 index 0000000..ff1f5a7 --- /dev/null +++ b/doc/_includes/http/uuid-subdomains/generate.http @@ -0,0 +1,2 @@ +POST {{origin}}/api/v1/domain/{{account}} +Accept: application/json diff --git a/doc/_includes/http/uuid-subdomains/setup.http b/doc/_includes/http/uuid-subdomains/setup.http new file mode 100644 index 0000000..5df2f83 --- /dev/null +++ b/doc/_includes/http/uuid-subdomains/setup.http @@ -0,0 +1,5 @@ +PATCH {{origin}}/api/v1/user/{{account}} +Authorization: Basic {{digest}} +Content-Type: application/json + +{ "@insert": { "naming": "uuid" } } diff --git a/doc/accounts.http b/doc/accounts.http deleted file mode 100644 index 6f4647e..0000000 --- a/doc/accounts.http +++ /dev/null @@ -1,31 +0,0 @@ -### - -POST {{gateway}}/api/v1/user/{{account}}/activation -Accept: application/json -Content-Type: application/json - -{ "email": "{{email}}" } - -### - -POST {{gateway}}/api/v1/user/{{account}}/key -Authorization: Bearer {{jwe}} -X-Activation-Code: {{activation}} -Accept: application/json - -### - -POST {{gateway}}/api/v1/user/{{account}}/key -Authorization: Basic {{rootAccount}} {{rootKey}} -Accept: application/json - -### - -PATCH {{gateway}}/api/v1/user/{{account}} -Authorization: Basic {{account}} {{accountKey}} -Accept: application/json -Content-Type: application/json - -{ "@insert": { "remotesAuth": "{{remotesAuth}}" } } - -### \ No newline at end of file diff --git a/doc/accounts.md b/doc/accounts.md index 13adb88..7d0d3f5 100644 --- a/doc/accounts.md +++ b/doc/accounts.md @@ -16,11 +16,8 @@ Account names (`≪account≫` in the below) must be composed only of **lowercas First, request an activation code with an email address. -```bash -curl -X POST --location "{{ '{{ origin }}' }}/api/v1/user/≪account≫/activation" \ - -H "Accept: application/json" \ - -H "Content-Type: application/json" \ - -d "{ \"email\": \"≪email≫\" }" +``` +{% include 'http/accounts/activation.http' %} ``` The body of the response will have the form `{ "jwe": "≪base64Binary≫" }`. The value of the `jwe` key will be used in the next step. @@ -29,11 +26,8 @@ An email will be sent to the given address, containing a six-digit activation co The account can then be created with another HTTP request: -```bash -curl -X POST --location "{{ '{{ origin }}' }}/api/v1/user/≪account≫/key" \ - -H "Authorization: Bearer ≪jwe≫" \ - -H "X-Activation-Code: ≪emailed activation code≫" \ - -H "Accept: application/json" +``` +{% include 'http/accounts/key-using-activation.http' %} ``` The body of the response will be of the form `{ "auth": { "key": "≪my-key≫" } }`, where `≪my-key≫` is the new account's authorisation key. @@ -42,10 +36,8 @@ The body of the response will be of the form `{ "auth": { "key": "≪my-key≫" The Gateway root account can be used to create any user account directly. -```bash -curl -X POST --location "{{ '{{ origin }}' }}/api/v1/user/≪account name≫/key" \ - -H "Accept: application/json" \ - --basic --user ≪root≫:≪root key≫ +``` +{% include 'http/accounts/key-using-root.http' %} ``` The body of the response will be of the form `{ "auth": { "key": "≪my-key≫" } }`, where `≪my-key≫` is the new account's authorisation key. @@ -59,12 +51,8 @@ When [connecting to subdomains](clone-subdomain), clients may need to provide au The required option can be set as follows. -```bash -curl -X PATCH --location "{{ '{{ origin }}' }}/api/v1/user/≪account name≫" \ - -H "Accept: application/json" \ - -H "Content-Type: application/json" \ - -d "{ \"@insert\": { \"remotesAuth\": \"≪remotes auth option≫\" } }" \ - --basic --user ≪account name≫:≪account key≫ +``` +{% include 'http/accounts/insert-remotes-auth.http' %} ``` You can also remove a previously-set option by including a delete clause, for example: `{ "@delete": { "remotesAuth": "jwt" } }`. \ No newline at end of file diff --git a/doc/clone-api.http b/doc/clone-api.http deleted file mode 100644 index 89ac6b7..0000000 --- a/doc/clone-api.http +++ /dev/null @@ -1,18 +0,0 @@ -### - -POST {{gateway}}/api/v1/domain/{{account}}/{{subdomain}}/state -Authorization: Basic {{account}} {{accountKey}} -Content-Type: application/json - -{ - "@id": "Client-0005", - "company_name": "The Flintstones" -} - -### - -GET {{gateway}}/api/v1/domain/{{account}}/{{subdomain}}/state?q=%7B%22%40describe%22%3A%22%3Fid%22%2C%22%40where%22%3A%7B%22%40id%22%3A%22%3Fid%22%7D%7D -Authorization: Basic {{account}} {{accountKey}} -Accept: application/json - -### \ No newline at end of file diff --git a/doc/clone-api.md b/doc/clone-api.md index 7f0335a..9149adf 100644 --- a/doc/clone-api.md +++ b/doc/clone-api.md @@ -15,30 +15,14 @@ The 'clone' (noun, not verb) API is provided for such a client to access the dat Some data can be added to the domain with: -```bash -curl -X POST --location "{{ '{{ origin }}' }}/api/v1/domain/≪account name≫/≪subdomain≫/state" \ - -H "Content-Type: application/json" \ - -d "{ - \"@id\": \"Client-0005\", - \"company_name\": \"The Flintstones\" - }" \ - --basic --user ≪account name≫:≪account key≫ +``` +{% include 'http/clone-api/async-write.http' %} ``` Data in the domain can be queried with: -```bash -curl -X GET --location "{{ '{{ origin }}' }}/api/v1/domain/≪account name≫/≪subdomain≫/state?q=%7B%22%40describe%22%3A%22%3Fid%22%2C%22%40where%22%3A%7B%22%40id%22%3A%22%3Fid%22%7D%7D" \ - -H "Accept: application/json" \ - --basic --user ≪account name≫:≪account key≫ ``` - -Note that the query string includes the URL-encoded json-rql query, for example the describe-all query: -```json -{ - "@describe": "?id", - "@where": { - "@id": "?id" - } -} +{% include 'http/clone-api/async-read.http' %} ``` + +This example query describes all the subjects in the domain, which is to say, their top-level properties. \ No newline at end of file diff --git a/doc/http-client.env.json b/doc/http-client.env.json deleted file mode 100644 index 004cb94..0000000 --- a/doc/http-client.env.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "local": { - "gateway": "http://localhost:3000", - "account": "my-account", - "remotesAuth": "anon", - "subdomain": "my-subdomain" - }, - "doc": { - "gateway": "{{ '{{ origin }}' }}", - "rootAccount": "≪root≫", - "rootKey": "≪root key≫", - "account": "≪account name≫", - "accountKey": "≪account key≫", - "email": "≪user email≫", - "jwe": "≪jwe≫", - "activation": "≪emailed activation code≫", - "remotesAuth": "≪remotes auth option≫", - "subdomain": "≪subdomain≫" - }, - "prod": { - "gateway": "https://gw.m-ld.org", - "account": "public", - "remotesAuth": "anon" - } -} \ No newline at end of file diff --git a/doc/named-subdomains.http b/doc/named-subdomains.http deleted file mode 100644 index bebac88..0000000 --- a/doc/named-subdomains.http +++ /dev/null @@ -1,7 +0,0 @@ -### - -PUT {{gateway}}/api/v1/domain/{{account}}/{{subdomain}} -Authorization: Basic {{account}} {{accountKey}} -Accept: application/json - -### \ No newline at end of file diff --git a/doc/named-subdomains.md b/doc/named-subdomains.md index 8af6361..ee1d2ce 100644 --- a/doc/named-subdomains.md +++ b/doc/named-subdomains.md @@ -12,10 +12,8 @@ To use named subdomains, you first need [an account](accounts). (If your Gateway A new domain can be created with: -```bash -curl -X PUT --location "{{ '{{ origin }}' }}/api/v1/domain/≪account name≫/≪subdomain≫" \ - -H "Accept: application/json" \ - --basic --user ≪account name≫:≪account key≫ +``` +{% include 'http/named-subdomains/create.http' %} ``` This creates the domain `≪subdomain≫` in the account. Domain names must be composed only of **lowercase** letters, numbers, hyphens `-` and underscores `_`. diff --git a/doc/self-host.md b/doc/self-host.md index 8bfc6e6..0d1c3d3 100644 --- a/doc/self-host.md +++ b/doc/self-host.md @@ -5,7 +5,7 @@ title: self-hosting setup # Hosting a Gateway ## build -```bash +``` npm run build ``` @@ -32,7 +32,7 @@ The data path can be omitted, in which case a local path will be used in an OS-s For convenience these variables can be specified in a `.env` file in the working directory. -```bash +``` npm run start -- --genesis true ``` diff --git a/doc/uuid-subdomains.http b/doc/uuid-subdomains.http deleted file mode 100644 index 4081315..0000000 --- a/doc/uuid-subdomains.http +++ /dev/null @@ -1,14 +0,0 @@ -### - -PATCH {{gateway}}/api/v1/user/{{account}} -Authorization: Basic {{account}} {{accountKey}} -Content-Type: application/json - -{ "@insert": { "naming": "uuid" } } - -### - -POST {{gateway}}/api/v1/domain/{{account}} -Accept: application/json - -### \ No newline at end of file diff --git a/doc/uuid-subdomains.md b/doc/uuid-subdomains.md index 8dc14fe..0d3fe73 100644 --- a/doc/uuid-subdomains.md +++ b/doc/uuid-subdomains.md @@ -15,11 +15,8 @@ To use UUID subdomains, you first need [an account](accounts). By default, a Gateway account only allows [named subdomains](named-subdomains). To enable UUID subdomains for an account: -```bash -curl -X PATCH --location "{{ '{{ origin }}' }}/api/v1/user/≪account name≫" \ - -H "Content-Type: application/json" \ - -d "{ \"@insert\": { \"naming\": \"uuid\" } }" \ - --basic --user ≪account name≫:≪account key≫ +``` +{% include 'http/uuid-subdomains/setup.http' %} ``` ## creating a UUID domain @@ -30,9 +27,8 @@ The domain name must take the form `≪uuid≫.my-account.my-gateway`, where ` For convenience, you can request suitable configuration for a new UUID subdomain from the Gateway, as follows. Note that this does not create anything new on the Gateway, but it will generate a compliant UUID for the domain name. -```bash -curl -X POST --location "{{ '{{ origin }}' }}/api/v1/domain/≪account name≫" \ - -H "Accept: application/json" +``` +{% include 'http/uuid-subdomains/generate.http' %} ``` With the resultant configuration (or one you have created from scratch) you can [clone the subdomain](clone-subdomain). \ No newline at end of file diff --git a/eleventy.config.cjs b/eleventy.config.cjs index 5809c24..fb2c298 100644 --- a/eleventy.config.cjs +++ b/eleventy.config.cjs @@ -2,6 +2,9 @@ const { default11tyConfig, packageDir } = require('@m-ld/io-web-build'); const syntaxHighlight = require('@11ty/eleventy-plugin-syntaxhighlight'); const { join } = require('path'); +/** + * @param {import('@11ty/eleventy').UserConfig} eleventy + */ module.exports = function (eleventy) { eleventy.ignores.add('doc/README.md'); eleventy.addPlugin(syntaxHighlight); diff --git a/package-lock.json b/package-lock.json index 75d4b88..0142c8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,16 @@ "license": "MIT", "dependencies": { "@m-ld/io-web-runtime": "^0.2.3", - "@m-ld/m-ld": "^0.10.0-edge.5", + "@m-ld/m-ld": "^0.10.0-edge.7", + "@types/cryptr": "^4.0.1", + "@types/jsonwebtoken": "^9.0.2", "@types/lru-cache": "^5.1.1", "@types/nodemailer": "^6.4.7", + "@types/restify": "^8.5.5", + "@types/restify-errors": "^4.3.4", + "@types/supertest": "^2.0.12", + "@types/tmp": "^0.2.3", + "@types/yargs": "^17.0.13", "ably": "^1.2.33", "abstract-level": "^1.0.3", "classic-level": "^1.2.0", @@ -38,19 +45,17 @@ }, "devDependencies": { "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0", + "@faker-js/faker": "^8.0.2", "@flydotio/dockerfile": "^0.3.3", "@m-ld/io-web-build": "^0.2.0-0", - "@types/cryptr": "^4.0.1", + "@m-ld/m-ld-test": "^0.1.1-edge.1", + "@orangeopensource/hurl": "^4.0.0", "@types/jest": "^29.2.4", - "@types/jsonwebtoken": "^9.0.2", - "@types/restify": "^8.5.5", - "@types/restify-errors": "^4.3.4", - "@types/supertest": "^2.0.12", - "@types/tmp": "^0.2.3", - "@types/yargs": "^17.0.13", + "@types/node-fetch-cache": "^3.0.0", "jest": "^29.3.1", "jest-mock-extended": "^3.0.1", "memory-level": "^1.0.0", + "node-fetch-cache": "^3.1.3", "supertest": "^6.3.1", "tmp": "^0.2.1", "ts-jest": "^29.0.3", @@ -922,6 +927,22 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@faker-js/faker": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.0.2.tgz", + "integrity": "sha512-Uo3pGspElQW91PCvKSIAXoEgAUlRnH29sX2/p89kg7sP1m2PzCufHINd0FhTXQf6DYGiUlVncdSPa2F9wxed2A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0", + "npm": ">=6.14.13" + } + }, "node_modules/@flydotio/dockerfile": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@flydotio/dockerfile/-/dockerfile-0.3.3.tgz", @@ -963,6 +984,12 @@ "node": ">=6" } }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -1401,13 +1428,13 @@ } }, "node_modules/@m-ld/m-ld": { - "version": "0.10.0-edge.5", - "resolved": "https://registry.npmjs.org/@m-ld/m-ld/-/m-ld-0.10.0-edge.5.tgz", - "integrity": "sha512-9DbtMZM7k+P1cCPIHGReK/tzP2uT5vgQ3vva3Y4nYElpDTA07fwwKbEIspg1NV24PhuhMpk4GQuCIyUa2pI/Jw==", + "version": "0.10.0-edge.7", + "resolved": "https://registry.npmjs.org/@m-ld/m-ld/-/m-ld-0.10.0-edge.7.tgz", + "integrity": "sha512-/NWgn+cUrXuyfBpQYOajEEG6y9ztvFny4vkUNmSSmMJJBi7wkWo4UxKGZe0RH0/WiCsllDWc5hbjGZi4escovw==", "dependencies": { "@ably/msgpack-js": "^0.4.0", "@m-ld/jsonld": "^6.0.1-m-ld.0", - "@m-ld/m-ld-spec": "^0.7.0-edge.1", + "@m-ld/m-ld-spec": "^0.7.0-edge.2", "@types/detect-node": "^2.0.0", "@types/lru-cache": "^5.1.1", "@types/requestidlecallback": "^0.3.1", @@ -1465,16 +1492,293 @@ } }, "node_modules/@m-ld/m-ld-spec": { - "version": "0.7.0-edge.1", - "resolved": "https://registry.npmjs.org/@m-ld/m-ld-spec/-/m-ld-spec-0.7.0-edge.1.tgz", - "integrity": "sha512-vDwetyq+a8XDi8LhTT96Ei7p8F8YER+azIsLrKPVaMGNkOEoa9j13iIh4O7rH7SvPpXU6pThQo0WpjVGsjT5pQ==", + "version": "0.7.0-edge.2", + "resolved": "https://registry.npmjs.org/@m-ld/m-ld-spec/-/m-ld-spec-0.7.0-edge.2.tgz", + "integrity": "sha512-M8g9aO0T/n8lFqrSKbIOqoCJV9JnnpE4gAQecOa/o2t/AQYTVAABKtZIQVsYWupaaPg/DrMJYqC/G+akLhRDsA==", "dependencies": { - "jasmine": "^4.4.0", "json-rql": "^0.6.2", - "node-fetch": "^2.6.7", "rxjs": "^7.2.0" } }, + "node_modules/@m-ld/m-ld-test": { + "version": "0.1.1-edge.1", + "resolved": "https://registry.npmjs.org/@m-ld/m-ld-test/-/m-ld-test-0.1.1-edge.1.tgz", + "integrity": "sha512-wNcSkz2ILX16kxatlDB3uS5tZd7JL0y8wBdvM/pSEXMxrIyRtONK7jI3L/vJKxv0xpZTQ4TuVgHjj4SHspCLfA==", + "dev": true, + "dependencies": { + "@m-ld/m-ld-spec": "^0.7.0-edge.2", + "@types/node-fetch": "^2.6.4", + "@types/restify-errors": "^4.3.4", + "@types/tmp": "^0.2.3", + "generic-pool": "^3.9.0", + "json-rql": "^0.6.2", + "loglevel": "^1.8.1", + "node-fetch": "^2.6.12", + "restify": "^8.6.1", + "restify-errors": "^8.0.2", + "tmp": "^0.2.1" + }, + "peerDependencies": { + "aedes": "^0.48", + "jasmine": "4" + }, + "peerDependenciesMeta": { + "aedes": { + "optional": true + }, + "jasmine": { + "optional": true + } + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/csv": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz", + "integrity": "sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==", + "dev": true, + "dependencies": { + "csv-generate": "^3.4.3", + "csv-parse": "^4.16.3", + "csv-stringify": "^5.6.5", + "stream-transform": "^2.1.3" + }, + "engines": { + "node": ">= 0.1.90" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/csv-generate": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz", + "integrity": "sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==", + "dev": true + }, + "node_modules/@m-ld/m-ld-test/node_modules/csv-parse": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", + "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==", + "dev": true + }, + "node_modules/@m-ld/m-ld-test/node_modules/csv-stringify": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz", + "integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==", + "dev": true + }, + "node_modules/@m-ld/m-ld-test/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true + }, + "node_modules/@m-ld/m-ld-test/node_modules/find-my-way": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-2.2.5.tgz", + "integrity": "sha512-GjRZZlGcGmTh9t+6Xrj5K0YprpoAFCAiCPgmAH9Kb09O4oX6hYuckDfnDipYj+Q7B1GtYWSzDI5HEecNYscLQg==", + "dev": true, + "dependencies": { + "fast-decode-uri-component": "^1.0.0", + "safe-regex2": "^2.0.0", + "semver-store": "^0.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/@m-ld/m-ld-test/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/pidusage": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", + "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/restify": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/restify/-/restify-8.6.1.tgz", + "integrity": "sha512-I54/Geo2qN4K/2Ers+zNAU/A/nwPrcoTVBVeamw/sROv/kLLuMAzidLmO3f6842tKFxxQvcNhOMYoWZAhYr3vQ==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "bunyan": "^1.8.12", + "csv": "^5.1.1", + "escape-regexp-component": "^1.0.2", + "ewma": "^2.0.1", + "find-my-way": "^2.0.1", + "formidable": "^1.2.1", + "http-signature": "^1.2.0", + "lodash": "^4.17.11", + "lru-cache": "^5.1.1", + "mime": "^2.4.3", + "negotiator": "^0.6.2", + "once": "^1.4.0", + "pidusage": "^2.0.17", + "qs": "^6.7.0", + "restify-errors": "^8.0.2", + "semver": "^6.1.1", + "send": "^0.16.2", + "spdy": "^4.0.0", + "uuid": "^3.3.2", + "vasync": "^2.2.0" + }, + "bin": { + "report-latency": "bin/report-latency" + }, + "engines": { + "node": ">=8.3.0" + }, + "optionalDependencies": { + "dtrace-provider": "^0.8.1" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/send/node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/@m-ld/m-ld-test/node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/stream-transform": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz", + "integrity": "sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==", + "dev": true, + "dependencies": { + "mixme": "^0.5.1" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/@m-ld/m-ld-test/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/@netflix/nerror": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz", @@ -1537,6 +1841,129 @@ "node": ">= 8" } }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@orangeopensource/hurl": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@orangeopensource/hurl/-/hurl-4.0.0.tgz", + "integrity": "sha512-/Bh1fEOV3SvgEypl5KPRH5t+Fizk97oHkMedkuLXHn6Nx8bDFc0MxBqIPY8ZHaK5MveO+0h627F8qO80Af0DOw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "axios": "1.1.3", + "console.table": "0.10.0", + "extract-zip": "2.0.1", + "rimraf": "3.0.2", + "tar": "6.1.12" + }, + "bin": { + "hurl": "hurl.js", + "hurlfmt": "hurlfmt.js" + } + }, + "node_modules/@orangeopensource/hurl/node_modules/axios": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", + "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@orangeopensource/hurl/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@orangeopensource/hurl/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@orangeopensource/hurl/node_modules/tar": { + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", + "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@rdfjs/types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-1.1.0.tgz", @@ -1708,7 +2135,6 @@ "version": "1.8.8", "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.8.tgz", "integrity": "sha512-Cblq+Yydg3u+sGiz2mjHjC5MPmdjY+No4qvHrF+BUhblsmSfMvsHLbOG62tPbonsqBj6sbWv1LHcsoe5Jw+/Ow==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -1732,8 +2158,7 @@ "node_modules/@types/cookiejar": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", - "dev": true + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==" }, "node_modules/@types/cors": { "version": "2.8.13", @@ -1746,8 +2171,7 @@ "node_modules/@types/cryptr": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/cryptr/-/cryptr-4.0.1.tgz", - "integrity": "sha512-Nn8fvr+8XYWK5h422lj4xQACfOg6vdhKI+Rh9ERa5Mg0cZvPL9Vn3845vSY07dNZnEs5cqkSNVMdhmf70lAYkA==", - "dev": true + "integrity": "sha512-Nn8fvr+8XYWK5h422lj4xQACfOg6vdhKI+Rh9ERa5Mg0cZvPL9Vn3845vSY07dNZnEs5cqkSNVMdhmf70lAYkA==" }, "node_modules/@types/detect-node": { "version": "2.0.0", @@ -1758,7 +2182,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-1.2.5.tgz", "integrity": "sha512-zu3mQJa4hDNubEMViSj937602XdDGzK7Q5pJ5QmLUbNxclbo9tZGt5jtwM352ssZ+pqo5V4H14TBvT/ALqQQcA==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -1873,6 +2296,15 @@ "form-data": "^3.0.0" } }, + "node_modules/@types/node-fetch-cache": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/node-fetch-cache/-/node-fetch-cache-3.0.0.tgz", + "integrity": "sha512-3kIghLlzHFvvKX4BLR7nVFBhKSaBzdveC7dutiB4MRej7qkTqDP4OLDRjh9C6atib5EM2HAIkk0yaSCveYekwg==", + "dev": true, + "dependencies": { + "@types/node-fetch": "*" + } + }, "node_modules/@types/nodemailer": { "version": "6.4.8", "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.8.tgz", @@ -1919,7 +2351,6 @@ "version": "8.5.7", "resolved": "https://registry.npmjs.org/@types/restify/-/restify-8.5.7.tgz", "integrity": "sha512-AyVCoo+28MS7FVJikENrDD4vmnF/NuShIQabT/sdy8TIt7/bi9t9EmmY9WIPlkvNyLFUEQHJry+V/8Ym7GO24w==", - "dev": true, "dependencies": { "@types/bunyan": "*", "@types/formidable": "^1", @@ -1931,7 +2362,6 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/@types/restify-errors/-/restify-errors-4.3.5.tgz", "integrity": "sha512-ug1qw2g/4ZAvETZdJJMxgvLwWblgV3EUs5qXKgBcSnWSw1QLXioakIE9QDZJgYiuyPc9Jc1A4KWSgEUidwSvqg==", - "dev": true, "dependencies": { "@types/verror": "*" } @@ -1964,7 +2394,6 @@ "version": "3.4.5", "resolved": "https://registry.npmjs.org/@types/spdy/-/spdy-3.4.5.tgz", "integrity": "sha512-/33fIRK/aqkKNxg9BSjpzt1ucmvPremgeDywm9z2C2mOlIh5Ljjvgc3UhQHqwXsSLDLHPT9jlsnrjKQ1XiVJzA==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -1979,7 +2408,6 @@ "version": "4.1.18", "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.18.tgz", "integrity": "sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w==", - "dev": true, "dependencies": { "@types/cookiejar": "*", "@types/node": "*" @@ -1989,7 +2417,6 @@ "version": "2.0.12", "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", - "dev": true, "dependencies": { "@types/superagent": "*" } @@ -1997,8 +2424,7 @@ "node_modules/@types/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA==", - "dev": true + "integrity": "sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA==" }, "node_modules/@types/valid-data-url": { "version": "2.0.0", @@ -2008,14 +2434,12 @@ "node_modules/@types/verror": { "version": "1.10.6", "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", - "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", - "dev": true + "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==" }, "node_modules/@types/yargs": { "version": "17.0.24", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, "dependencies": { "@types/yargs-parser": "*" } @@ -2023,8 +2447,17 @@ "node_modules/@types/yargs-parser": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@zeit/dns-cached-resolve": { "version": "2.1.0", @@ -2224,6 +2657,19 @@ "node": ">= 4.0.0" } }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2710,7 +3156,8 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/base64-js": { "version": "1.0.2", @@ -2803,6 +3250,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3117,6 +3565,15 @@ "ieee754": "^1.2.1" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -3165,6 +3622,65 @@ "integrity": "sha512-86FlT5+1GrsgKbPLRRY7cGDg8fsJiP/jzTqXXVqiUZZ2aZT8uemEOHlU1CDU+TxklPEZ11HZNNWclRBBecP4CQ==", "dev": true }, + "node_modules/bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "dev": true, + "engines": [ + "node >=0.10.0" + ], + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -3413,6 +3929,15 @@ "node": ">=12" } }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -3426,6 +3951,16 @@ "node": ">=12" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -3539,7 +4074,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "node_modules/concat-stream": { "version": "1.6.2", @@ -3598,6 +4134,18 @@ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, + "node_modules/console.table": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/console.table/-/console.table-0.10.0.tgz", + "integrity": "sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==", + "dev": true, + "dependencies": { + "easy-table": "1.1.0" + }, + "engines": { + "node": "> 0.10" + } + }, "node_modules/constantinople": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", @@ -3869,6 +4417,19 @@ "node": ">=0.10.0" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "optional": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -4194,6 +4755,15 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/easy-table": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz", + "integrity": "sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==", + "dev": true, + "optionalDependencies": { + "wcwidth": ">=1.0.1" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -4636,6 +5206,49 @@ "node": ">=0.10.0" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -4721,6 +5334,15 @@ "bser": "2.1.1" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fflate": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.0.tgz", @@ -4931,7 +5553,8 @@ "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==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/fsevents": { "version": "2.3.2", @@ -5033,6 +5656,15 @@ "node": ">= 4.0.0" } }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5119,6 +5751,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5754,10 +6387,17 @@ "node": ">=8" } }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "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, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -6217,23 +6857,6 @@ "node": ">=10" } }, - "node_modules/jasmine": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-4.6.0.tgz", - "integrity": "sha512-iq7HQ5M8ydNUspjd9vbFW9Lu+6lQ1QLDIqjl0WysEllF5EJZy8XaUyNlhCJVwOx2YFzqTtARWbS56F/f0PzRFw==", - "dependencies": { - "glob": "^7.1.6", - "jasmine-core": "^4.6.0" - }, - "bin": { - "jasmine": "bin/jasmine.js" - } - }, - "node_modules/jasmine-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", - "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==" - }, "node_modules/jest": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", @@ -7179,6 +7802,12 @@ "node": ">=8" } }, + "node_modules/locko": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/locko/-/locko-1.0.0.tgz", + "integrity": "sha512-eK3TW5bJs6BrjmtzEb+RSyKt48etEitQviC6A6qMMSYl0dDFl0tIOD23QV/i0/rTuuXUgSYWX1yssbtop97Gog==", + "dev": true + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -7579,6 +8208,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7617,13 +8247,49 @@ "node": ">=0.10.0" } }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "minipass": "^3.0.0" }, "engines": { "node": ">=8" @@ -7642,6 +8308,15 @@ "node": ">= 8" } }, + "node_modules/mixme": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.9.tgz", + "integrity": "sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -7793,6 +8468,51 @@ "mustache": "bin/mustache" } }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "dev": true, + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "dev": true, + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "dev": true, + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/nan": { "version": "2.17.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", @@ -7828,6 +8548,16 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "dev": true, + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -7861,6 +8591,37 @@ } } }, + "node_modules/node-fetch-cache": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/node-fetch-cache/-/node-fetch-cache-3.1.3.tgz", + "integrity": "sha512-4uoezqNAxtBozXXeUL/f9LGkEYUNp8doaBuRc/F2auQHc/5XgZTFeLCiFrSAFCbnf+KmrfQZRLPP7ETUNGP2pA==", + "dev": true, + "dependencies": { + "cacache": "^15.2.0", + "locko": "^1.0.0", + "node-fetch": "2.6.11" + } + }, + "node_modules/node-fetch-cache/node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-gyp": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", @@ -8299,6 +9060,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -8388,6 +9164,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -8447,6 +9224,12 @@ "node": ">=0.12" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -8859,6 +9642,12 @@ "any-promise": "^0.1.0" } }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -8872,6 +9661,12 @@ "node": ">= 6" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -10111,6 +10906,12 @@ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "dev": true }, + "node_modules/semver-store": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", + "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==", + "dev": true + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -11698,6 +12499,24 @@ "undeclared-identifiers": "bin.js" } }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -11902,6 +12721,16 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "optional": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -12092,6 +12921,16 @@ "node": ">=12" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -12745,6 +13584,12 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@faker-js/faker": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.0.2.tgz", + "integrity": "sha512-Uo3pGspElQW91PCvKSIAXoEgAUlRnH29sX2/p89kg7sP1m2PzCufHINd0FhTXQf6DYGiUlVncdSPa2F9wxed2A==", + "dev": true + }, "@flydotio/dockerfile": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@flydotio/dockerfile/-/dockerfile-0.3.3.tgz", @@ -12772,6 +13617,12 @@ "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==", "dev": true }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -13136,13 +13987,13 @@ } }, "@m-ld/m-ld": { - "version": "0.10.0-edge.5", - "resolved": "https://registry.npmjs.org/@m-ld/m-ld/-/m-ld-0.10.0-edge.5.tgz", - "integrity": "sha512-9DbtMZM7k+P1cCPIHGReK/tzP2uT5vgQ3vva3Y4nYElpDTA07fwwKbEIspg1NV24PhuhMpk4GQuCIyUa2pI/Jw==", + "version": "0.10.0-edge.7", + "resolved": "https://registry.npmjs.org/@m-ld/m-ld/-/m-ld-0.10.0-edge.7.tgz", + "integrity": "sha512-/NWgn+cUrXuyfBpQYOajEEG6y9ztvFny4vkUNmSSmMJJBi7wkWo4UxKGZe0RH0/WiCsllDWc5hbjGZi4escovw==", "requires": { "@ably/msgpack-js": "^0.4.0", "@m-ld/jsonld": "^6.0.1-m-ld.0", - "@m-ld/m-ld-spec": "^0.7.0-edge.1", + "@m-ld/m-ld-spec": "^0.7.0-edge.2", "@types/detect-node": "^2.0.0", "@types/lru-cache": "^5.1.1", "@types/requestidlecallback": "^0.3.1", @@ -13172,16 +14023,240 @@ } }, "@m-ld/m-ld-spec": { - "version": "0.7.0-edge.1", - "resolved": "https://registry.npmjs.org/@m-ld/m-ld-spec/-/m-ld-spec-0.7.0-edge.1.tgz", - "integrity": "sha512-vDwetyq+a8XDi8LhTT96Ei7p8F8YER+azIsLrKPVaMGNkOEoa9j13iIh4O7rH7SvPpXU6pThQo0WpjVGsjT5pQ==", + "version": "0.7.0-edge.2", + "resolved": "https://registry.npmjs.org/@m-ld/m-ld-spec/-/m-ld-spec-0.7.0-edge.2.tgz", + "integrity": "sha512-M8g9aO0T/n8lFqrSKbIOqoCJV9JnnpE4gAQecOa/o2t/AQYTVAABKtZIQVsYWupaaPg/DrMJYqC/G+akLhRDsA==", "requires": { - "jasmine": "^4.4.0", "json-rql": "^0.6.2", - "node-fetch": "^2.6.7", "rxjs": "^7.2.0" } }, + "@m-ld/m-ld-test": { + "version": "0.1.1-edge.1", + "resolved": "https://registry.npmjs.org/@m-ld/m-ld-test/-/m-ld-test-0.1.1-edge.1.tgz", + "integrity": "sha512-wNcSkz2ILX16kxatlDB3uS5tZd7JL0y8wBdvM/pSEXMxrIyRtONK7jI3L/vJKxv0xpZTQ4TuVgHjj4SHspCLfA==", + "dev": true, + "requires": { + "@m-ld/m-ld-spec": "^0.7.0-edge.2", + "@types/node-fetch": "^2.6.4", + "@types/restify-errors": "^4.3.4", + "@types/tmp": "^0.2.3", + "generic-pool": "^3.9.0", + "json-rql": "^0.6.2", + "loglevel": "^1.8.1", + "node-fetch": "^2.6.12", + "restify": "^8.6.1", + "restify-errors": "^8.0.2", + "tmp": "^0.2.1" + }, + "dependencies": { + "csv": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz", + "integrity": "sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==", + "dev": true, + "requires": { + "csv-generate": "^3.4.3", + "csv-parse": "^4.16.3", + "csv-stringify": "^5.6.5", + "stream-transform": "^2.1.3" + } + }, + "csv-generate": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz", + "integrity": "sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==", + "dev": true + }, + "csv-parse": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", + "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==", + "dev": true + }, + "csv-stringify": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz", + "integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true + }, + "find-my-way": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-2.2.5.tgz", + "integrity": "sha512-GjRZZlGcGmTh9t+6Xrj5K0YprpoAFCAiCPgmAH9Kb09O4oX6hYuckDfnDipYj+Q7B1GtYWSzDI5HEecNYscLQg==", + "dev": true, + "requires": { + "fast-decode-uri-component": "^1.0.0", + "safe-regex2": "^2.0.0", + "semver-store": "^0.3.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "pidusage": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", + "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", + "dev": true, + "requires": { + "safe-buffer": "^5.2.1" + } + }, + "restify": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/restify/-/restify-8.6.1.tgz", + "integrity": "sha512-I54/Geo2qN4K/2Ers+zNAU/A/nwPrcoTVBVeamw/sROv/kLLuMAzidLmO3f6842tKFxxQvcNhOMYoWZAhYr3vQ==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "bunyan": "^1.8.12", + "csv": "^5.1.1", + "dtrace-provider": "^0.8.1", + "escape-regexp-component": "^1.0.2", + "ewma": "^2.0.1", + "find-my-way": "^2.0.1", + "formidable": "^1.2.1", + "http-signature": "^1.2.0", + "lodash": "^4.17.11", + "lru-cache": "^5.1.1", + "mime": "^2.4.3", + "negotiator": "^0.6.2", + "once": "^1.4.0", + "pidusage": "^2.0.17", + "qs": "^6.7.0", + "restify-errors": "^8.0.2", + "semver": "^6.1.1", + "send": "^0.16.2", + "spdy": "^4.0.0", + "uuid": "^3.3.2", + "vasync": "^2.2.0" + } + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + } + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "stream-transform": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz", + "integrity": "sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==", + "dev": true, + "requires": { + "mixme": "^0.5.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, "@netflix/nerror": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz", @@ -13227,8 +14302,104 @@ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "@orangeopensource/hurl": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@orangeopensource/hurl/-/hurl-4.0.0.tgz", + "integrity": "sha512-/Bh1fEOV3SvgEypl5KPRH5t+Fizk97oHkMedkuLXHn6Nx8bDFc0MxBqIPY8ZHaK5MveO+0h627F8qO80Af0DOw==", + "dev": true, + "requires": { + "axios": "1.1.3", + "console.table": "0.10.0", + "extract-zip": "2.0.1", + "rimraf": "3.0.2", + "tar": "6.1.12" + }, + "dependencies": { + "axios": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", + "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", + "dev": true, + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "tar": { + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", + "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + } } }, "@rdfjs/types": { @@ -13377,7 +14548,6 @@ "version": "1.8.8", "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.8.tgz", "integrity": "sha512-Cblq+Yydg3u+sGiz2mjHjC5MPmdjY+No4qvHrF+BUhblsmSfMvsHLbOG62tPbonsqBj6sbWv1LHcsoe5Jw+/Ow==", - "dev": true, "requires": { "@types/node": "*" } @@ -13401,8 +14571,7 @@ "@types/cookiejar": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", - "dev": true + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==" }, "@types/cors": { "version": "2.8.13", @@ -13415,8 +14584,7 @@ "@types/cryptr": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/cryptr/-/cryptr-4.0.1.tgz", - "integrity": "sha512-Nn8fvr+8XYWK5h422lj4xQACfOg6vdhKI+Rh9ERa5Mg0cZvPL9Vn3845vSY07dNZnEs5cqkSNVMdhmf70lAYkA==", - "dev": true + "integrity": "sha512-Nn8fvr+8XYWK5h422lj4xQACfOg6vdhKI+Rh9ERa5Mg0cZvPL9Vn3845vSY07dNZnEs5cqkSNVMdhmf70lAYkA==" }, "@types/detect-node": { "version": "2.0.0", @@ -13427,7 +14595,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-1.2.5.tgz", "integrity": "sha512-zu3mQJa4hDNubEMViSj937602XdDGzK7Q5pJ5QmLUbNxclbo9tZGt5jtwM352ssZ+pqo5V4H14TBvT/ALqQQcA==", - "dev": true, "requires": { "@types/node": "*" } @@ -13542,6 +14709,15 @@ "form-data": "^3.0.0" } }, + "@types/node-fetch-cache": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/node-fetch-cache/-/node-fetch-cache-3.0.0.tgz", + "integrity": "sha512-3kIghLlzHFvvKX4BLR7nVFBhKSaBzdveC7dutiB4MRej7qkTqDP4OLDRjh9C6atib5EM2HAIkk0yaSCveYekwg==", + "dev": true, + "requires": { + "@types/node-fetch": "*" + } + }, "@types/nodemailer": { "version": "6.4.8", "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.8.tgz", @@ -13587,7 +14763,6 @@ "version": "8.5.7", "resolved": "https://registry.npmjs.org/@types/restify/-/restify-8.5.7.tgz", "integrity": "sha512-AyVCoo+28MS7FVJikENrDD4vmnF/NuShIQabT/sdy8TIt7/bi9t9EmmY9WIPlkvNyLFUEQHJry+V/8Ym7GO24w==", - "dev": true, "requires": { "@types/bunyan": "*", "@types/formidable": "^1", @@ -13599,7 +14774,6 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/@types/restify-errors/-/restify-errors-4.3.5.tgz", "integrity": "sha512-ug1qw2g/4ZAvETZdJJMxgvLwWblgV3EUs5qXKgBcSnWSw1QLXioakIE9QDZJgYiuyPc9Jc1A4KWSgEUidwSvqg==", - "dev": true, "requires": { "@types/verror": "*" } @@ -13632,7 +14806,6 @@ "version": "3.4.5", "resolved": "https://registry.npmjs.org/@types/spdy/-/spdy-3.4.5.tgz", "integrity": "sha512-/33fIRK/aqkKNxg9BSjpzt1ucmvPremgeDywm9z2C2mOlIh5Ljjvgc3UhQHqwXsSLDLHPT9jlsnrjKQ1XiVJzA==", - "dev": true, "requires": { "@types/node": "*" } @@ -13647,7 +14820,6 @@ "version": "4.1.18", "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.18.tgz", "integrity": "sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w==", - "dev": true, "requires": { "@types/cookiejar": "*", "@types/node": "*" @@ -13657,7 +14829,6 @@ "version": "2.0.12", "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", - "dev": true, "requires": { "@types/superagent": "*" } @@ -13665,8 +14836,7 @@ "@types/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA==", - "dev": true + "integrity": "sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA==" }, "@types/valid-data-url": { "version": "2.0.0", @@ -13676,14 +14846,12 @@ "@types/verror": { "version": "1.10.6", "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", - "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", - "dev": true + "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==" }, "@types/yargs": { "version": "17.0.24", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, "requires": { "@types/yargs-parser": "*" } @@ -13691,8 +14859,17 @@ "@types/yargs-parser": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } }, "@zeit/dns-cached-resolve": { "version": "2.1.0", @@ -13859,6 +15036,16 @@ "humanize-ms": "^1.2.1" } }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -14249,7 +15436,8 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "base64-js": { "version": "1.0.2", @@ -14321,6 +15509,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14594,6 +15783,12 @@ } } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -14623,6 +15818,52 @@ "integrity": "sha512-86FlT5+1GrsgKbPLRRY7cGDg8fsJiP/jzTqXXVqiUZZ2aZT8uemEOHlU1CDU+TxklPEZ11HZNNWclRBBecP4CQ==", "dev": true }, + "bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "dev": true, + "requires": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, "cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -14796,6 +16037,12 @@ "node-gyp-build": "^4.3.0" } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -14806,6 +16053,13 @@ "wrap-ansi": "^7.0.0" } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "optional": true + }, "clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -14899,7 +16153,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "concat-stream": { "version": "1.6.2", @@ -14957,6 +16212,15 @@ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, + "console.table": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/console.table/-/console.table-0.10.0.tgz", + "integrity": "sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==", + "dev": true, + "requires": { + "easy-table": "1.1.0" + } + }, "constantinople": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", @@ -15188,6 +16452,16 @@ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "optional": true, + "requires": { + "clone": "^1.0.2" + } + }, "defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -15438,6 +16712,15 @@ } } }, + "easy-table": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz", + "integrity": "sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==", + "dev": true, + "requires": { + "wcwidth": ">=1.0.1" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -15762,6 +17045,35 @@ "is-extendable": "^0.1.0" } }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -15838,6 +17150,15 @@ "bser": "2.1.1" } }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "fflate": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.0.tgz", @@ -15997,7 +17318,8 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "fsevents": { "version": "2.3.2", @@ -16079,6 +17401,12 @@ "globule": "^1.0.0" } }, + "generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "dev": true + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -16144,6 +17472,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -16619,10 +17948,17 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "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, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -16958,20 +18294,6 @@ "minimatch": "^3.1.2" } }, - "jasmine": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-4.6.0.tgz", - "integrity": "sha512-iq7HQ5M8ydNUspjd9vbFW9Lu+6lQ1QLDIqjl0WysEllF5EJZy8XaUyNlhCJVwOx2YFzqTtARWbS56F/f0PzRFw==", - "requires": { - "glob": "^7.1.6", - "jasmine-core": "^4.6.0" - } - }, - "jasmine-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", - "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==" - }, "jest": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", @@ -17708,6 +19030,12 @@ "p-locate": "^4.1.0" } }, + "locko": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/locko/-/locko-1.0.0.tgz", + "integrity": "sha512-eK3TW5bJs6BrjmtzEb+RSyKt48etEitQviC6A6qMMSYl0dDFl0tIOD23QV/i0/rTuuXUgSYWX1yssbtop97Gog==", + "dev": true + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -18019,6 +19347,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -18056,6 +19385,33 @@ "yallist": "^4.0.0" } }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -18066,6 +19422,12 @@ "yallist": "^4.0.0" } }, + "mixme": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.9.tgz", + "integrity": "sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw==", + "dev": true + }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -18195,6 +19557,44 @@ "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", "dev": true }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "dev": true, + "optional": true, + "requires": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "dev": true, + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "dev": true, + "optional": true, + "requires": { + "glob": "^6.0.1" + } + } + } + }, "nan": { "version": "2.17.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", @@ -18218,6 +19618,13 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "dev": true, + "optional": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -18237,6 +19644,28 @@ "whatwg-url": "^5.0.0" } }, + "node-fetch-cache": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/node-fetch-cache/-/node-fetch-cache-3.1.3.tgz", + "integrity": "sha512-4uoezqNAxtBozXXeUL/f9LGkEYUNp8doaBuRc/F2auQHc/5XgZTFeLCiFrSAFCbnf+KmrfQZRLPP7ETUNGP2pA==", + "dev": true, + "requires": { + "cacache": "^15.2.0", + "locko": "^1.0.0", + "node-fetch": "2.6.11" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + } + } + }, "node-gyp": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", @@ -18551,6 +19980,15 @@ } } }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -18624,7 +20062,8 @@ "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==" + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true }, "path-key": { "version": "3.1.1", @@ -18669,6 +20108,12 @@ "sha.js": "^2.4.8" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -18964,6 +20409,12 @@ "any-promise": "^0.1.0" } }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -18974,6 +20425,12 @@ "sisteransi": "^1.0.5" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -19983,6 +21440,12 @@ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "dev": true }, + "semver-store": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", + "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==", + "dev": true + }, "send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -21234,6 +22697,24 @@ "xtend": "^4.0.1" } }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -21392,6 +22873,16 @@ "minimalistic-assert": "^1.0.0" } }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "optional": true, + "requires": { + "defaults": "^1.0.3" + } + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -21540,6 +23031,16 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 6b16202..93074f4 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "start": "node ext/start.js", "clean": "rm -rf ext", "build": "tsc && npx @11ty/eleventy", + "dev": "tsc --watch", "doc-dev": "npx @11ty/eleventy --serve", "test": "node --experimental-vm-modules node_modules/.bin/jest --silent", "predocker": "cp package.json package-lock.json deploy && cd deploy && npm pack ..", @@ -33,22 +34,27 @@ "homepage": "https://github.com/m-ld/m-ld-gateway#readme", "devDependencies": { "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0", + "@faker-js/faker": "^8.0.2", "@flydotio/dockerfile": "^0.3.3", "@m-ld/io-web-build": "^0.2.0-0", + "@m-ld/m-ld-test": "^0.1.1-edge.1", + "@orangeopensource/hurl": "^4.0.0", "@types/jest": "^29.2.4", + "@types/node-fetch-cache": "^3.0.0", "jest": "^29.3.1", "jest-mock-extended": "^3.0.1", "memory-level": "^1.0.0", + "node-fetch-cache": "^3.1.3", "supertest": "^6.3.1", "tmp": "^0.2.1", "ts-jest": "^29.0.3", "typescript": "^4.9.3" }, "dependencies": { - "@types/cryptr": "^4.0.1", "@m-ld/io-web-runtime": "^0.2.3", + "@m-ld/m-ld": "^0.10.0-edge.7", + "@types/cryptr": "^4.0.1", "@types/jsonwebtoken": "^9.0.2", - "@m-ld/m-ld": "^0.10.0-edge.5", "@types/lru-cache": "^5.1.1", "@types/nodemailer": "^6.4.7", "@types/restify": "^8.5.5", diff --git a/sim/.gitignore b/sim/.gitignore new file mode 100644 index 0000000..5ef6362 --- /dev/null +++ b/sim/.gitignore @@ -0,0 +1,2 @@ +*-cache/ +gw/tmp* \ No newline at end of file diff --git a/sim/GwCmd.js b/sim/GwCmd.js new file mode 100644 index 0000000..4582071 --- /dev/null +++ b/sim/GwCmd.js @@ -0,0 +1,44 @@ +import { Cmd } from '@m-ld/m-ld-test'; +import path from 'path'; +import { createWriteStream } from 'fs'; +import { fileURLToPath } from 'url'; + +const startPath = fileURLToPath(new URL('../ext/start.js', import.meta.url)); + +export default class GwCmd extends Cmd { + /** + * @param {string} name + * @param {import('loglevel').LogLevelNames} logLevel + * @param {false | 'doctor' | 'bubbleprof'} clinic + */ + constructor({ + name = 'gw', + logLevel = undefined, + clinic = false + } = {}) { + super(name); + this.logLevel = logLevel; + this.clinic = clinic; + } + + async start() { + this.console = console; + this.dataDir = this.createDir('data'); + if (this.logLevel) { + const stdout = createWriteStream(path.join(this.dataDir, 'gw.log')); + this.childConsole = new console.Console({ stdout, stderr: process.stderr }); + } + const env = { + ...process.env, + M_LD_GATEWAY_DATA_PATH: this.dataDir, + LOG_LEVEL: this.logLevel + }; + const gwArgs = [startPath, '--genesis', 'true', { env }]; + if (this.clinic) { + await this.spawn('clinic', this.clinic, '--', 'node', ...gwArgs); + } else { + await this.fork(...gwArgs); + } + await this.findByText('Gateway initialised'); + } +} \ No newline at end of file diff --git a/sim/HttpCmd.js b/sim/HttpCmd.js new file mode 100644 index 0000000..6ae4bcd --- /dev/null +++ b/sim/HttpCmd.js @@ -0,0 +1,39 @@ +import { Cmd } from '@m-ld/m-ld-test'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const specPath = fileURLToPath(new URL('../doc/_includes/http', import.meta.url)); +export const spec = id => path.join(specPath, ...id.split('/')) + '.http'; + +// Not using npx to run hurl because it tries to debug +const hurlPath = fileURLToPath(new URL( + '../node_modules/@orangeopensource/hurl/bin/hurl', import.meta.url)); + +export default class HttpCmd extends Cmd { + constructor(origin) { + super(); + this.origin = origin; + } + + request = async (httpFilePath, variables) => { + await this.spawn( + hurlPath, httpFilePath, + '--variable', `origin=${this.origin}`, + ...(Object.entries(variables) + .map(([varName, value]) => + ['--variable', `${varName}=${value}`]) + .flat()) + ); + // Assume a result is either a single line of JSON, or nd-json + const out = await this.waitForExit(); + try { + const lines = out.split('\n'); + return lines.length === 0 ? undefined : + lines.length === 1 ? JSON.parse(lines[0]) : + lines.map(line => JSON.parse(line)); + } catch (e) { + console.error(out); + throw e; + } + }; +} \ No newline at end of file diff --git a/sim/README.md b/sim/README.md new file mode 100644 index 0000000..d7f3566 --- /dev/null +++ b/sim/README.md @@ -0,0 +1,8 @@ +# Simulation Testing + +1. Run a local gateway process (and attach a profiler) +2. Run a scenario, which may: + 1. Create an account + 2. Create a named subdomain + 3. Orchestrate clones using the subdomain + 4. Combine any of the above \ No newline at end of file diff --git a/sim/SwappUser.js b/sim/SwappUser.js new file mode 100644 index 0000000..84c3d99 --- /dev/null +++ b/sim/SwappUser.js @@ -0,0 +1,54 @@ +import { clone, uuid } from '@m-ld/m-ld'; +import { MemoryLevel } from 'memory-level'; +import { IoRemotes } from '@m-ld/m-ld/ext/socket.io'; +import { isMainThread, Worker, workerData } from 'worker_threads'; +import { setTimeout } from 'timers/promises'; +import * as swapi from './swapi.js'; +import { delayWhen, interval } from 'rxjs'; +import { faker } from '@faker-js/faker/locale/en'; + +export class SwapiUser extends Worker { + /** + * @param {import('@m-ld/m-ld').MeldConfig} config + * @param {'films' | 'people' | 'planets' | 'species' | 'starships' | 'vehicles'} resourceType + * @param {import('fs').WriteStream} stdout + */ + constructor(config, resourceType, stdout) { + const cloneId = uuid(); + super(new URL(import.meta.url), { + workerData: { + config: { + '@id': cloneId, + '@context': swapi.context, + ...config + }, + resourceType + }, stdout: true + }); + this.cloneId = cloneId; + this.stdout.pipe(stdout, { end: false }); + } +} + +if (!isMainThread) { + const { config, resourceType } = workerData; + const cloneId = config['@id']; + console.log(cloneId, 'processing', resourceType); + + const meld = await clone(new MemoryLevel(), IoRemotes, config); + console.log(cloneId, 'cloned'); + + await meld.status.becomes({ outdated: false }); + console.log(cloneId, 'up to date'); + + await swapi.resource(resourceType) + .pipe(delayWhen(() => + interval(faker.number.int({ max: 10 })))) + .forEach(film => meld.write(film)); + console.log(cloneId, 'loaded data'); + + await setTimeout(1000); + + await meld.close(); + console.log(cloneId, 'closed, will exit'); +} \ No newline at end of file diff --git a/sim/start.js b/sim/start.js new file mode 100644 index 0000000..37a23da --- /dev/null +++ b/sim/start.js @@ -0,0 +1,68 @@ +import GwCmd from './GwCmd.js'; +import HttpCmd, { spec } from './HttpCmd.js'; +import { Cmd } from '@m-ld/m-ld-test'; +import { fileURLToPath } from 'url'; +import { once } from 'events'; +import { setTimeout } from 'timers/promises'; +import { faker } from '@faker-js/faker/locale/en'; +import { createWriteStream } from 'fs'; +import path from 'path'; +import { SwapiUser } from './SwappUser.js'; + +Cmd.wd = fileURLToPath(new URL('.', import.meta.url)); + +//////////////////////////////////////////////////////////////////////////////// +// Start the gateway +const gw = new GwCmd({ clinic: false, logLevel: 'info' }); +await gw.start(); +const origin = await gw.findByPrefix('listening at '); +const { request } = new HttpCmd(origin); + +//////////////////////////////////////////////////////////////////////////////// +// Create a user account +const account = faker.internet.domainWord(); +const email = faker.internet.email(); +const { jwe } = + await request(spec('accounts/activation'), { account, email }); +const activation = await gw.findByPrefix(`code for ${email}: `); +const { auth: { key: accountKey } } = + await request(spec('accounts/key-using-activation'), { account, jwe, activation }); +const digest = Buffer.from(`${account}:${accountKey}`).toString('base64'); + +//////////////////////////////////////////////////////////////////////////////// +// Create a named subdomain +const subdomain = 'sd1'; +const config = + await request(spec('named-subdomains/create'), { account, subdomain, digest }); +config.io.uri = origin; // we want the internal URI +config.io.opts.auth.key = accountKey; +config.logLevel = 'DEBUG'; + +//////////////////////////////////////////////////////////////////////////////// +// Start some app instances to write some data +const appStdout = createWriteStream(path.join(gw.dataDir, 'app.log')); +await Promise.all([ + 'films', 'people'//, 'planets', 'species', 'starships', 'vehicles' +].map(async resourceType => { + // Jitter on the app startup + await setTimeout(faker.number.int({ max: 100 })); + const user = new SwapiUser(config, resourceType, appStdout); + await once(user, 'exit'); + console.log(user.cloneId, 'exited'); +})); +appStdout.end(); + +//////////////////////////////////////////////////////////////////////////////// +// Read the data +const data = await request(spec('clone-api/async-read'), { + account, subdomain, digest, + read: JSON.stringify({ + '@select': '?id', + '@where': { + '@id': '?id' + } + }) +}); +console.log(data.map(b => b['?id'])); + +await gw.cleanup('SIGINT'); \ No newline at end of file diff --git a/sim/swapi.js b/sim/swapi.js new file mode 100644 index 0000000..5342401 --- /dev/null +++ b/sim/swapi.js @@ -0,0 +1,29 @@ +import { fileURLToPath } from 'url'; +import { fetchBuilder, FileSystemCache } from 'node-fetch-cache'; +import { from, map, mergeMap } from 'rxjs'; + +const fetch = fetchBuilder.withCache(new FileSystemCache({ + cacheDirectory: fileURLToPath(new URL('swapi-cache', import.meta.url)) +})); + +export const context = { + '@base': 'https://swapi.dev/api/', + '@vocab': 'https://swapi.dev/#', + films: { '@type': '@id' }, + homeworld: { '@type': '@id' }, + species: { '@type': '@id' }, + starships: { '@type': '@id' }, + vehicles: { '@type': '@id' }, + planets: { '@type': '@id' }, + characters: { '@type': '@id' }, +}; + +export function resource(type) { + return from(fetch(`https://swapi.dev/api/${type}/`) + .then(res => res.json()) + .then(json => json.results) + ).pipe( + mergeMap(from), + map(resource => ({ ...resource, '@id': resource.url })) + ); +} \ No newline at end of file diff --git a/src/http/GatewayWebsite.ts b/src/http/GatewayWebsite.ts index 91d4a07..f84c08c 100644 --- a/src/http/GatewayWebsite.ts +++ b/src/http/GatewayWebsite.ts @@ -20,7 +20,7 @@ export class GatewayWebsite extends EndPoint { super(server, '', ({ useFor }) => useFor('post', plugins.bodyParser())); this.pageVars = Promise.resolve(resolveGateway(gateway.config.gateway)).then(url => ({ - origin: url.origin, domain: gateway.domainName + origin: url.origin, domain: gateway.domainName, root: gateway.rootAccountName })); } diff --git a/src/socket.io/IoService.ts b/src/socket.io/IoService.ts index 708e24b..53ddccc 100644 --- a/src/socket.io/IoService.ts +++ b/src/socket.io/IoService.ts @@ -19,6 +19,8 @@ const asHandshakeQuery = as.object({ }).unknown(); export class IoService extends IoRemotesService { + private resolveLive: Map void> = new Map; + constructor(gateway: Gateway, server: Server) { const io = new SocketIoServer(server, { cors: { origin: '*', methods: ['GET', 'POST'] } @@ -56,11 +58,16 @@ export class IoService extends IoRemotesService { } else { return next(new ForbiddenError('Unrecognised authentication')); } - // If subdomain is named, ensure it's in the cache and live - const sdc = await gateway.getSubdomain(sdId); - if (sdc == null) - return next(new NotFoundError); - await sdc.clone.status.becomes({ online: true }); + // Ensure named subdomain is in the cache and live + if (!gateway.hasClonedSubdomain(sdId)) { + const [sdc] = await Promise.all([ + gateway.getSubdomain(sdId), + new Promise(resolve => + this.resolveLive.set(sdId.toDomain(), resolve)) + ]); + if (sdc == null) + return next(new NotFoundError); + } } LOG.debug('IO authorised for', user || 'anonymous', 'in', domainName); @@ -73,4 +80,13 @@ export class IoService extends IoRemotesService { } }); } + + protected async getPresent(domain: string): Promise { + const present = await super.getPresent(domain); + if (present.length > 0) { + this.resolveLive.get(domain)?.(); + this.resolveLive.delete(domain); + } + return present; + } } \ No newline at end of file diff --git a/src/start.ts b/src/start.ts index 2a5a7ee..6823207 100644 --- a/src/start.ts +++ b/src/start.ts @@ -85,7 +85,7 @@ import { fileURLToPath } from 'url'; const { IoService } = await import('./socket.io/index.js'); const io = new IoService(gateway, server.server); io.on('error', LOG.error); - io.on('debug', LOG.debug); + io.on('debug', (...args) => LOG.debug(JSON.stringify(args))); } server.listen(config.address, async () => { diff --git a/test/http.test.ts b/test/http.test.ts index ee1f6a1..b5380fa 100644 --- a/test/http.test.ts +++ b/test/http.test.ts @@ -70,7 +70,7 @@ describe('Gateway HTTP API', () => { .expect('Transfer-Encoding', 'chunked') .expect(200, 'html'); expect(liquid.renderFileToNodeStream).toBeCalledWith('index', { - origin: 'https://ex.org', domain: 'ex.org' + origin: 'https://ex.org', domain: 'ex.org', root: 'app' }); });