diff --git a/.github/workflows/flowzone.yml b/.github/workflows/flowzone.yml index 11ae6b4a6..509125caa 100644 --- a/.github/workflows/flowzone.yml +++ b/.github/workflows/flowzone.yml @@ -21,3 +21,10 @@ jobs: secrets: inherit with: docker_images: balena/open-balena-api + docker_runs_on: > + { + "linux/amd64": ["self-hosted","X64"], + "linux/arm64": ["self-hosted","ARM64"] + } + # This allows external PRs to run custom actions so the custom actions must be safe to run in that context + restrict_custom_actions: false diff --git a/.versionbot/CHANGELOG.yml b/.versionbot/CHANGELOG.yml index 747924dbe..af4a64dbb 100644 --- a/.versionbot/CHANGELOG.yml +++ b/.versionbot/CHANGELOG.yml @@ -1,3 +1,4702 @@ +- commits: + - subject: Update grafana/loki Docker tag to v2.9.3 + hash: 91113decff4d243587dcda8b1e59235c0a7589b4 + body: | + Update grafana/loki from 2.9.2 to 2.9.3 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.15.5 + title: "" + date: 2023-12-11T20:05:15.816Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v16.0.17 + hash: db80657b22e8620ad4218d658cd68e65611a2c1c + body: | + Update balena/open-balena-base from 16.0.16 to 16.0.17 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency npm to v10.2.5 + hash: 12dc1b4934e4a50fc68841717588b8704041b964 + body: | + Update npm from 10.2.4 to 10.2.5 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-16.0.17 + title: "" + date: 2023-12-06T22:58:31.184Z + version: 14.15.4 + title: "" + date: 2023-12-07T00:02:25.067Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v16.0.16 + hash: 6a4a709e92e8b85889dcaa670fed923d5975bbc9 + body: | + Update balena/open-balena-base from 16.0.15 to 16.0.16 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: remove self-hosted Sentry config + hash: 3f390363034c3d9ceeacaa78c93ceee927a9aaff + body: | + * components can be manually configuired to point to SaaS Sentry + footer: + change-type: patch + author: ab77 + nested: [] + version: open-balena-base-16.0.16 + title: "" + date: 2023-12-05T00:24:26.689Z + version: 14.15.3 + title: "" + date: 2023-12-05T01:25:38.142Z +- commits: + - subject: Update @balena/pinejs to 15.3.28 Update @balena/pinejs from 15.3.17 to + 15.3.28 + hash: af2b69ad53be65d9f9ddb896a2a02893293585b2 + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: 14.15.2 + title: "" + date: 2023-11-30T19:39:57.253Z +- commits: + - subject: Update TypeScript to 5.3.2 + hash: 91b97a16f9c8cdc56349eac14bb2fb6bc9bc470d + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: 14.15.1 + title: "" + date: 2023-11-29T22:13:24.338Z +- commits: + - subject: Publish `balena/open-balena-api` for ARM64 + hash: fa8380615f7315b5dc85ed61d5b7e0594930ceea + body: "" + footer: + Change-type: minor + change-type: minor + Signed-off-by: fisehara + signed-off-by: fisehara + author: fisehara + nested: [] + version: 14.15.0 + title: "" + date: 2023-11-28T10:50:32.427Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v16.0.15 + hash: ebbc33a9e41e8298d00dd287d153155a8b2846cd + body: | + Update balena/open-balena-base from 16.0.13 to 16.0.15 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency node to v20.10.0 + hash: c5a98cbac21692a085efd4d6118e080a1351222e + body: | + Update node from 20.9.0 to 20.10.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-16.0.15 + title: "" + date: 2023-11-22T16:57:59.503Z + - commits: + - subject: Update dependency npm to v10.2.4 + hash: a914500d0a42a83e73c3cf65d08749ce70d84d6d + body: | + Update npm from 10.2.3 to 10.2.4 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-16.0.14 + title: "" + date: 2023-11-15T22:00:31.166Z + version: 14.14.6 + title: "" + date: 2023-11-24T12:07:23.943Z +- commits: + - subject: Update dependency rate-limiter-flexible to v3 + hash: 90efa8ab203694a2fb59dd0059d4d016b26318f5 + body: | + Update rate-limiter-flexible from 2.4.2 to 3.0.4 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.14.5 + title: "" + date: 2023-11-24T11:57:13.497Z +- commits: + - subject: Update @balena/pinejs + hash: 97f3279ded5aea0a8517d1a04ec30d7a69a913a7 + body: | + Update @balena/pinejs from 15.3.13 to 15.3.17 + footer: + Change-type: patch + change-type: patch + Signed-off-by: Harald Fischer + signed-off-by: Harald Fischer + author: Harald Fischer + nested: + - commits: + - subject: Update @balena/lint + hash: 079f1a9438c61b7642088470818ead9580eb1f85 + body: | + Update @balena/lint from 7.1.1 to 7.2.4 + footer: + Change-type: patch + change-type: patch + Signed-off-by: Harald Fischer + signed-off-by: Harald Fischer + author: Harald Fischer + nested: [] + version: pinejs-15.3.17 + title: "" + date: 2023-11-23T19:26:45.288Z + - commits: + - subject: Handling typing changes of @types/pg + hash: f7520efb9e2c44ab5ae341ad8fdd635814819eb0 + body: > + rowCount can be NULL in the case of PG returning from `LOCK` + + + Refernece: + + https://github.com/DefinitelyTyped/DefinitelyTyped/pull/66990 + + https://github.com/brianc/node-postgres/pull/2967 + + + In pinejs the case is handled and as of now we don't want to populate a breaking change by transparently push the types to callers. + footer: + Change-type: patch + change-type: patch + Signed-off-by: Harald Fischer + signed-off-by: Harald Fischer + author: Harald Fischer + nested: [] + version: pinejs-15.3.16 + title: "" + date: 2023-11-09T13:56:00.178Z + - commits: + - subject: Do not force storage class on s3 upload + hash: e72ffa55f21408996c04eab44d0013bf7a3f905d + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: pinejs-15.3.15 + title: "" + date: 2023-10-25T22:46:52.289Z + - commits: + - subject: Update dependency @types/node to v20 + hash: 86536af590e8b408e9cae3ee6e30621d6e2ae97e + body: | + Update @types/node from 18.18.6 to 20.8.7 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: pinejs-15.3.14 + title: "" + date: 2023-10-24T02:14:39.535Z + version: 14.14.4 + title: "" + date: 2023-11-23T22:57:58.394Z +- commits: + - subject: Lock file maintenance + hash: 0d77904c6730ad37c71d4c8a0f10d10987818569 + body: | + Update + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.14.3 + title: "" + date: 2023-11-13T01:27:40.781Z +- commits: + - subject: Update dependency @types/sinon to v17 + hash: 491ed13fb560c431766b53659e36ee6ce1cc68f5 + body: | + Update @types/sinon from 10.0.20 to 17.0.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.14.2 + title: "" + date: 2023-11-06T23:07:33.075Z +- commits: + - subject: Lock file maintenance + hash: 49d93cc13e8a05d6fb6ed56e5a3a0b26d1bc2d6c + body: | + Update + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.14.1 + title: "" + date: 2023-11-06T01:30:50.799Z +- commits: + - subject: Make Retry-After available to CORS browser requests + hash: 7b9734ab00613ac881ea97c63b2313e1691ca5f6 + body: "" + footer: + Change-type: minor + change-type: minor + See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers + see: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers + author: Thodoris Greasidis + nested: [] + version: 14.14.0 + title: "" + date: 2023-11-03T15:01:49.539Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v16.0.13 + hash: 8993ad8591a9e1ad0d14557160851aee9ce024e9 + body: | + Update balena/open-balena-base from 16.0.12 to 16.0.13 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency npm to v10.2.3 + hash: 01f85340e6131d54f8c6eed7a74c37ff68b8d902 + body: | + Update npm from 10.2.2 to 10.2.3 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-16.0.13 + title: "" + date: 2023-11-02T21:00:19.215Z + version: 14.13.8 + title: "" + date: 2023-11-02T22:10:39.569Z +- commits: + - subject: "rate-limiting: Use the ceiling of ms values for the Retry-After header" + hash: bdae2895e3ef0c91cd45793417169b2300a4dec9 + body: | + Previously we were rounding the value, which + could make clients relying on it to be hitting + unexpected 429s. + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: 14.13.7 + title: "" + date: 2023-11-02T16:24:08.397Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v16.0.12 + hash: 4b8702496e7fd36bac5c85463a489ee51373bc46 + body: | + Update balena/open-balena-base from 16.0.11 to 16.0.12 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency node to v20.9.0 + hash: 82aeef20c95240809512c443e59cb177db7a1f4f + body: | + Update node from 20.8.1 to 20.9.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-16.0.12 + title: "" + date: 2023-10-31T19:59:20.031Z + version: 14.13.6 + title: "" + date: 2023-10-31T21:15:51.128Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v16.0.11 + hash: e38dff86bf9422b480acf17465785a3ab843a94e + body: | + Update balena/open-balena-base from 16.0.10 to 16.0.11 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency npm to v10.2.2 + hash: 157c6b4560483f893ef763e824e522c35f55927c + body: | + Update npm from 10.2.1 to 10.2.2 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-16.0.11 + title: "" + date: 2023-10-31T19:06:09.574Z + version: 14.13.5 + title: "" + date: 2023-10-31T20:12:58.482Z +- commits: + - subject: Lock file maintenance + hash: 62c9e5c8601e9396e99b9e24cd5e1b869eee7681 + body: | + Update + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.13.4 + title: "" + date: 2023-10-30T01:30:15.493Z +- commits: + - subject: Update dependency sinon to v17 + hash: 3446a47101418744af03ed2389bee785537ded7d + body: | + Update sinon from 16.1.3 to 17.0.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.13.3 + title: "" + date: 2023-10-24T06:52:58.825Z +- commits: + - subject: Update @balena/pinejs dependency + hash: a00a9749356a4e44b7aa1bd95c783e64d49fc31e + body: | + Update @balena/pinejs from 15.3.10 to 15.3.13 + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: + - commits: + - subject: Blocks updating and creating webresources with non multipart-formdata + requests + hash: c3d6262661f2680f824790ab0d855caaeb89ec29 + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: pinejs-15.3.13 + title: "" + date: 2023-10-23T15:35:39.739Z + - commits: + - subject: Update dependency @types/websql to ^0.0.28 + hash: f1fc571c6340aaecb591ffaee446a59642bad1af + body: | + Update @types/websql from 0.0.27 to 0.0.28 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: pinejs-15.3.12 + title: "" + date: 2023-10-20T01:33:45.209Z + - commits: + - subject: Update dependency @types/method-override to ^0.0.33 + hash: c3266ad791bcc11bed607657af460b87cdba2053 + body: | + Update @types/method-override from 0.0.32 to 0.0.33 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: pinejs-15.3.11 + title: "" + date: 2023-10-20T00:15:28.695Z + version: 14.13.2 + title: "" + date: 2023-10-23T16:32:30.561Z +- commits: + - subject: Lock file maintenance + hash: 38e8e235f4ceef457caae3e2dc58762d31b897b6 + body: | + Update + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.13.1 + title: "" + date: 2023-10-23T00:10:25.372Z +- commits: + - subject: "multi-level-memoizee: Support local & global specific extra Cache + options" + hash: 3869ab9cbfda8e6e7a76be19cc3cb0a74ef743e9 + body: "" + footer: + Change-type: minor + change-type: minor + author: Thodoris Greasidis + nested: [] + version: 14.13.0 + title: "" + date: 2023-10-20T09:48:47.384Z +- commits: + - subject: Add release_asset update asset_key tests + hash: 032f5d4c42554fd94dcec6e7b24f4fe1ba33cc51 + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: 14.12.6 + title: "" + date: 2023-10-19T14:35:33.930Z +- commits: + - subject: Add cascade deletes for release assets + hash: ea858b69aafc4948ad5005b88470d670849e52b5 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: 14.12.5 + title: "" + date: 2023-10-19T13:36:08.866Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v16.0.10 + hash: 4a6796cde94e65b00d5a44f199d218866557daf5 + body: | + Update balena/open-balena-base from 16.0.9 to 16.0.10 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency node to v20.8.1 + hash: 3944159d01d942aa9ccb8aa7b1f5ccf37264cfbe + body: | + Update node from 20.8.0 to 20.8.1 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-16.0.10 + title: "" + date: 2023-10-18T21:58:04.157Z + version: 14.12.4 + title: "" + date: 2023-10-18T23:10:41.981Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v16.0.9 + hash: 3cf1c42860bd6ccdcd0ff6811b26a3746d07124e + body: | + Update balena/open-balena-base from 16.0.8 to 16.0.9 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency npm to v10.2.1 + hash: e2f7d7617d2941bafc41954c7538bef2a6909e10 + body: | + Update npm from 10.2.0 to 10.2.1 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-16.0.9 + title: "" + date: 2023-10-18T21:04:56.954Z + version: 14.12.3 + title: "" + date: 2023-10-18T22:12:44.881Z +- commits: + - subject: Fix the request.creds typings + hash: 1e6e116e14957ed516335d04a1c41473aa4e1be4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: 14.12.2 + title: "" + date: 2023-10-18T08:16:42.935Z +- commits: + - subject: Update dependency lint-staged to v15 + hash: a1d068f4de02ec0821a68d344a1c91adb5abfb55 + body: | + Update lint-staged from 14.0.1 to 15.0.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.12.1 + title: "" + date: 2023-10-18T01:42:19.918Z +- commits: + - subject: Add release_asset + hash: 113d05d4d3efe7e46f6f5cd5e7f37c17a1f7f867 + body: "" + footer: + Change-type: minor + change-type: minor + author: Otávio Jacobi + nested: [] + version: 14.12.0 + title: "" + date: 2023-10-17T14:51:35.643Z +- commits: + - subject: Increase max webresource file + hash: 8f1e91c21ad750ba8475d5ccd2ea565b0a67b71f + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: 14.11.4 + title: "" + date: 2023-10-16T16:00:14.853Z +- commits: + - subject: Bump @babel/traverse from 7.21.2 to 7.23.2 + hash: 19f8a7b4f13ed649f2ed0c6f86f7543ba3c84aaa + body: > + Bumps + [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) + from 7.21.2 to 7.23.2. + + - [Release notes](https://github.com/babel/babel/releases) + + - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) + + - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) + + + --- + + updated-dependencies: + + - dependency-name: "@babel/traverse" + dependency-type: indirect + ... + footer: + Change-type: patch + change-type: patch + Signed-off-by: dependabot[bot] + signed-off-by: dependabot[bot] + author: dependabot[bot] + nested: [] + version: 14.11.3 + title: "" + date: 2023-10-16T15:04:28.560Z +- commits: + - subject: Update grafana/loki Docker tag to v2.9.2 + hash: 8d4b57291b025566c940bb3333868b937143ab96 + body: | + Update grafana/loki from 2.9.1 to 2.9.2 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.11.2 + title: "" + date: 2023-10-16T14:15:33.918Z +- commits: + - subject: Update @balena/pinejs dependencies + hash: 542c231bdefe125324c51dfff48b7dfdb734bf14 + body: Update @balena/pinejs from 15.3.8 to 15.3.10 + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: + - commits: + - subject: Allow uploading file on resourceName and synonyms + hash: 1f6f5aa7e60fe7e6ce938b97f072d13dcaa8012c + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: pinejs-15.3.10 + title: "" + date: 2023-10-06T23:32:39.347Z + - commits: + - subject: Fix Term Forms and Synonyms on webresources models + hash: 96747c24ee17652246c7d0c4391ed5e7e6af8586 + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: pinejs-15.3.9 + title: "" + date: 2023-10-06T18:11:11.295Z + version: 14.11.1 + title: "" + date: 2023-10-11T17:39:53.216Z +- commits: + - subject: Update /os/v1/config endpoint for config.json migration + hash: 572692e301f656abdc02a0ab5ed245d3b21f3a75 + body: "" + footer: + See: https://balena.fibery.io/Work/Improvement/os-config-improving-the-interface-for-config.json-modification-901 + see: https://balena.fibery.io/Work/Improvement/os-config-improving-the-interface-for-config.json-modification-901 + Change-type: minor + change-type: minor + Signed-off-by: Christina Ying Wang + signed-off-by: Christina Ying Wang + author: Christina Ying Wang + nested: [] + version: 14.11.0 + title: "" + date: 2023-10-10T18:33:15.344Z +- commits: + - subject: "Augment supertest .expect(status) to log the response body when + failing Change-type: patch" + hash: f35ff3a1a95bd47e8154e7ed49c36506cbc8d005 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: 14.10.2 + title: "" + date: 2023-10-10T14:42:14.141Z +- commits: + - subject: Update pinejs-client-supertest to v2.0.1 + hash: f2d0a7cc73113384593d1b94ea675c86a6dd93c0 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: 14.10.1 + title: "" + date: 2023-10-10T14:08:33.685Z +- commits: + - subject: New CONTRACT_ALLOWLIST option to limit device types/contracts + hash: 0fd8048baacc0b4327c2e370f59495adae5aaad7 + body: "" + footer: + Resolves: "#1433" + resolves: "#1433" + Change-type: minor + change-type: minor + author: Shaun Cooley + nested: [] + version: 14.10.0 + title: "" + date: 2023-10-06T16:48:03.200Z +- commits: + - subject: Bump postcss from 8.4.21 to 8.4.31 + hash: bbb3b654f57c975c5d916a99c3755e647b1b04db + body: > + Bumps [postcss](https://github.com/postcss/postcss) from 8.4.21 to + 8.4.31. + + - [Release notes](https://github.com/postcss/postcss/releases) + + - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) + + - [Commits](https://github.com/postcss/postcss/compare/8.4.21...8.4.31) + + + --- + + updated-dependencies: + + - dependency-name: postcss + dependency-type: indirect + ... + footer: + Change-type: patch + change-type: patch + Signed-off-by: dependabot[bot] + signed-off-by: dependabot[bot] + author: dependabot[bot] + nested: [] + version: 14.9.7 + title: "" + date: 2023-10-04T06:50:19.095Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v16.0.8 + hash: 3097de578c740a8592b63538e13f575bc12a914f + body: | + Update balena/open-balena-base from 16.0.7 to 16.0.8 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency npm to v10.2.0 + hash: f3008a7cbe68214b20c61b76c0e553a610466da2 + body: | + Update npm from 10.1.0 to 10.2.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-16.0.8 + title: "" + date: 2023-10-03T17:05:16.337Z + version: 14.9.6 + title: "" + date: 2023-10-03T18:12:21.427Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v16.0.7 + hash: 16de1b5d0137bb3fb641f943bf3a4636791bbb69 + body: | + Update balena/open-balena-base from 16.0.6 to 16.0.7 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Prefer using local env var values before falling back to defaults + hash: 3012af05ce93203768e661c77e4a322ac3147b85 + body: "" + footer: + Change-type: patch + change-type: patch + See: https://github.com/balena-io-modules/open-balena-base/pull/316/files#diff-95ccd7ac2401d4f914cf825fabd8648b9db8a1f5436aafcedf3a640e9a1b73b6R376-R378 + see: https://github.com/balena-io-modules/open-balena-base/pull/316/files#diff-95ccd7ac2401d4f914cf825fabd8648b9db8a1f5436aafcedf3a640e9a1b73b6R376-R378 + author: Thodoris Greasidis + nested: [] + version: open-balena-base-16.0.7 + title: "" + date: 2023-10-02T14:41:18.394Z + version: 14.9.5 + title: "" + date: 2023-10-03T12:12:37.079Z +- commits: + - subject: Update dependency @balena/pinejs-webresource-cloudfront to ^0.0.5 + hash: e7f06626c35221e726f4b934bd07f69bc497916b + body: | + Update @balena/pinejs-webresource-cloudfront from 0.0.4 to 0.0.5 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.9.4 + title: "" + date: 2023-10-03T11:03:40.248Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v16.0.6 + hash: e919ffc74ca14e90317e1afafdeafbcf05971c7b + body: | + Update balena/open-balena-base from 16.0.1 to 16.0.6 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency node to v20.8.0 + hash: 84dcf871b68935e6c4c43682edd24b53f5c34e2e + body: | + Update node from 20.7.0 to 20.8.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-16.0.6 + title: "" + date: 2023-09-29T04:01:35.850Z + - commits: + - subject: Build confd from source to avoid upx issues in released binaries + hash: 96e9eb4d3e94c2848ef6a5e83d51d9c71835139f + body: > + upx v3.96 (2020) fixes this issue, but that was released after + the + + v0.16.0 confd release in 2018 + footer: + Resolves: https://github.com/balena-io/balena-monitor/issues/549 + resolves: https://github.com/balena-io/balena-monitor/issues/549 + Change-type: patch + change-type: patch + Signed-off-by: Kyle Harding + signed-off-by: Kyle Harding + author: Kyle Harding + nested: [] + version: open-balena-base-16.0.5 + title: "" + date: 2023-09-21T13:03:29.817Z + - commits: + - subject: Bump no-systemd image to node 20/npm 10 matching systemd + hash: 9240224742ab2b6bd0694a709df53bebd88295da + body: "" + footer: + Change-type: patch + change-type: patch + author: Page- + nested: [] + version: open-balena-base-16.0.4 + title: "" + date: 2023-09-21T11:00:30.491Z + - commits: + - subject: Update dependency node to v18.18.0 + hash: 9c41d0beafb959c21ffadbc8f8cb0cb8cf58ad8d + body: | + Update node from 18.17.1 to 18.18.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-16.0.3 + title: "" + date: 2023-09-18T23:00:07.081Z + - commits: + - subject: Update dependency node to v20.7.0 + hash: 4e0c577fe7372e90b0a8787b72a5fff41f48e4d8 + body: | + Update node from 20.6.1 to 20.7.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-16.0.2 + title: "" + date: 2023-09-18T19:08:54.386Z + version: 14.9.3 + title: "" + date: 2023-10-01T11:09:31.061Z +- commits: + - subject: Bump protobufjs from 7.2.2 to 7.2.5 + hash: 5fd34df187d5c93fc880e4732b6b8b2b28e55003 + body: > + Bumps [protobufjs](https://github.com/protobufjs/protobuf.js) from 7.2.2 + to 7.2.5. + + - [Release notes](https://github.com/protobufjs/protobuf.js/releases) + + - [Changelog](https://github.com/protobufjs/protobuf.js/blob/master/CHANGELOG.md) + + - [Commits](https://github.com/protobufjs/protobuf.js/compare/protobufjs-v7.2.2...protobufjs-v7.2.5) + + + --- + + updated-dependencies: + + - dependency-name: protobufjs + dependency-type: indirect + ... + footer: + Change-type: patch + change-type: patch + Signed-off-by: dependabot[bot] + signed-off-by: dependabot[bot] + author: dependabot[bot] + nested: [] + version: 14.9.2 + title: "" + date: 2023-10-01T10:51:21.867Z +- commits: + - subject: Update dependency sinon to v16 + hash: 4fb8a726ae15010385d23a17ea2c59510fb95fba + body: | + Update sinon from 15.0.4 to 16.0.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.9.1 + title: "" + date: 2023-10-01T10:20:27.680Z +- commits: + - subject: Add S3 webresource handler + hash: a27f4b5f79da6e996063b29908cbc3008386c14d + body: "" + footer: + Change-type: minor + change-type: minor + author: Otávio Jacobi + nested: [] + version: 14.9.0 + title: "" + date: 2023-09-29T19:49:04.807Z +- commits: + - subject: Expose the RPi family config vars to raspberrypi5 board + hash: d266a77dff93a82c9fdaac48fe198fa2b6966372 + body: "" + footer: + Change-type: minor + change-type: minor + Signed-off-by: Alex Gonzalez + signed-off-by: Alex Gonzalez + author: Alex Gonzalez + nested: [] + version: 14.8.0 + title: "" + date: 2023-09-28T11:09:31.922Z +- commits: + - subject: Check user access to the device type provided to /config/vars + hash: a0c5b7053490842dc55a657c9c7d749664cbff85 + body: "" + footer: + Change-type: patch + change-type: patch + See: https://balena.zulipchat.com/#narrow/stream/345889-balena-io.2Fos/topic/balenaOS.20for.20RPi.205.20.5BUnder.20NDA.5D/near/393642691 + see: https://balena.zulipchat.com/#narrow/stream/345889-balena-io.2Fos/topic/balenaOS.20for.20RPi.205.20.5BUnder.20NDA.5D/near/393642691 + author: Thodoris Greasidis + nested: [] + version: 14.7.1 + title: "" + date: 2023-09-28T10:29:54.567Z +- commits: + - subject: Support extending the device fields populated in the "get-state" event + hash: 9fe1e79fd23618dd374f4a9f913710ebda387954 + body: "" + footer: + Change-type: minor + change-type: minor + author: Thodoris Greasidis + nested: [] + version: 14.7.0 + title: "" + date: 2023-09-28T07:11:57.106Z +- commits: + - subject: Mark expected floating promises with the `void` operator + hash: b818913e9e0165b40dc2d07f76eadeceac2521f3 + body: | + Update @balena/lint from 7.0.2 to 7.1.1 + footer: + Change-type: patch + change-type: patch + See: https://github.com/balena-io/pinejs/pull/682#discussion_r1308867996 + see: https://github.com/balena-io/pinejs/pull/682#discussion_r1308867996 + author: Thodoris Greasidis + nested: [] + version: 14.6.1 + title: "" + date: 2023-09-27T14:31:33.890Z +- commits: + - subject: Use general Redis auth when also using the general Redis host + hash: 9d8252d80be726e69c533795a5ef19facbb76fa2 + body: "" + footer: + Resolves: balena-io#1424 + resolves: balena-io#1424 + Change-type: minor + change-type: minor + author: Shaun Cooley + nested: [] + version: 14.6.0 + title: "" + date: 2023-09-20T13:27:49.310Z +- commits: + - subject: Update grafana/loki Docker tag to v2.9.1 + hash: d5f9712ca10d320aef3e3617956728585c82005a + body: | + Update grafana/loki from 2.9.0 to 2.9.1 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.5.6 + title: "" + date: 2023-09-14T17:21:44.170Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v16.0.1 + hash: e64df56c0da52e2c517ebb7cc90c69fa506dae5d + body: | + Update balena/open-balena-base from 16.0.0 to 16.0.1 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: don't clobber existing values + hash: c7f97c2749f0b3c638a8a8686ccf9b4e36154502 + body: > + - don't overwrite existing non-null values in the API_KEYS array + with null values + footer: + change-type: patch + author: Anton Belodedenko + nested: [] + version: open-balena-base-16.0.1 + title: "" + date: 2023-09-12T23:15:08.184Z + version: 14.5.5 + title: "" + date: 2023-09-13T00:20:51.197Z +- commits: + - subject: Update open-balena-base package.json to specify nodejs 20 + hash: 30849b3c6dd1f0f8b2a275f32e0a70ef27f71013 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: 14.5.4 + title: "" + date: 2023-09-11T11:50:00.716Z +- commits: + - subject: Update open-balena-base to 16.0.0 + hash: 5fccc00a761600e78fa69de9949377f0e94db432 + body: | + Update open-balena-base from 15.1.0 to 16.0.0 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: 14.5.3 + title: "" + date: 2023-09-11T11:01:24.594Z +- commits: + - subject: Update grafana/loki Docker tag to v2.9.0 + hash: cb249b39d22cc6ba1431a868f1d3850729021754 + body: | + Update grafana/loki from 2.8.4 to 2.9.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.5.2 + title: "" + date: 2023-09-07T14:21:35.978Z +- commits: + - subject: Update @balena/pinejs dependencies + hash: f5ff89edd6eb310040d74481957f3366cc136041 + body: | + Update @balena/pinejs from 15.3.0 to 15.3.4 + footer: + Change-type: patch + change-type: patch + Signed-off-by: Harald Fischer + signed-off-by: Harald Fischer + author: Harald Fischer + nested: + - commits: + - subject: Fix skipped migrations on empty database schema + hash: b34235542b82a7d347b49f79f26be036509afd00 + body: > + On empty database schemas the `migrations` model is not + executed. + + Hence, every model migration that is executed before the `migrations` model + + will not be tracked properly. This is an edge case for empty database schemas. + footer: + Change-type: patch + change-type: patch + Signed-off-by: Harald Fischer + signed-off-by: Harald Fischer + author: Harald Fischer + nested: [] + version: pinejs-15.3.4 + title: "" + date: 2023-08-29T15:30:10.063Z + - commits: + - subject: Change S3Handler signing config from private to protected + hash: 6d7741dfe4117e937d0f4af9c6abb338beeffa89 + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: pinejs-15.3.3 + title: "" + date: 2023-08-29T13:06:53.643Z + - commits: + - subject: Fix webresource patch on not accessible/inexistent key + hash: de01723cf88ec09b422578a5ca76437fe10fdabb + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: pinejs-15.3.2 + title: "" + date: 2023-08-24T20:20:55.423Z + - commits: + - subject: "bin: Use async imports in the cli commands" + hash: 2bf7de6c60589f0b33575b7ab6f4309011fc8062 + body: "" + footer: + Change-type: patch + change-type: patch + See: https://github.com/balena-io/pinejs/pull/682#discussion_r1304255389 + see: https://github.com/balena-io/pinejs/pull/682#discussion_r1304255389 + author: Thodoris Greasidis + nested: [] + version: pinejs-15.3.1 + title: "" + date: 2023-08-24T17:46:19.792Z + version: 14.5.1 + title: "" + date: 2023-08-30T12:33:29.266Z +- commits: + - subject: Export the augmentReqApiKeyPermissions api key helper + hash: 6af0fa210aa543994040d1d53c07c80472b4a855 + body: "" + footer: + Change-type: minor + change-type: minor + author: Thodoris Greasidis + nested: [] + version: 14.5.0 + title: "" + date: 2023-08-30T06:56:30.433Z +- commits: + - subject: Use snappy compression for device logs + hash: 7bb118fd388ddf157e3e74a17208047d1673f6ff + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: 14.4.0 + title: "" + date: 2023-08-29T15:17:02.753Z +- commits: + - subject: "device-logs: Import the Loki backend asyncronoushly" + hash: fbaacfa4c856d53ea8f4ad012725cfb21e02eada + body: "" + footer: + Depends-on: https://github.com/balena-io/open-balena-api/pull/1396 + depends-on: https://github.com/balena-io/open-balena-api/pull/1396 + Change-type: patch + change-type: patch + See: https://github.com/balena-io/open-balena-api/pull/1396#discussion_r1308491416 + see: https://github.com/balena-io/open-balena-api/pull/1396#discussion_r1308491416 + author: Thodoris Greasidis + nested: [] + version: 14.3.11 + title: "" + date: 2023-08-29T14:11:51.126Z +- commits: + - subject: Update TypeScript to 5.2.2 + hash: 6743cfa7cb21ee3275de5e23c789f66a42d6b5c6 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: 14.3.10 + title: "" + date: 2023-08-29T13:44:59.187Z +- commits: + - subject: Mark runCommand & runFromCommandLine as deprecated + hash: 6f2510b24bc67b022761e0f39030e593a67ab0f3 + body: "" + footer: + Change-type: patch + change-type: patch + See: https://github.com/balena-io/open-balena-api/pull/22#pullrequestreview-171985037 + see: https://github.com/balena-io/open-balena-api/pull/22#pullrequestreview-171985037 + author: Thodoris Greasidis + nested: [] + - subject: Fix the remaining eslint errors + hash: 1d55da407633a056723187af1a65459d812e56f1 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + - subject: Properly mark floating-promise errors + hash: d5508d6bb6f8d9a519ca1489c1b02dd2b178f466 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + - subject: "scheduler: Add missing await to the unlocking phase" + hash: 08344acd3ccf8b482c9399054121f595589a61b7 + body: "" + footer: + Change-type: patch + change-type: patch + See: https://github.com/balena-io/balena-api/pull/2344/commits/a8ecb8bb36597a6cc7eea48458f23f3e8c7ff6c7 + see: https://github.com/balena-io/balena-api/pull/2344/commits/a8ecb8bb36597a6cc7eea48458f23f3e8c7ff6c7 + author: Thodoris Greasidis + nested: [] + - subject: Stop using {} as a type + hash: b362cde9fdd1da21318fdf19c18a6e1608570304 + body: | + Update @balena/abstract-sql-to-typescript to 2.1.1 + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + - subject: Switch hasOwnProperty() to Object.prototype.hasOwnProperty.call + hash: 56553f821d1beb07369398b3db7856c1a87ea82b + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + - subject: Remove unnecessary escaping from regexes + hash: 09a361909cc28145b5c06e3b80045436f8c89a9f + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + - subject: Remove not used lodash imports + hash: 663193ace07f100399e267dae14798732e624588 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + - subject: Update @balena/lint to 7.0.2 + hash: 83d96438d4998e5b694d194aef2ecb7b07248c59 + body: | + Update @balena/lint from 6.2.2 to 7.0.2 + footer: + Depends-on: https://github.com/balena-io-modules/node-balena-lint/pull/85 + depends-on: https://github.com/balena-io-modules/node-balena-lint/pull/85 + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: 14.3.9 + title: "" + date: 2023-08-29T13:32:24.240Z +- commits: + - subject: "config: Refactor the cluster mode Redis auth env var checks" + hash: 5e48b01dfe0b8e9aedb346f10f0add8603e323f1 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + - subject: Throw when the redis auth env vars are not in the expected format + hash: 847b08a2f1551c68b9cbbb695d35dee0dc841452 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + - subject: Annotate a few type-only ioredis imports as such + hash: 62bd2bcc42a96fdc47c3623d2b8402857bb2eeb8 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: 14.3.8 + title: "" + date: 2023-08-29T13:09:04.798Z +- commits: + - subject: Fix the construction of the Redis RO auth options in non-cluster mode + hash: f6d7b019ca13a76fda063b5a2766089694192a02 + body: "" + footer: + Change-type: patch + change-type: patch + See: https://github.com/balena-io/open-balena-api/pull/1399 + see: https://github.com/balena-io/open-balena-api/pull/1399 + author: Thodoris Greasidis + nested: [] + version: 14.3.7 + title: "" + date: 2023-08-29T09:51:19.877Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v15.1.0 + hash: c31603ee27f4994e64a288f7b9b85e7bdc033c7e + body: | + Update balena/open-balena-base from 15.0.5 to 15.1.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Add WEBRESOURCES_S3 ACCESS_KEY, SECRET_KEY and HOST to en configuration + hash: fddc756fe24a0e097d440da362ddc074d54bda1b + body: "" + footer: + Change-type: minor + change-type: minor + author: Otávio Jacobi + nested: [] + version: open-balena-base-15.1.0 + title: "" + date: 2023-08-24T16:35:11.511Z + version: 14.3.6 + title: "" + date: 2023-08-25T19:12:16.574Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v15.0.5 + hash: 34373974f8b57596826c643aab72d028c576215e + body: | + Update balena/open-balena-base from 15.0.4 to 15.0.5 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency node to v18.17.1 + hash: dcb6e3d103e646827312f7e33c8d5654511e25b7 + body: | + Update node from 18.17.0 to 18.17.1 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-15.0.5 + title: "" + date: 2023-08-24T15:48:28.223Z + version: 14.3.5 + title: "" + date: 2023-08-24T17:18:06.918Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v15.0.4 + hash: 67b529d9957f79e75aa713d4cf27df61d2b96bb5 + body: | + Update balena/open-balena-base from 15.0.3 to 15.0.4 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Use renovate regex annotations to manage confd releases + hash: eedbc17be7ea813b8b6880acff6bc85740559cc5 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Kyle Harding + signed-off-by: Kyle Harding + author: Kyle Harding + nested: [] + - subject: Install node and npm manually in no-systemd variant + hash: b3b1b2bcb75c6ce18dafa97b6f922ea73f88986d + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Kyle Harding + signed-off-by: Kyle Harding + author: Kyle Harding + nested: [] + - subject: Use renovate regex annotations to version node and npm + hash: 62907af9882c43306bcc2592385977550c64c022 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Kyle Harding + signed-off-by: Kyle Harding + author: Kyle Harding + nested: [] + version: open-balena-base-15.0.4 + title: "" + date: 2023-08-24T14:21:05.702Z + version: 14.3.4 + title: "" + date: 2023-08-24T15:17:29.984Z +- commits: + - subject: Enable external PRs to run custom actions + hash: ee329ee856e81db3a3bec289d002a4e2ad784e20 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: 14.3.3 + title: "" + date: 2023-08-23T15:34:26.019Z +- commits: + - subject: Make use of `.at(-1)` instead of `.length - 1` + hash: f544badbef5352db5539c48b4e71c9b3b7b15810 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: 14.3.2 + title: "" + date: 2023-08-23T14:04:31.358Z +- commits: + - subject: One additional Redis AUTH location also fixed possible 'redisAuthVar' + use before initialization + hash: 40562d2b4388f5cc529e4ae8ec27a262e58d6dff + body: "" + footer: + Change-type: patch + change-type: patch + author: Shaun Cooley + nested: [] + version: 14.3.1 + title: "" + date: 2023-08-23T13:26:51.035Z +- commits: + - subject: Add support for Redis auth + hash: 614db90f0bd25bee972b51c4924ec6872aaef481 + body: "" + footer: + Resolves: "#1397" + resolves: "#1397" + Change-type: minor + change-type: minor + author: Shaun Cooley + nested: [] + version: 14.3.0 + title: "" + date: 2023-08-22T22:00:51.387Z +- commits: + - subject: Update dependency lint-staged to v14 + hash: 646a0cb697e508cee6a9f214670f1508b8d217d0 + body: | + Update lint-staged from 13.2.1 to 14.0.1 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.2.3 + title: "" + date: 2023-08-22T07:42:13.156Z +- commits: + - subject: Remove imports from pinejs/out directory + hash: 9ac66a26f0ac83096875a8e541a51b6b6099e991 + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: 14.2.2 + title: "" + date: 2023-08-21T22:43:57.731Z +- commits: + - subject: "CI: Use pglast to validate SQL" + hash: 928a789c37918328713fa4a84d3b8a547bc5cd85 + body: "" + footer: + Change-type: patch + change-type: patch + author: Josh Bowling + nested: [] + version: 14.2.1 + title: "" + date: 2023-08-18T04:27:10.038Z +- commits: + - subject: Adds webresource typing + hash: b917b310dccf6715b9b99be008b6feebcaae65b6 + body: | + Update @balena/pinejs from 15.0.0 to 15.3.0 + footer: + Change-type: minor + change-type: minor + author: Otávio Jacobi + nested: + - commits: + - subject: Add support to WebResrouce type + hash: 9d17553b52bd105211d6c2619ccf7eeabfe4da01 + body: "" + footer: + Change-type: minor + change-type: minor + author: Otávio Jacobi + nested: [] + version: pinejs-15.3.0 + title: "" + date: 2023-08-16T21:54:26.306Z + - commits: + - subject: Mark that `tx` is always passed to `POSTRUN-ERROR` hooks + hash: 29982a40eddb816f25c61ae47b1e6a7433c2f583 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: pinejs-15.2.1 + title: "" + date: 2023-08-14T15:07:28.239Z + - commits: + - subject: Return a response even when the request resolves to an HTTP error + hash: d1d68a068778a617d7b14b12a2657fb44511ee52 + body: "" + footer: + Change-type: minor + change-type: minor + author: myarmolinsky + nested: [] + version: pinejs-15.2.0 + title: "" + date: 2023-08-02T12:11:45.279Z + - commits: + - subject: Throw a Bad Request error when passing unknown vocabulary in a request + hash: 1fb238a13d68d881a8c541845f6432480acfae9d + body: "" + footer: + Change-type: patch + change-type: patch + author: myarmolinsky + nested: [] + version: pinejs-15.1.1 + title: "" + date: 2023-08-02T12:00:01.570Z + - commits: + - subject: Update pinejs-client-core to 6.13.0 + hash: 9757808e1422074b805c57fd5b629f5b3ef6f779 + body: | + Update pinejs-client-core from 6.12.3 to 6.13.0 + footer: + Change-type: minor + change-type: minor + author: Thodoris Greasidis + nested: + - commits: + - subject: Add support for $duration + hash: 05edeeea86147ac49dd864ae6e0b46ffc73f6fc4 + body: "" + footer: + Change-type: minor + change-type: minor + author: Thodoris Greasidis + nested: [] + version: pinejs-client-js-6.13.0 + title: "" + date: 2023-07-11T13:16:05.245Z + - commits: + - subject: Avoid an unnecessary function creation on each get() call + hash: 782e43ef40a22fa4c8e0f3d64917b03e07c77522 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: pinejs-client-js-6.12.4 + title: "" + date: 2023-05-09T13:11:13.136Z + version: pinejs-15.1.0 + title: "" + date: 2023-07-11T14:03:07.450Z + - commits: + - subject: Mark the bin scripts as executable + hash: b530c6d4f5c599e517345084f2db3c544118186e + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: pinejs-15.0.5 + title: "" + date: 2023-07-07T15:40:24.029Z + - commits: + - subject: Add transaction cancelation tests for properly hooked custom endpoints + hash: dfe17f5933b2da276633ee713de5c2a0d714b656 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + - subject: Add OData request transaction cancelation tests + hash: e6a3cb5d9b6b0be45ae77f6217d4112b6c5fa0a7 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: pinejs-15.0.4 + title: "" + date: 2023-06-27T15:50:39.665Z + - commits: + - subject: Fix pinejs 15 migrations for the migrations model + hash: 2705ae109fdef70777a38aa1000d117c32b84d2f + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: pinejs-15.0.3 + title: "" + date: 2023-06-15T12:32:07.075Z + - commits: + - subject: Update TypeScript to 5.1.3 + hash: 67487ebc958401c7b20dc3b4052f2374b36548c4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: pinejs-15.0.2 + title: "" + date: 2023-06-02T14:43:20.273Z + - commits: + - subject: "Migrations.md: Add marking the sbvr field as optional on the 2nd + deploy" + hash: d6d0ded8eccc6eadb2492f4697918cf0afd00215 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: pinejs-15.0.1 + title: "" + date: 2023-05-23T09:41:23.575Z + version: 14.2.0 + title: "" + date: 2023-08-17T14:47:58.548Z +- commits: + - subject: Update grafana/loki Docker tag to v2.8.4 + hash: abc4f73b0875b66d1b5d234696f89996372a6943 + body: | + Update grafana/loki from 2.8.3 to 2.8.4 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.1.1 + title: "" + date: 2023-08-11T23:16:16.935Z +- commits: + - subject: Add /actor/v1/whoami endpoint + hash: aad908f4deb012c804947778878cbdddb05bccd7 + body: "" + footer: + Change-type: minor + change-type: minor + author: Otávio Jacobi + nested: [] + version: 14.1.0 + title: "" + date: 2023-08-02T15:30:09.471Z +- commits: + - subject: Update grafana/loki Docker tag to v2.8.3 + hash: 752dd1e116eca02572866f844e42329739bb1699 + body: | + Update grafana/loki from 2.8.2 to 2.8.3 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 14.0.4 + title: "" + date: 2023-07-21T16:19:36.316Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v15.0.3 + hash: 34c422b827051979ef41c06a6306b83a09fcdbc3 + body: | + Update balena/open-balena-base from 15.0.2 to 15.0.3 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update Node.js to v18.17.0 + hash: 43e3355c0dc3af6ccf96eb177f98762fb7ee0f69 + body: | + Update node from 18.16.1 to 18.17.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-15.0.3 + title: "" + date: 2023-07-19T22:04:43.417Z + version: 14.0.3 + title: "" + date: 2023-07-19T23:17:12.251Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v15.0.2 + hash: 03b8db14f60fca4138908b4c181badfccf23a67f + body: | + Update balena/open-balena-base from 15.0.1 to 15.0.2 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency npm to v9.8.1 + hash: 14e64ec6eaccc3112f1d25a15ee1507db42c3fbb + body: | + Update npm from 9.8.0 to 9.8.1 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-15.0.2 + title: "" + date: 2023-07-19T18:00:51.261Z + version: 14.0.2 + title: "" + date: 2023-07-19T19:19:39.268Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v15.0.1 + hash: b5b8dade6fc6d4d29fe3bac89bea74a6920759ea + body: | + Update balena/open-balena-base from 15.0.0 to 15.0.1 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency node to v18.17.0 + hash: e3470e98ffc31cd64dc59a1e3590ee2733e3263b + body: | + Update node from 18.16.1 to 18.17.0 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-15.0.1 + title: "" + date: 2023-07-18T20:02:23.624Z + version: 14.0.1 + title: "" + date: 2023-07-18T21:23:29.210Z +- commits: + - subject: Use the graceful deny mechanism for device state PATCH v3 + hash: 87ecf8b1c517e16024a19cf7e6d670962b1ad411 + body: "" + footer: + Change-type: major + change-type: major + author: Thodoris Greasidis + nested: [] + version: 14.0.0 + title: "" + date: 2023-07-17T09:17:28.212Z +- commits: + - subject: "vars-schema: Add custom DTB support for Jetson Orin Nano" + hash: 9e2d0888c62721c8ba2da3f74e515a34135c3aa7 + body: "" + footer: + Change-type: minor + change-type: minor + Signed-off-by: Alexandru Costache + signed-off-by: Alexandru Costache + author: Alexandru Costache + nested: [] + version: 13.3.0 + title: "" + date: 2023-07-12T12:39:17.390Z +- commits: + - subject: Update open-balena-base to 15.0.0 + hash: d7e618f38ff0f9f0f383dd2df337b26184d33227 + body: | + Update open-balena-base from 14.11.1 to 15.0.0 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: 13.2.2 + title: "" + date: 2023-07-10T16:06:27.594Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v14.11.1 + hash: 0235be114f64719b152021f660bec696fa93c602 + body: | + Update balena/open-balena-base from 14.11.0 to 14.11.1 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update Node.js to v18.16.1 + hash: f503c520c701649745a9f8fe16a9e00abe9330ca + body: | + Update node from 18.16.0 to 18.16.1 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-14.11.1 + title: "" + date: 2023-07-05T22:04:23.263Z + version: 13.2.1 + title: "" + date: 2023-07-05T22:29:04.126Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v14.11.0 + hash: 1d2438a962c1199b40bc7d1b54cb37f9e704cb2d + body: | + Update balena/open-balena-base from 14.10.2 to 14.11.0 + footer: + Change-type: minor + change-type: minor + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency npm to v9.8.0 + hash: 08daab22e7497506c6d426900952ed186d273b0b + body: | + Update npm from 9.7.2 to 9.8.0 + footer: + Change-type: minor + change-type: minor + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-14.11.0 + title: "" + date: 2023-07-05T21:02:09.040Z + version: 13.2.0 + title: "" + date: 2023-07-05T21:28:44.796Z +- commits: + - subject: Expose the RPi family config vars to Revolution Pi Connect and + Revolution Pi Connect S + hash: ee8d2128a8502fb5b73014dffbef9ab5f3bc3acf + body: "" + footer: + Change-type: minor + change-type: minor + Signed-off-by: Florin Sarbu + signed-off-by: Florin Sarbu + author: Florin Sarbu + nested: [] + version: 13.1.0 + title: "" + date: 2023-07-05T12:15:57.993Z +- commits: + - subject: Update dependency semver to v7.5.2 [SECURITY] + hash: 2b8ce87e54352b04c99e3050f507366747e54ef1 + body: | + Update semver from 7.5.1 to 7.5.2 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: 13.0.7 + title: "" + date: 2023-07-01T09:07:42.248Z +- commits: + - subject: Rollback device registration if the request ends/is aborted midway + hash: 828c5aedeb235f2da392bd786a1fcab167e7b51d + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: 13.0.6 + title: "" + date: 2023-06-27T13:14:11.949Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v14.10.2 + hash: 7d0c267e24dc50bb4f500093f09477d9038e2848 + body: | + Update balena/open-balena-base from 14.10.1 to 14.10.2 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency npm to v9.7.2 + hash: dc44055a7bae68fa173261103af949ca76448979 + body: | + Update npm from 9.7.1 to 9.7.2 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-14.10.2 + title: "" + date: 2023-06-21T19:00:56.925Z + version: 13.0.5 + title: "" + date: 2023-06-21T20:11:39.592Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v14.10.1 + hash: 10d1814c0b6c03045254a49fe920c5c083512ef1 + body: | + Update balena/open-balena-base from 14.10.0 to 14.10.1 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency node to v18.16.1 + hash: 37279e28a319d6594b1c5bc6e74ee779b8210ab0 + body: | + Update node from 18.16.0 to 18.16.1 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-14.10.1 + title: "" + date: 2023-06-21T11:03:53.581Z + version: 13.0.4 + title: "" + date: 2023-06-21T12:13:16.747Z +- commits: + - subject: "device-provisioning: Stop reporting conflict errors" + hash: 972230888fddc193ceec10f086af593fd692ad2a + body: "" + footer: + Change-type: patch + change-type: patch + See: https://balena.zulipchat.com/#narrow/stream/345887-aspect.2Fpeople-ops/topic/Sentry.20Billing.20changes + see: https://balena.zulipchat.com/#narrow/stream/345887-aspect.2Fpeople-ops/topic/Sentry.20Billing.20changes + author: Thodoris Greasidis + nested: [] + version: 13.0.3 + title: "" + date: 2023-06-14T12:50:05.952Z +- commits: + - subject: Combine two of the rules about supervisor releases managing devices + hash: 1dd8e416c5c6f7be9f36a02d8e0d673a152f0447 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Thodoris Greasidis + signed-off-by: Thodoris Greasidis + author: Thodoris Greasidis + nested: [] + version: 13.0.2 + title: "" + date: 2023-06-14T10:30:11.516Z +- commits: + - subject: Gracefully deny device registrations with duplicate api key + hash: 87f6127fb9f529b8ca8a4d264c5a5175db0aac1a + body: "" + footer: + Change-type: patch + change-type: patch + See: https://balena.zulipchat.com/#narrow/stream/346855-_announcements/topic/balenaCloud.20end-to-end.20tests + see: https://balena.zulipchat.com/#narrow/stream/346855-_announcements/topic/balenaCloud.20end-to-end.20tests + author: Thodoris Greasidis + nested: [] + version: 13.0.1 + title: "" + date: 2023-06-13T14:48:38.288Z +- commits: + - subject: Drop unused `device has vpn address` property + hash: 9e170fe32190032218289dec6321058aaebcd1eb + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + version: 13.0.0 + title: "" + date: 2023-06-12T12:37:06.268Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v14.10.0 + hash: a776b9f02e7a60d2c1636706a7c234e3f36a136d + body: | + Update balena/open-balena-base from 14.9.4 to 14.10.0 + footer: + Change-type: minor + change-type: minor + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Update dependency npm to v9.7.1 + hash: 6af4dabea40287d9bac00f001ea5cb2e228d2277 + body: | + Update npm from 9.6.7 to 9.7.1 + footer: + Change-type: minor + change-type: minor + author: Self-hosted Renovate Bot + nested: [] + version: open-balena-base-14.10.0 + title: "" + date: 2023-06-07T16:02:28.180Z + version: 12.1.0 + title: "" + date: 2023-06-07T17:11:51.484Z +- commits: + - subject: Clear the associated service instance when a device disconnects from it + hash: 870eebd9561d567a5926eb9fe048d8fb314285ec + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: 12.0.6 + title: "" + date: 2023-06-07T15:15:01.857Z +- commits: + - subject: Update TypeScript to 5.1.3 + hash: 754ff8ccced059c197cde47d98c8c17a184cbbff + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: 12.0.5 + title: "" + date: 2023-06-02T06:29:39.793Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v14.9.4 + hash: 4a0bce8b8b2fa5aa6cb3841b6b58e6ce287c7477 + body: | + Update balena/open-balena-base from 14.9.3 to 14.9.4 + footer: + Change-type: patch + change-type: patch + author: Self-hosted Renovate Bot + nested: + - commits: + - subject: Set systemd stopsignal to SIGRTMIN+3 + hash: 5c69245959e57bcb4c033bc027d817801f7a1428 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: open-balena-base-14.9.4 + title: "" + date: 2023-05-31T16:09:26.999Z + version: 12.0.4 + title: "" + date: 2023-05-31T17:12:42.008Z +- commits: + - subject: Add a CPU ID readable character filter + hash: 545b3d9100dad2c6cdda6c4cf89e472c6e98faa4 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: fisehara + signed-off-by: fisehara + author: fisehara + nested: [] + version: 12.0.3 + title: "" + date: 2023-05-24T13:34:29.016Z +- commits: + - subject: Update grafana/loki Docker tag to v2.8.2 + hash: 4bb921e9f2c632eb4f295ee6712abd58270f9a23 + body: | + Update grafana/loki from 2.8.1 to 2.8.2 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: 12.0.2 + title: "" + date: 2023-05-24T12:26:00.289Z +- commits: + - subject: Update balena/open-balena-base Docker tag to v14.9.3 + hash: 9ac0d952e6ef0bffd91dce3419e36d80edcd94ed + body: | + Update balena/open-balena-base from 14.9.1 to 14.9.3 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: + - commits: + - subject: Update dependency npm to v9.6.7 + hash: bac91d35160c081c4724034f4c49f26079119b04 + body: | + Update npm from 9.6.6 to 9.6.7 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: open-balena-base-14.9.3 + title: "" + date: 2023-05-18T15:18:26.274Z + - commits: + - subject: Update dependency npm to v9.6.6 + hash: 87d78dfed5c1dc471dfa6499485b9fa52d81a0ab + body: | + Update npm from 9.6.5 to 9.6.6 + footer: + Change-type: patch + change-type: patch + author: Renovate Bot + nested: [] + version: open-balena-base-14.9.2 + title: "" + date: 2023-05-03T21:18:50.684Z + version: 12.0.1 + title: "" + date: 2023-05-24T11:25:18.432Z +- commits: + - subject: Update to pinejs 15 + hash: 6db4a7e42a3f2d6acc47fa148b3f3ed425c3867f + body: | + Update @balena/abstract-sql-compiler from 8.4.1 to 9.0.2 + Update @balena/pinejs from 14.62.9 to 15.0.0 + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: + - commits: + - subject: Stop re-exporting `ODataRequest` as `HookRequest` + hash: 8df1d5c94bd19f5f347c1bf3e91cb5c8ac95f5f0 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Don't add a returning clause to requests if affectedIds has been + populated + hash: 68f857522bb6f0d2aa89505f00aca589be320c82 + body: > + This avoids unnecessary work/db traffic in the case it is not + necessary + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Remove the deprecated `data` property from `PRERESPOND` hooks + hash: ad3ed63e5a7ca5fd88734cbf5fc23dbef567f042 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Remove support for the deprecated db result form of async migrations + hash: 6db5b1f13aea948e59b6ad87ebf950cabbf2ea44 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Update grunt + hash: e2db4f242bea8ee41f93be5fa0d7ce5596e0e967 + body: > + Update grunt from 1.5.3 to 1.6.0 + + + Grunt 1.6.0 bumps node to 16 and internally rimraf to node14 what was + + a major change. + footer: + Change-type: patch + change-type: patch + Signed-off-by: Harald Fischer + signed-off-by: Harald Fischer + author: Harald Fischer + nested: [] + - subject: Do not convert `null` to the default value in `customApiKeyMiddleware` + hash: 895bd6f2fad6fe04beb7f07337041224314ea3ee + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: "Use `{ value: modelValue }` for se and odataMetadata model entries" + hash: 64ac3e20f08782339a3958e9bed0035186b388cc + body: | + This avoids putting strings directly into a JSON field + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Switch mysql `sql_mode` from `ANSI_QUOTES` to `ANSI` + hash: 346f8bd7bc6b747ccfcd9cbe4ca279fd8cda2daf + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Make `actor` a required property of the req.apiKey object + hash: afff499e39a3af115ab71d28e66a8d7966ba850e + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Change `resolveAuthHeader`/`resolveApiKey` to throw on invalid api keys + hash: df463c1f43048d28e3500717f84fe556127cf16b + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Do not bail in `resolveAuthHeader` if there is an existing api key + hash: 7aa30b4a4b5048056995b1075a1af1fb54dc3877 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Do not bail in `resolveApiKey` if there is an existing api key + hash: aaccddaa21367470e77845ce6b67b21b4dfaff60 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Treat ConceptType fields as expandable/foreign key fields as they are + hash: a9d8fe51226ffaf9b97ee3d48922c4043e0310aa + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Throw rather than warn on invalid value for `PINEJS_DEBUG` + hash: a9499391aea6bc8b10f8dd5e28731f7ebd9b9408 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Remove support for `DEBUG` env var in favor of only `PINEJS_DEBUG` + hash: b2e1c664e715ed89395b612cf79c4394b5734b18 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 + hash: c4bbef52ddcaa29eb62a048d80150a1f8d02881d + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Reflect the usage of BOOLEAN/JSON database types + hash: 1e8027b7f60dfd88858d27eb0834905131001440 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Update dependencies + hash: 208df5f0fe0abe3d3e189045dace719b45b9310f + body: | + Update @balena/abstract-sql-compiler from 8.5.0 to 9.0.2 + Update @balena/abstract-sql-to-typescript from 1.5.1 to 2.0.0 + Update @balena/odata-parser from 2.5.0 to 3.0.0 + Update @balena/odata-to-abstract-sql from 5.9.6 to 6.0.1 + Update @balena/sbvr-types from 3.5.0 to 5.0.0 + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: + - commits: + - subject: Update @balena/sbvr-types to 5.0.0 + hash: 67e4fafb3f89a05646f9911354fc74d9012c3096 + body: | + Update @balena/sbvr-types from 4.0.0 to 5.0.0 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Switch from `export =` to `export default` + hash: 6cd01340e0fee46833942691fce5a9f6a42ac104 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + version: sbvr-types-5.0.0 + title: "" + date: 2023-05-16T15:56:09.861Z + - commits: + - subject: Improve typings + hash: a5fd4a319cd0336afc5a765af9e1a1eec851f2c3 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: sbvr-types-4.0.2 + title: "" + date: 2023-05-03T11:40:24.422Z + - commits: + - subject: "boolean: Avoid unnecessary array creation to reduce GCs" + hash: 5ba948cd5f42844974d43dc19f1c371e56376fc8 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + version: sbvr-types-4.0.1 + title: "" + date: 2023-05-02T13:39:37.722Z + version: abstract-sql-compiler-9.0.2 + title: "" + date: 2023-05-16T16:05:11.077Z + - commits: + - subject: Fix TS errors for the latest sbvrTypes + hash: bb1f16713d084eaf6285138a2a587e9b36bc7759 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + nested: [] + version: abstract-sql-compiler-9.0.1 + title: "" + date: 2023-05-15T12:54:08.040Z + - commits: + - subject: Drop `require-npm4-to-publish` as `engines` used + hash: 374bc5bd42c3caac5c68608f802302674a511c23 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: fisehara + signed-off-by: fisehara + author: fisehara + nested: [] + - subject: Update @balena/odata-to-abstract-sql to 6.x + hash: e7194718065ab98328c0cb3266df9838787c08c3 + body: | + Update @balena/odata-to-abstract-sql from 5.9.3 to 6.0.1 + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: + - commits: + - subject: Update dependencies + hash: d749289e311ad22e2b09793ad1dd472762bdf402 + body: | + Update @balena/odata-parser from 2.4.6 to 3.0.0 + Update @balena/sbvr-types from 3.5.0 to 4.0.0 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Use optional chaining operator + hash: 1fb39ef2497b964af0f2cbc953a3f0843936fe02 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Set minimum supported nodejs version to 16.13.0 + hash: 91b8f51691a9649e99f2dc64253cc5ce9b59035a + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + version: odata-parser-3.0.0 + title: "" + date: 2023-04-26T14:57:49.416Z + - commits: + - subject: Update to peggy 3 and make us of the repetition operator + hash: 3d091133ca54dfba71c2bc0d17e60780fb1bda22 + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + version: odata-parser-2.5.0 + title: "" + date: 2023-04-26T11:09:24.513Z + - commits: + - subject: Add test cases for Objects in JSON validate + hash: be8fc31c3754186dd4c43ca8d4c056b0def7ffbd + body: > + As balena-lint rejects `new Boolean()`, + `new Number()` and `new String()` + constructor usage, test cases double + check that they are not instantiated as + object but primitive type. + footer: + Change-type: patch + change-type: patch + Signed-off-by: fisehara + signed-off-by: fisehara + author: fisehara + - subject: Drop `require-npm4-to-publish` devDependency + hash: 46a369117c9d1222089498a8794c32d14edef85b + body: > + As engine and npm is now required as + part of package.json we can drop this + dependency + footer: + Change-type: patch + change-type: patch + Signed-off-by: fisehara + signed-off-by: fisehara + author: fisehara + - subject: Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 + hash: 54920d701a7aa4890c27801fc5cc6b9d74ece21c + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Switch `JSON` to use `JSON` db type instead of `TEXT` + hash: 0d3561364ad018f59466c0dae9b3adb4390d9496 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Switch `Boolean` to use `BOOLEAN` db type instead of `INTEGER` + hash: 5af2bd476a9032ab5d60c163a3940e0dd8e81cc6 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Assert that JSON input typeof is object + hash: 1819ee97811e20da93c6e0f227db6a62ada8c00e + body: > + Ensure that the input passed in for JSON + types is either an object or + + an array (typeof returns 'object' for arrays as well). This change is + + mainly to prevent primitives from being stored as JSON. + footer: + Change-type: major + change-type: major + Signed-off-by: Josh Bowling + signed-off-by: Josh Bowling + author: Josh Bowling + version: sbvr-types-4.0.0 + title: "" + date: 2023-04-26T15:00:16.169Z + version: odata-to-abstract-sql-6.0.1 + title: "" + date: 2023-04-27T08:45:33.841Z + - commits: + - subject: Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 + hash: 7f6f98637339f43b34ae7faa8e868129efe6d754 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Switch `AggregateJSON` to use the newer `ReferencedField` format + hash: e8038b15c471d801b21f39cec2c95ff6689b0595 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + version: odata-to-abstract-sql-6.0.0 + title: "" + date: 2023-04-26T13:50:25.845Z + - commits: + - subject: Collapse `AliasedFunction` into `FunctionMatch` + hash: 98093a48aa75e5b8bd8eadc25ca37b53cc80ce2c + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: odata-to-abstract-sql-5.9.6 + title: "" + date: 2023-04-25T13:27:44.188Z + - commits: + - subject: Improve typings + hash: 78d4a48022ac0465c5d2c48db53b8ddd08e6e1bf + body: > + Update @balena/abstract-sql-compiler from 8.4.0 + to 8.4.1 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Add much finer grained typings for abstract-sql-optimizer + hash: 92bc7e93ca1b17401d902d66c68e090e50f70d1a + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.4.1 + title: "" + date: 2023-04-25T10:03:26.380Z + version: odata-to-abstract-sql-5.9.5 + title: "" + date: 2023-04-25T12:16:48.086Z + - commits: + - subject: Update dependencies + hash: 5aa3c51cbbfc66cddedebd41dacba5eabbacf709 + body: > + Update @balena/abstract-sql-compiler from 8.0.0 + to 8.4.0 + + Update @balena/odata-parser from 2.4.2 to 2.4.6 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Add support for using field type nodes with an AggregateJSON node + hash: 19c2760ecf76b4097d7d3045c2eefbf74fd7c2da + body: | + This also deprecates the legacy version + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.4.0 + title: "" + date: 2023-04-24T12:05:48.116Z + - commits: + - subject: Deprecate `AliasableFromTypeNodes` type as it's redundant + hash: 283da4816fe5e6d672e4959b05800861625dda99 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.13 + title: "" + date: 2023-04-24T12:00:41.593Z + - commits: + - subject: Revert tightening of `OrderBy` to only field nodes + hash: 1c25d9b8d011791a9e98a5929ad48cdd9f3bab6b + body: > + It can in fact be a lot of different + things and that is now also + + reflected in the typing + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.12 + title: "" + date: 2023-04-17T16:53:20.918Z + - commits: + - subject: Do not allow ON clauses for CROSS JOIN as it is invalid + hash: d47bf63d3a14cdbb4cb0aeb7544e41a9288699f4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Stop accepting `ExtractJSONPathAsText`/`ToJSON` as unknown node types + hash: 6fcb2c4257f9fc50f6b4b1070dec86ace9f71237 + body: > + We know what type they return and they + should be explicitly accepted as + + those types instead where it is valid to do so + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.11 + title: "" + date: 2023-04-13T11:28:36.049Z + - commits: + - subject: Fix DateNode/AnyNode typings + hash: aab549e8cf4e274a2a8b93814da393451acc4238 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.10 + title: "" + date: 2023-04-13T10:27:14.478Z + - commits: + - subject: Update dependencies + hash: 39058b2dacac51da96158d594b2d72e3238d0cbc + body: > + Update @balena/sbvr-types from 3.4.18 to + 3.5.0 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Add Big Serial type + hash: 49460ad51fcbc60f81e61329c573a1af5b207a46 + body: "" + footer: + Change-type: minor + change-type: minor + author: Josh Bowling + version: sbvr-types-3.5.0 + title: "" + date: 2023-03-21T11:16:27.398Z + - commits: + - subject: "Flowzone: Allow external contributions" + hash: 9f7bb028bbac327e6fe0711491d7c0f2c6464f98 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Josh Bowling + signed-off-by: Josh Bowling + author: Josh Bowling + version: sbvr-types-3.4.19 + title: "" + date: 2022-12-08T01:08:35.143Z + version: abstract-sql-compiler-8.3.9 + title: "" + date: 2023-04-13T10:09:53.529Z + - commits: + - subject: Improve typings + hash: 43e75ef37de956d1b583bc62b307b04e0f8455c1 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.8 + title: "" + date: 2023-04-12T17:26:10.992Z + - commits: + - subject: Remove typing for non-existent JSON node + hash: 76181d438f0f37463642704d7908c1774040c2c2 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.7 + title: "" + date: 2023-04-12T16:38:07.014Z + - commits: + - subject: Tighten the `isXValue` function typings + hash: 91485cd9c88faaaed9b1280bc34eb3a99628057e + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.6 + title: "" + date: 2023-04-12T16:18:20.829Z + - commits: + - subject: Correctly treat `Value` nodes as rewritten to `Text` by the optimizer + hash: c9dbc4cfb3fa392e87a0775accdd6811b3c273b4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Add EmbeddedTextNode typing + hash: d00ac00ca7af4d17b437c3d5511af8e506615db4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.5 + title: "" + date: 2023-04-12T16:01:45.643Z + - commits: + - subject: Enforce the first argument of ExtractJSONPathAsText is a JSON type node + hash: 08865295d4cd3ded56d77a30d33c0434e1da52b9 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.4 + title: "" + date: 2023-04-12T15:55:47.432Z + - commits: + - subject: Improve node typings + hash: 2cb83cf242052c581ee5412e3a90ed87cf5fd39e + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.3 + title: "" + date: 2023-04-12T15:43:13.357Z + - commits: + - subject: Add more node typings + hash: db162a8a4d645c2f37c968224d667ed753e534dd + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.2 + title: "" + date: 2023-04-12T15:01:22.252Z + - commits: + - subject: Add more node typings + hash: 047954b6f66abb041bee74373f37c38d71cdc4d7 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.1 + title: "" + date: 2023-04-12T13:14:25.174Z + - commits: + - subject: Support boolean nodes in a ValuesNode + hash: d589fb6cd92a3a7570e3b2ebea14acbb84807d8a + body: > + This also deprecates the legacy use of + direct true/false entries + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.0 + title: "" + date: 2023-04-11T14:56:54.403Z + - commits: + - subject: Add `Between` node type + hash: 4880072eeab6af198df47777b6579dcacc3d7fb1 + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.2.0 + title: "" + date: 2023-04-11T14:19:22.378Z + - commits: + - subject: Add `BitwiseAnd`/`BitwiseShiftRight` node types + hash: f155d1daca54086b653fa590e3248c5ef805afff + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.1.0 + title: "" + date: 2023-04-11T14:11:01.677Z + - commits: + - subject: Add `NotInNode` type + hash: 9870d746344033db53ec14fddc23a8580b863ad9 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Add `IsDistinctFromNode`/`IsNotDistinctFromNode` types + hash: 09887280a6394a61a31c955602ccb2a0fe98c9b8 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Add `CharacterLengthNode` type + hash: 1fbab42cee8128025756076dc826dacda4ea1597 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.0.2 + title: "" + date: 2023-04-06T18:12:29.893Z + - commits: + - subject: Adds Cast node type to tree parsing + hash: cbdb559bfce3c77f9bce9e07f05777f58965f324 + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: abstract-sql-compiler-8.0.1 + title: "" + date: 2023-04-06T17:59:29.723Z + - commits: + - subject: Improve typings + hash: ed5fa5675021485a775eb777f2358d8041b93ce1 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: odata-parser-2.4.6 + title: "" + date: 2023-02-24T17:02:58.272Z + - commits: + - subject: Use const/let as appropriate + hash: 0824fe7d85eeb97941319749fc802f9bae3c9fb6 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: odata-parser-2.4.5 + title: "" + date: 2023-02-23T16:31:08.299Z + - commits: + - subject: Use shorthand object notation + hash: 611c0480681965c7af06302264eac79fea18bded + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: odata-parser-2.4.4 + title: "" + date: 2023-02-23T16:26:30.639Z + - commits: + - subject: Update dependencies + hash: 25b153aca258347c6742cb8b4efe54c0ae199695 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: odata-parser-2.4.3 + title: "" + date: 2023-02-23T16:14:13.013Z + version: odata-to-abstract-sql-5.9.4 + title: "" + date: 2023-04-24T16:26:44.367Z + - subject: Remove support for the legacy AggregateJSON format of `[tableName, + fieldName]` + hash: ab90bed96cd80599f57c59f03dd02b6ac7bc6115 + body: | + Use `['ReferencedField, tableName, fieldName]` instead + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Remove support for the legacy boolean format of `true|false` + hash: 1826e6d9ad81542dd3c1123768ae926254a85a17 + body: | + Use `['Boolean', true|false]` instead + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 + hash: 62bef1d7243d256ebe270881691c6a56216c67d6 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Remove support for the legacy alias format of `[node, alias]` + hash: 52038aa06d833c1bfbc14f721e7417d4272edc28 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Remove support for the legacy table format of `tableName` + hash: 3ff760a6e360421ed1030afe355761d655408547 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Remove support for the legacy null formats of `null` and `'Null'` + hash: 166d2616b245f8593b17160722c915a5868b2b3a + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Reflect the usage of BOOLEAN db type + hash: ddab41907418024df2747fa7f630abd80d580a43 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Update @balena/sbvr-types to 4.x + hash: ff17af594020723ab91bf65aed197dc01ace7981 + body: | + Update @balena/sbvr-types from 3.5.0 to 4.0.0 + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: + - commits: + - subject: Add test cases for Objects in JSON validate + hash: be8fc31c3754186dd4c43ca8d4c056b0def7ffbd + body: > + As balena-lint rejects `new Boolean()`, `new + Number()` and `new String()` constructor usage, + test cases double check that they are not + instantiated as object but primitive type. + footer: + Change-type: patch + change-type: patch + Signed-off-by: fisehara + signed-off-by: fisehara + author: fisehara + - subject: Drop `require-npm4-to-publish` devDependency + hash: 46a369117c9d1222089498a8794c32d14edef85b + body: > + As engine and npm is now required as part of + package.json we can drop this dependency + footer: + Change-type: patch + change-type: patch + Signed-off-by: fisehara + signed-off-by: fisehara + author: fisehara + - subject: Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 + hash: 54920d701a7aa4890c27801fc5cc6b9d74ece21c + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Switch `JSON` to use `JSON` db type instead of `TEXT` + hash: 0d3561364ad018f59466c0dae9b3adb4390d9496 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Switch `Boolean` to use `BOOLEAN` db type instead of `INTEGER` + hash: 5af2bd476a9032ab5d60c163a3940e0dd8e81cc6 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Assert that JSON input typeof is object + hash: 1819ee97811e20da93c6e0f227db6a62ada8c00e + body: > + Ensure that the input passed in for JSON types + is either an object or + + an array (typeof returns 'object' for arrays as well). This change is + + mainly to prevent primitives from being stored as JSON. + footer: + Change-type: major + change-type: major + Signed-off-by: Josh Bowling + signed-off-by: Josh Bowling + author: Josh Bowling + version: sbvr-types-4.0.0 + title: "" + date: 2023-04-26T15:00:16.169Z + version: abstract-sql-compiler-9.0.0 + title: "" + date: 2023-05-02T10:21:03.552Z + - commits: + - subject: Update @balena/abstract-sql-compiler to 9.x + hash: b8b894679b4d333c5c3ff9340f8bd2696f418ca4 + body: | + Update @balena/abstract-sql-compiler from 8.4.1 to 9.0.0 + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 + hash: b5c654d5d916069f7364adf8bce65627e345f6c2 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Treat ConceptType like foreign keys, in line with pinejs 15 + hash: 9563e8a332331e4da6347da27be77a121ede2169 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + version: abstract-sql-to-typescript-2.0.0 + title: "" + date: 2023-05-02T12:03:24.262Z + - commits: + - subject: Use optional chaining operator + hash: 1fb39ef2497b964af0f2cbc953a3f0843936fe02 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Set minimum supported nodejs version to 16.13.0 + hash: 91b8f51691a9649e99f2dc64253cc5ce9b59035a + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + version: odata-parser-3.0.0 + title: "" + date: 2023-04-26T14:57:49.416Z + - commits: + - subject: Update dependencies + hash: d749289e311ad22e2b09793ad1dd472762bdf402 + body: | + Update @balena/odata-parser from 2.4.6 to 3.0.0 + Update @balena/sbvr-types from 3.5.0 to 4.0.0 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Use optional chaining operator + hash: 1fb39ef2497b964af0f2cbc953a3f0843936fe02 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Set minimum supported nodejs version to 16.13.0 + hash: 91b8f51691a9649e99f2dc64253cc5ce9b59035a + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + version: odata-parser-3.0.0 + title: "" + date: 2023-04-26T14:57:49.416Z + - commits: + - subject: Update to peggy 3 and make us of the repetition operator + hash: 3d091133ca54dfba71c2bc0d17e60780fb1bda22 + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + version: odata-parser-2.5.0 + title: "" + date: 2023-04-26T11:09:24.513Z + - commits: + - subject: Add test cases for Objects in JSON validate + hash: be8fc31c3754186dd4c43ca8d4c056b0def7ffbd + body: > + As balena-lint rejects `new Boolean()`, `new + Number()` and `new String()` constructor usage, + test cases double check that they are not + instantiated as object but primitive type. + footer: + Change-type: patch + change-type: patch + Signed-off-by: fisehara + signed-off-by: fisehara + author: fisehara + - subject: Drop `require-npm4-to-publish` devDependency + hash: 46a369117c9d1222089498a8794c32d14edef85b + body: > + As engine and npm is now required as part of + package.json we can drop this dependency + footer: + Change-type: patch + change-type: patch + Signed-off-by: fisehara + signed-off-by: fisehara + author: fisehara + - subject: Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 + hash: 54920d701a7aa4890c27801fc5cc6b9d74ece21c + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Switch `JSON` to use `JSON` db type instead of `TEXT` + hash: 0d3561364ad018f59466c0dae9b3adb4390d9496 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Switch `Boolean` to use `BOOLEAN` db type instead of `INTEGER` + hash: 5af2bd476a9032ab5d60c163a3940e0dd8e81cc6 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Assert that JSON input typeof is object + hash: 1819ee97811e20da93c6e0f227db6a62ada8c00e + body: > + Ensure that the input passed in for JSON types + is either an object or + + an array (typeof returns 'object' for arrays as well). This change is + + mainly to prevent primitives from being stored as JSON. + footer: + Change-type: major + change-type: major + Signed-off-by: Josh Bowling + signed-off-by: Josh Bowling + author: Josh Bowling + version: sbvr-types-4.0.0 + title: "" + date: 2023-04-26T15:00:16.169Z + version: odata-to-abstract-sql-6.0.1 + title: "" + date: 2023-04-27T08:45:33.841Z + - commits: + - subject: Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 + hash: 7f6f98637339f43b34ae7faa8e868129efe6d754 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + - subject: Switch `AggregateJSON` to use the newer `ReferencedField` format + hash: e8038b15c471d801b21f39cec2c95ff6689b0595 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + nested: [] + version: odata-to-abstract-sql-6.0.0 + title: "" + date: 2023-04-26T13:50:25.845Z + - commits: + - subject: Switch from `export =` to `export default` + hash: 6cd01340e0fee46833942691fce5a9f6a42ac104 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + version: sbvr-types-5.0.0 + title: "" + date: 2023-05-16T15:56:09.861Z + - commits: + - subject: Improve typings + hash: a5fd4a319cd0336afc5a765af9e1a1eec851f2c3 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: sbvr-types-4.0.2 + title: "" + date: 2023-05-03T11:40:24.422Z + - commits: + - subject: "boolean: Avoid unnecessary array creation to reduce GCs" + hash: 5ba948cd5f42844974d43dc19f1c371e56376fc8 + body: "" + footer: + Change-type: patch + change-type: patch + author: Thodoris Greasidis + version: sbvr-types-4.0.1 + title: "" + date: 2023-05-02T13:39:37.722Z + - commits: + - subject: Add test cases for Objects in JSON validate + hash: be8fc31c3754186dd4c43ca8d4c056b0def7ffbd + body: > + As balena-lint rejects `new Boolean()`, `new Number()` + and `new String()` constructor usage, test cases double + check that they are not instantiated as object but + primitive type. + footer: + Change-type: patch + change-type: patch + Signed-off-by: fisehara + signed-off-by: fisehara + author: fisehara + - subject: Drop `require-npm4-to-publish` devDependency + hash: 46a369117c9d1222089498a8794c32d14edef85b + body: > + As engine and npm is now required as part of + package.json we can drop this dependency + footer: + Change-type: patch + change-type: patch + Signed-off-by: fisehara + signed-off-by: fisehara + author: fisehara + - subject: Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 + hash: 54920d701a7aa4890c27801fc5cc6b9d74ece21c + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Switch `JSON` to use `JSON` db type instead of `TEXT` + hash: 0d3561364ad018f59466c0dae9b3adb4390d9496 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Switch `Boolean` to use `BOOLEAN` db type instead of `INTEGER` + hash: 5af2bd476a9032ab5d60c163a3940e0dd8e81cc6 + body: "" + footer: + Change-type: major + change-type: major + author: Pagan Gazzard + - subject: Assert that JSON input typeof is object + hash: 1819ee97811e20da93c6e0f227db6a62ada8c00e + body: > + Ensure that the input passed in for JSON types is either + an object or + + an array (typeof returns 'object' for arrays as well). This change is + + mainly to prevent primitives from being stored as JSON. + footer: + Change-type: major + change-type: major + Signed-off-by: Josh Bowling + signed-off-by: Josh Bowling + author: Josh Bowling + version: sbvr-types-4.0.0 + title: "" + date: 2023-04-26T15:00:16.169Z + version: pinejs-15.0.0 + title: "" + date: 2023-05-17T11:20:05.997Z + - commits: + - subject: Update async migration function typing to also accept `Promise` + hash: dc2bd3ac16550009cf9732913ad0cfbb64ad92f2 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: pinejs-14.64.1 + title: "" + date: 2023-04-27T15:47:13.055Z + - commits: + - subject: Update dependencies + hash: c75f8261660c57f06b0088e73282d830fc9cc662 + body: | + Update @balena/abstract-sql-compiler from 8.0.0 to 8.5.0 + Update @balena/abstract-sql-to-typescript from 1.4.2 to 1.5.1 + Update @balena/odata-parser from 2.4.6 to 2.5.0 + Update @balena/odata-to-abstract-sql from 5.9.2 to 5.9.6 + Update @balena/sbvr-types from 3.4.18 to 3.5.0 + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: + - commits: + - subject: Use native `StartsWith` node type for postgres + hash: 0e0055782f05eccf3d7d8bf01f2d6810e738c4e6 + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + - subject: Convert `EscapeForLike` into a standalone node type + hash: 9732e2e6e678262dfb25c8fbe5d935e4d6201296 + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.5.0 + title: "" + date: 2023-04-27T14:11:46.912Z + - commits: + - subject: Add much finer grained typings for abstract-sql-optimizer + hash: 92bc7e93ca1b17401d902d66c68e090e50f70d1a + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.4.1 + title: "" + date: 2023-04-25T10:03:26.380Z + - commits: + - subject: Add support for using field type nodes with an AggregateJSON node + hash: 19c2760ecf76b4097d7d3045c2eefbf74fd7c2da + body: | + This also deprecates the legacy version + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.4.0 + title: "" + date: 2023-04-24T12:05:48.116Z + - commits: + - subject: Deprecate `AliasableFromTypeNodes` type as it's redundant + hash: 283da4816fe5e6d672e4959b05800861625dda99 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.13 + title: "" + date: 2023-04-24T12:00:41.593Z + - commits: + - subject: Revert tightening of `OrderBy` to only field nodes + hash: 1c25d9b8d011791a9e98a5929ad48cdd9f3bab6b + body: > + It can in fact be a lot of different things and that is + now also + + reflected in the typing + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.12 + title: "" + date: 2023-04-17T16:53:20.918Z + - commits: + - subject: Do not allow ON clauses for CROSS JOIN as it is invalid + hash: d47bf63d3a14cdbb4cb0aeb7544e41a9288699f4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Stop accepting `ExtractJSONPathAsText`/`ToJSON` as unknown node types + hash: 6fcb2c4257f9fc50f6b4b1070dec86ace9f71237 + body: > + We know what type they return and they should be + explicitly accepted as + + those types instead where it is valid to do so + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.11 + title: "" + date: 2023-04-13T11:28:36.049Z + - commits: + - subject: Fix DateNode/AnyNode typings + hash: aab549e8cf4e274a2a8b93814da393451acc4238 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.10 + title: "" + date: 2023-04-13T10:27:14.478Z + - commits: + - subject: Update dependencies + hash: 39058b2dacac51da96158d594b2d72e3238d0cbc + body: | + Update @balena/sbvr-types from 3.4.18 to 3.5.0 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Add Big Serial type + hash: 49460ad51fcbc60f81e61329c573a1af5b207a46 + body: "" + footer: + Change-type: minor + change-type: minor + author: Josh Bowling + version: sbvr-types-3.5.0 + title: "" + date: 2023-03-21T11:16:27.398Z + - commits: + - subject: "Flowzone: Allow external contributions" + hash: 9f7bb028bbac327e6fe0711491d7c0f2c6464f98 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Josh Bowling + signed-off-by: Josh Bowling + author: Josh Bowling + version: sbvr-types-3.4.19 + title: "" + date: 2022-12-08T01:08:35.143Z + version: abstract-sql-compiler-8.3.9 + title: "" + date: 2023-04-13T10:09:53.529Z + - commits: + - subject: Improve typings + hash: 43e75ef37de956d1b583bc62b307b04e0f8455c1 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.8 + title: "" + date: 2023-04-12T17:26:10.992Z + - commits: + - subject: Remove typing for non-existent JSON node + hash: 76181d438f0f37463642704d7908c1774040c2c2 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.7 + title: "" + date: 2023-04-12T16:38:07.014Z + - commits: + - subject: Tighten the `isXValue` function typings + hash: 91485cd9c88faaaed9b1280bc34eb3a99628057e + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.6 + title: "" + date: 2023-04-12T16:18:20.829Z + - commits: + - subject: Correctly treat `Value` nodes as rewritten to `Text` by the optimizer + hash: c9dbc4cfb3fa392e87a0775accdd6811b3c273b4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Add EmbeddedTextNode typing + hash: d00ac00ca7af4d17b437c3d5511af8e506615db4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.5 + title: "" + date: 2023-04-12T16:01:45.643Z + - commits: + - subject: Enforce the first argument of ExtractJSONPathAsText is a JSON type node + hash: 08865295d4cd3ded56d77a30d33c0434e1da52b9 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.4 + title: "" + date: 2023-04-12T15:55:47.432Z + - commits: + - subject: Improve node typings + hash: 2cb83cf242052c581ee5412e3a90ed87cf5fd39e + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.3 + title: "" + date: 2023-04-12T15:43:13.357Z + - commits: + - subject: Add more node typings + hash: db162a8a4d645c2f37c968224d667ed753e534dd + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.2 + title: "" + date: 2023-04-12T15:01:22.252Z + - commits: + - subject: Add more node typings + hash: 047954b6f66abb041bee74373f37c38d71cdc4d7 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.1 + title: "" + date: 2023-04-12T13:14:25.174Z + - commits: + - subject: Support boolean nodes in a ValuesNode + hash: d589fb6cd92a3a7570e3b2ebea14acbb84807d8a + body: > + This also deprecates the legacy use of direct true/false + entries + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.0 + title: "" + date: 2023-04-11T14:56:54.403Z + - commits: + - subject: Add `Between` node type + hash: 4880072eeab6af198df47777b6579dcacc3d7fb1 + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.2.0 + title: "" + date: 2023-04-11T14:19:22.378Z + - commits: + - subject: Add `BitwiseAnd`/`BitwiseShiftRight` node types + hash: f155d1daca54086b653fa590e3248c5ef805afff + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.1.0 + title: "" + date: 2023-04-11T14:11:01.677Z + - commits: + - subject: Add `NotInNode` type + hash: 9870d746344033db53ec14fddc23a8580b863ad9 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Add `IsDistinctFromNode`/`IsNotDistinctFromNode` types + hash: 09887280a6394a61a31c955602ccb2a0fe98c9b8 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Add `CharacterLengthNode` type + hash: 1fbab42cee8128025756076dc826dacda4ea1597 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.0.2 + title: "" + date: 2023-04-06T18:12:29.893Z + - commits: + - subject: Adds Cast node type to tree parsing + hash: cbdb559bfce3c77f9bce9e07f05777f58965f324 + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: abstract-sql-compiler-8.0.1 + title: "" + date: 2023-04-06T17:59:29.723Z + - commits: + - subject: Update dependencies + hash: 72ae6d01ce70fbd47056042399c4d07f50e9a636 + body: | + Update @balena/abstract-sql-compiler from 8.0.0 to 8.4.1 + Update @balena/odata-to-abstract-sql from 5.9.1 to 5.9.6 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Collapse `AliasedFunction` into `FunctionMatch` + hash: 98093a48aa75e5b8bd8eadc25ca37b53cc80ce2c + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: odata-to-abstract-sql-5.9.6 + title: "" + date: 2023-04-25T13:27:44.188Z + - commits: + - subject: Improve typings + hash: 78d4a48022ac0465c5d2c48db53b8ddd08e6e1bf + body: > + Update @balena/abstract-sql-compiler from 8.4.0 + to 8.4.1 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Add much finer grained typings for abstract-sql-optimizer + hash: 92bc7e93ca1b17401d902d66c68e090e50f70d1a + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.4.1 + title: "" + date: 2023-04-25T10:03:26.380Z + version: odata-to-abstract-sql-5.9.5 + title: "" + date: 2023-04-25T12:16:48.086Z + - commits: + - subject: Update dependencies + hash: 5aa3c51cbbfc66cddedebd41dacba5eabbacf709 + body: > + Update @balena/abstract-sql-compiler from 8.0.0 + to 8.4.0 + + Update @balena/odata-parser from 2.4.2 to 2.4.6 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Add support for using field type nodes with an AggregateJSON node + hash: 19c2760ecf76b4097d7d3045c2eefbf74fd7c2da + body: | + This also deprecates the legacy version + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.4.0 + title: "" + date: 2023-04-24T12:05:48.116Z + - commits: + - subject: Deprecate `AliasableFromTypeNodes` type as it's redundant + hash: 283da4816fe5e6d672e4959b05800861625dda99 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.13 + title: "" + date: 2023-04-24T12:00:41.593Z + - commits: + - subject: Revert tightening of `OrderBy` to only field nodes + hash: 1c25d9b8d011791a9e98a5929ad48cdd9f3bab6b + body: > + It can in fact be a lot of different + things and that is now also + + reflected in the typing + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.12 + title: "" + date: 2023-04-17T16:53:20.918Z + - commits: + - subject: Do not allow ON clauses for CROSS JOIN as it is invalid + hash: d47bf63d3a14cdbb4cb0aeb7544e41a9288699f4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Stop accepting `ExtractJSONPathAsText`/`ToJSON` as unknown node types + hash: 6fcb2c4257f9fc50f6b4b1070dec86ace9f71237 + body: > + We know what type they return and they + should be explicitly accepted as + + those types instead where it is valid to do so + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.11 + title: "" + date: 2023-04-13T11:28:36.049Z + - commits: + - subject: Fix DateNode/AnyNode typings + hash: aab549e8cf4e274a2a8b93814da393451acc4238 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.10 + title: "" + date: 2023-04-13T10:27:14.478Z + - commits: + - subject: Update dependencies + hash: 39058b2dacac51da96158d594b2d72e3238d0cbc + body: > + Update @balena/sbvr-types from 3.4.18 to + 3.5.0 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Add Big Serial type + hash: 49460ad51fcbc60f81e61329c573a1af5b207a46 + body: "" + footer: + Change-type: minor + change-type: minor + author: Josh Bowling + version: sbvr-types-3.5.0 + title: "" + date: 2023-03-21T11:16:27.398Z + - commits: + - subject: "Flowzone: Allow external contributions" + hash: 9f7bb028bbac327e6fe0711491d7c0f2c6464f98 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Josh Bowling + signed-off-by: Josh Bowling + author: Josh Bowling + version: sbvr-types-3.4.19 + title: "" + date: 2022-12-08T01:08:35.143Z + version: abstract-sql-compiler-8.3.9 + title: "" + date: 2023-04-13T10:09:53.529Z + - commits: + - subject: Improve typings + hash: 43e75ef37de956d1b583bc62b307b04e0f8455c1 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.8 + title: "" + date: 2023-04-12T17:26:10.992Z + - commits: + - subject: Remove typing for non-existent JSON node + hash: 76181d438f0f37463642704d7908c1774040c2c2 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.7 + title: "" + date: 2023-04-12T16:38:07.014Z + - commits: + - subject: Tighten the `isXValue` function typings + hash: 91485cd9c88faaaed9b1280bc34eb3a99628057e + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.6 + title: "" + date: 2023-04-12T16:18:20.829Z + - commits: + - subject: Correctly treat `Value` nodes as rewritten to `Text` by the optimizer + hash: c9dbc4cfb3fa392e87a0775accdd6811b3c273b4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Add EmbeddedTextNode typing + hash: d00ac00ca7af4d17b437c3d5511af8e506615db4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.5 + title: "" + date: 2023-04-12T16:01:45.643Z + - commits: + - subject: Enforce the first argument of ExtractJSONPathAsText is a JSON type node + hash: 08865295d4cd3ded56d77a30d33c0434e1da52b9 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.4 + title: "" + date: 2023-04-12T15:55:47.432Z + - commits: + - subject: Improve node typings + hash: 2cb83cf242052c581ee5412e3a90ed87cf5fd39e + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.3 + title: "" + date: 2023-04-12T15:43:13.357Z + - commits: + - subject: Add more node typings + hash: db162a8a4d645c2f37c968224d667ed753e534dd + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.2 + title: "" + date: 2023-04-12T15:01:22.252Z + - commits: + - subject: Add more node typings + hash: 047954b6f66abb041bee74373f37c38d71cdc4d7 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.1 + title: "" + date: 2023-04-12T13:14:25.174Z + - commits: + - subject: Support boolean nodes in a ValuesNode + hash: d589fb6cd92a3a7570e3b2ebea14acbb84807d8a + body: > + This also deprecates the legacy use of + direct true/false entries + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.0 + title: "" + date: 2023-04-11T14:56:54.403Z + - commits: + - subject: Add `Between` node type + hash: 4880072eeab6af198df47777b6579dcacc3d7fb1 + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.2.0 + title: "" + date: 2023-04-11T14:19:22.378Z + - commits: + - subject: Add `BitwiseAnd`/`BitwiseShiftRight` node types + hash: f155d1daca54086b653fa590e3248c5ef805afff + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.1.0 + title: "" + date: 2023-04-11T14:11:01.677Z + - commits: + - subject: Add `NotInNode` type + hash: 9870d746344033db53ec14fddc23a8580b863ad9 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Add `IsDistinctFromNode`/`IsNotDistinctFromNode` types + hash: 09887280a6394a61a31c955602ccb2a0fe98c9b8 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Add `CharacterLengthNode` type + hash: 1fbab42cee8128025756076dc826dacda4ea1597 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.0.2 + title: "" + date: 2023-04-06T18:12:29.893Z + - commits: + - subject: Adds Cast node type to tree parsing + hash: cbdb559bfce3c77f9bce9e07f05777f58965f324 + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: abstract-sql-compiler-8.0.1 + title: "" + date: 2023-04-06T17:59:29.723Z + - commits: + - subject: Improve typings + hash: ed5fa5675021485a775eb777f2358d8041b93ce1 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: odata-parser-2.4.6 + title: "" + date: 2023-02-24T17:02:58.272Z + - commits: + - subject: Use const/let as appropriate + hash: 0824fe7d85eeb97941319749fc802f9bae3c9fb6 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: odata-parser-2.4.5 + title: "" + date: 2023-02-23T16:31:08.299Z + - commits: + - subject: Use shorthand object notation + hash: 611c0480681965c7af06302264eac79fea18bded + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: odata-parser-2.4.4 + title: "" + date: 2023-02-23T16:26:30.639Z + - commits: + - subject: Update dependencies + hash: 25b153aca258347c6742cb8b4efe54c0ae199695 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: odata-parser-2.4.3 + title: "" + date: 2023-02-23T16:14:13.013Z + version: odata-to-abstract-sql-5.9.4 + title: "" + date: 2023-04-24T16:26:44.367Z + - commits: + - subject: Fixes ODataBindings imported types + hash: 07224c40f6c11a849939dcca456d18677b159991 + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: odata-to-abstract-sql-5.9.3 + title: "" + date: 2023-03-08T22:00:01.264Z + - commits: + - subject: Update typings to the minimal subset of the abstract sql model we need + hash: 2b95fdd826b153b7cbc0ad9ae6440d5788062ee3 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: odata-to-abstract-sql-5.9.2 + title: "" + date: 2023-02-15T13:59:28.133Z + version: abstract-sql-to-typescript-1.5.1 + title: "" + date: 2023-04-27T08:55:14.149Z + - commits: + - subject: Adds native SQL Date type + hash: f19cd38aa79cb820f663b73da96c15bcfd41778d + body: "" + footer: + Change-type: minor + change-type: minor + author: Otávio Jacobi + nested: [] + version: abstract-sql-to-typescript-1.5.0 + title: "" + date: 2023-03-01T17:29:25.983Z + - commits: + - subject: Update to peggy 3 and make us of the repetition operator + hash: 3d091133ca54dfba71c2bc0d17e60780fb1bda22 + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + version: odata-parser-2.5.0 + title: "" + date: 2023-04-26T11:09:24.513Z + - commits: + - subject: Collapse `AliasedFunction` into `FunctionMatch` + hash: 98093a48aa75e5b8bd8eadc25ca37b53cc80ce2c + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: odata-to-abstract-sql-5.9.6 + title: "" + date: 2023-04-25T13:27:44.188Z + - commits: + - subject: Improve typings + hash: 78d4a48022ac0465c5d2c48db53b8ddd08e6e1bf + body: | + Update @balena/abstract-sql-compiler from 8.4.0 to 8.4.1 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Add much finer grained typings for abstract-sql-optimizer + hash: 92bc7e93ca1b17401d902d66c68e090e50f70d1a + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.4.1 + title: "" + date: 2023-04-25T10:03:26.380Z + version: odata-to-abstract-sql-5.9.5 + title: "" + date: 2023-04-25T12:16:48.086Z + - commits: + - subject: Update dependencies + hash: 5aa3c51cbbfc66cddedebd41dacba5eabbacf709 + body: | + Update @balena/abstract-sql-compiler from 8.0.0 to 8.4.0 + Update @balena/odata-parser from 2.4.2 to 2.4.6 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Add support for using field type nodes with an AggregateJSON node + hash: 19c2760ecf76b4097d7d3045c2eefbf74fd7c2da + body: | + This also deprecates the legacy version + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.4.0 + title: "" + date: 2023-04-24T12:05:48.116Z + - commits: + - subject: Deprecate `AliasableFromTypeNodes` type as it's redundant + hash: 283da4816fe5e6d672e4959b05800861625dda99 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.13 + title: "" + date: 2023-04-24T12:00:41.593Z + - commits: + - subject: Revert tightening of `OrderBy` to only field nodes + hash: 1c25d9b8d011791a9e98a5929ad48cdd9f3bab6b + body: > + It can in fact be a lot of different things and + that is now also + + reflected in the typing + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.12 + title: "" + date: 2023-04-17T16:53:20.918Z + - commits: + - subject: Do not allow ON clauses for CROSS JOIN as it is invalid + hash: d47bf63d3a14cdbb4cb0aeb7544e41a9288699f4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Stop accepting `ExtractJSONPathAsText`/`ToJSON` as unknown node types + hash: 6fcb2c4257f9fc50f6b4b1070dec86ace9f71237 + body: > + We know what type they return and they should be + explicitly accepted as + + those types instead where it is valid to do so + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.11 + title: "" + date: 2023-04-13T11:28:36.049Z + - commits: + - subject: Fix DateNode/AnyNode typings + hash: aab549e8cf4e274a2a8b93814da393451acc4238 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.10 + title: "" + date: 2023-04-13T10:27:14.478Z + - commits: + - subject: Update dependencies + hash: 39058b2dacac51da96158d594b2d72e3238d0cbc + body: | + Update @balena/sbvr-types from 3.4.18 to 3.5.0 + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: + - commits: + - subject: Add Big Serial type + hash: 49460ad51fcbc60f81e61329c573a1af5b207a46 + body: "" + footer: + Change-type: minor + change-type: minor + author: Josh Bowling + version: sbvr-types-3.5.0 + title: "" + date: 2023-03-21T11:16:27.398Z + - commits: + - subject: "Flowzone: Allow external contributions" + hash: 9f7bb028bbac327e6fe0711491d7c0f2c6464f98 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Josh Bowling + signed-off-by: Josh Bowling + author: Josh Bowling + version: sbvr-types-3.4.19 + title: "" + date: 2022-12-08T01:08:35.143Z + version: abstract-sql-compiler-8.3.9 + title: "" + date: 2023-04-13T10:09:53.529Z + - commits: + - subject: Improve typings + hash: 43e75ef37de956d1b583bc62b307b04e0f8455c1 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.8 + title: "" + date: 2023-04-12T17:26:10.992Z + - commits: + - subject: Remove typing for non-existent JSON node + hash: 76181d438f0f37463642704d7908c1774040c2c2 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.7 + title: "" + date: 2023-04-12T16:38:07.014Z + - commits: + - subject: Tighten the `isXValue` function typings + hash: 91485cd9c88faaaed9b1280bc34eb3a99628057e + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.6 + title: "" + date: 2023-04-12T16:18:20.829Z + - commits: + - subject: Correctly treat `Value` nodes as rewritten to `Text` by the optimizer + hash: c9dbc4cfb3fa392e87a0775accdd6811b3c273b4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Add EmbeddedTextNode typing + hash: d00ac00ca7af4d17b437c3d5511af8e506615db4 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.5 + title: "" + date: 2023-04-12T16:01:45.643Z + - commits: + - subject: Enforce the first argument of ExtractJSONPathAsText is a JSON type node + hash: 08865295d4cd3ded56d77a30d33c0434e1da52b9 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.4 + title: "" + date: 2023-04-12T15:55:47.432Z + - commits: + - subject: Improve node typings + hash: 2cb83cf242052c581ee5412e3a90ed87cf5fd39e + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.3 + title: "" + date: 2023-04-12T15:43:13.357Z + - commits: + - subject: Add more node typings + hash: db162a8a4d645c2f37c968224d667ed753e534dd + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.2 + title: "" + date: 2023-04-12T15:01:22.252Z + - commits: + - subject: Add more node typings + hash: 047954b6f66abb041bee74373f37c38d71cdc4d7 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.1 + title: "" + date: 2023-04-12T13:14:25.174Z + - commits: + - subject: Support boolean nodes in a ValuesNode + hash: d589fb6cd92a3a7570e3b2ebea14acbb84807d8a + body: > + This also deprecates the legacy use of direct + true/false entries + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.3.0 + title: "" + date: 2023-04-11T14:56:54.403Z + - commits: + - subject: Add `Between` node type + hash: 4880072eeab6af198df47777b6579dcacc3d7fb1 + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.2.0 + title: "" + date: 2023-04-11T14:19:22.378Z + - commits: + - subject: Add `BitwiseAnd`/`BitwiseShiftRight` node types + hash: f155d1daca54086b653fa590e3248c5ef805afff + body: "" + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.1.0 + title: "" + date: 2023-04-11T14:11:01.677Z + - commits: + - subject: Add `NotInNode` type + hash: 9870d746344033db53ec14fddc23a8580b863ad9 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Add `IsDistinctFromNode`/`IsNotDistinctFromNode` types + hash: 09887280a6394a61a31c955602ccb2a0fe98c9b8 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + - subject: Add `CharacterLengthNode` type + hash: 1fbab42cee8128025756076dc826dacda4ea1597 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + nested: [] + version: abstract-sql-compiler-8.0.2 + title: "" + date: 2023-04-06T18:12:29.893Z + - commits: + - subject: Adds Cast node type to tree parsing + hash: cbdb559bfce3c77f9bce9e07f05777f58965f324 + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: abstract-sql-compiler-8.0.1 + title: "" + date: 2023-04-06T17:59:29.723Z + - commits: + - subject: Improve typings + hash: ed5fa5675021485a775eb777f2358d8041b93ce1 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: odata-parser-2.4.6 + title: "" + date: 2023-02-24T17:02:58.272Z + - commits: + - subject: Use const/let as appropriate + hash: 0824fe7d85eeb97941319749fc802f9bae3c9fb6 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: odata-parser-2.4.5 + title: "" + date: 2023-02-23T16:31:08.299Z + - commits: + - subject: Use shorthand object notation + hash: 611c0480681965c7af06302264eac79fea18bded + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: odata-parser-2.4.4 + title: "" + date: 2023-02-23T16:26:30.639Z + - commits: + - subject: Update dependencies + hash: 25b153aca258347c6742cb8b4efe54c0ae199695 + body: "" + footer: + Change-type: patch + change-type: patch + author: Pagan Gazzard + version: odata-parser-2.4.3 + title: "" + date: 2023-02-23T16:14:13.013Z + version: odata-to-abstract-sql-5.9.4 + title: "" + date: 2023-04-24T16:26:44.367Z + - commits: + - subject: Fixes ODataBindings imported types + hash: 07224c40f6c11a849939dcca456d18677b159991 + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: odata-to-abstract-sql-5.9.3 + title: "" + date: 2023-03-08T22:00:01.264Z + - commits: + - subject: Add Big Serial type + hash: 49460ad51fcbc60f81e61329c573a1af5b207a46 + body: "" + footer: + Change-type: minor + change-type: minor + author: Josh Bowling + version: sbvr-types-3.5.0 + title: "" + date: 2023-03-21T11:16:27.398Z + - commits: + - subject: "Flowzone: Allow external contributions" + hash: 9f7bb028bbac327e6fe0711491d7c0f2c6464f98 + body: "" + footer: + Change-type: patch + change-type: patch + Signed-off-by: Josh Bowling + signed-off-by: Josh Bowling + author: Josh Bowling + version: sbvr-types-3.4.19 + title: "" + date: 2022-12-08T01:08:35.143Z + version: pinejs-14.64.0 + title: "" + date: 2023-04-27T15:21:38.281Z + - commits: + - subject: Support returning a number from async migrations rather than db result + hash: 58d0a4e8c026531d8b172e7d715373b9afba708a + body: | + This also deprecates the form of returning a db result + footer: + Change-type: minor + change-type: minor + author: Pagan Gazzard + nested: [] + version: pinejs-14.63.0 + title: "" + date: 2023-04-27T09:57:49.259Z + version: 12.0.0 + title: "" + date: 2023-05-24T10:53:20.620Z +- commits: + - subject: Optimize the unique release_version rule + hash: e70930dbb2146c9f50ca635f38a7223e0b042fe9 + body: | + Enables row narrowing when the rule is + triggered by application changes, but more + importantly allows bC to rewrite the rule using + a GROUP BY. + Also reduces slightly the full rule runtime from + ~200ms to ~180ms. + footer: + Change-type: patch + change-type: patch + See: https://explain.dalibo.com/plan/6f1hd8f4ee0ada6d + see: https://explain.dalibo.com/plan/6f1hd8f4ee0ada6d + author: Thodoris Greasidis + nested: [] + version: 11.8.5 + title: "" + date: 2023-05-17T08:37:37.697Z +- commits: + - subject: Add device type yocto properties to typings + hash: ea501686fb9447353f1f4e0a00b16c68c25e7422 + body: "" + footer: + Change-type: patch + change-type: patch + author: Otávio Jacobi + nested: [] + version: 11.8.4 + title: "" + date: 2023-05-16T07:40:46.183Z - commits: - subject: Add partial index to optimize the unique release_version rule hash: bb78ee588d5d899607ee5ea7e3e3ab00942127ec diff --git a/CHANGELOG.md b/CHANGELOG.md index c14c163f0..e4d516879 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,1578 @@ All notable changes to this project will be documented in this file automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY! This project adheres to [Semantic Versioning](http://semver.org/). +## 14.15.5 - 2023-12-11 + +* Update grafana/loki Docker tag to v2.9.3 [Self-hosted Renovate Bot] + +## 14.15.4 - 2023-12-07 + + +
+ Update balena/open-balena-base Docker tag to v16.0.17 [Self-hosted Renovate Bot] + +> ### open-balena-base-16.0.17 - 2023-12-06 +> +> * Update dependency npm to v10.2.5 [Self-hosted Renovate Bot] +> + +
+ +## 14.15.3 - 2023-12-05 + + +
+ Update balena/open-balena-base Docker tag to v16.0.16 [Self-hosted Renovate Bot] + +> ### open-balena-base-16.0.16 - 2023-12-05 +> +> * remove self-hosted Sentry config [ab77] +> + +
+ +## 14.15.2 - 2023-11-30 + +* Update @balena/pinejs to 15.3.28 Update @balena/pinejs from 15.3.17 to 15.3.28 [Otávio Jacobi] + +## 14.15.1 - 2023-11-29 + +* Update TypeScript to 5.3.2 [Thodoris Greasidis] + +## 14.15.0 - 2023-11-28 + +* Publish `balena/open-balena-api` for ARM64 [fisehara] + +## 14.14.6 - 2023-11-24 + + +
+ Update balena/open-balena-base Docker tag to v16.0.15 [Self-hosted Renovate Bot] + +> ### open-balena-base-16.0.15 - 2023-11-22 +> +> * Update dependency node to v20.10.0 [Self-hosted Renovate Bot] +> +> ### open-balena-base-16.0.14 - 2023-11-15 +> +> * Update dependency npm to v10.2.4 [Self-hosted Renovate Bot] +> + +
+ +## 14.14.5 - 2023-11-24 + +* Update dependency rate-limiter-flexible to v3 [Self-hosted Renovate Bot] + +## 14.14.4 - 2023-11-23 + + +
+ Update @balena/pinejs [Harald Fischer] + +> ### pinejs-15.3.17 - 2023-11-23 +> +> * Update @balena/lint [Harald Fischer] +> +> ### pinejs-15.3.16 - 2023-11-09 +> +> * Handling typing changes of @types/pg [Harald Fischer] +> +> ### pinejs-15.3.15 - 2023-10-25 +> +> * Do not force storage class on s3 upload [Otávio Jacobi] +> +> ### pinejs-15.3.14 - 2023-10-24 +> +> * Update dependency @types/node to v20 [Self-hosted Renovate Bot] +> + +
+ +## 14.14.3 - 2023-11-13 + +* Lock file maintenance [Self-hosted Renovate Bot] + +## 14.14.2 - 2023-11-06 + +* Update dependency @types/sinon to v17 [Self-hosted Renovate Bot] + +## 14.14.1 - 2023-11-06 + +* Lock file maintenance [Self-hosted Renovate Bot] + +## 14.14.0 - 2023-11-03 + +* Make Retry-After available to CORS browser requests [Thodoris Greasidis] + +## 14.13.8 - 2023-11-02 + + +
+ Update balena/open-balena-base Docker tag to v16.0.13 [Self-hosted Renovate Bot] + +> ### open-balena-base-16.0.13 - 2023-11-02 +> +> * Update dependency npm to v10.2.3 [Self-hosted Renovate Bot] +> + +
+ +## 14.13.7 - 2023-11-02 + +* rate-limiting: Use the ceiling of ms values for the Retry-After header [Thodoris Greasidis] + +## 14.13.6 - 2023-10-31 + + +
+ Update balena/open-balena-base Docker tag to v16.0.12 [Self-hosted Renovate Bot] + +> ### open-balena-base-16.0.12 - 2023-11-01 +> +> * Update dependency node to v20.9.0 [Self-hosted Renovate Bot] +> + +
+ +## 14.13.5 - 2023-10-31 + + +
+ Update balena/open-balena-base Docker tag to v16.0.11 [Self-hosted Renovate Bot] + +> ### open-balena-base-16.0.11 - 2023-11-01 +> +> * Update dependency npm to v10.2.2 [Self-hosted Renovate Bot] +> + +
+ +## 14.13.4 - 2023-10-30 + +* Lock file maintenance [Self-hosted Renovate Bot] + +## 14.13.3 - 2023-10-24 + +* Update dependency sinon to v17 [Self-hosted Renovate Bot] + +## 14.13.2 - 2023-10-23 + + +
+ Update @balena/pinejs dependency [Otávio Jacobi] + +> ### pinejs-15.3.13 - 2023-10-23 +> +> * Blocks updating and creating webresources with non multipart-formdata requests [Otávio Jacobi] +> +> ### pinejs-15.3.12 - 2023-10-20 +> +> * Update dependency @types/websql to ^0.0.28 [Self-hosted Renovate Bot] +> +> ### pinejs-15.3.11 - 2023-10-20 +> +> * Update dependency @types/method-override to ^0.0.33 [Self-hosted Renovate Bot] +> + +
+ +## 14.13.1 - 2023-10-23 + +* Lock file maintenance [Self-hosted Renovate Bot] + +## 14.13.0 - 2023-10-20 + +* multi-level-memoizee: Support local & global specific extra Cache options [Thodoris Greasidis] + +## 14.12.6 - 2023-10-19 + +* Add release_asset update asset_key tests [Otávio Jacobi] + +## 14.12.5 - 2023-10-19 + +* Add cascade deletes for release assets [Thodoris Greasidis] + +## 14.12.4 - 2023-10-18 + + +
+ Update balena/open-balena-base Docker tag to v16.0.10 [Self-hosted Renovate Bot] + +> ### open-balena-base-16.0.10 - 2023-10-18 +> +> * Update dependency node to v20.8.1 [Self-hosted Renovate Bot] +> + +
+ +## 14.12.3 - 2023-10-18 + + +
+ Update balena/open-balena-base Docker tag to v16.0.9 [Self-hosted Renovate Bot] + +> ### open-balena-base-16.0.9 - 2023-10-18 +> +> * Update dependency npm to v10.2.1 [Self-hosted Renovate Bot] +> + +
+ +## 14.12.2 - 2023-10-18 + +* Fix the request.creds typings [Thodoris Greasidis] + +## 14.12.1 - 2023-10-18 + +* Update dependency lint-staged to v15 [Self-hosted Renovate Bot] + +## 14.12.0 - 2023-10-17 + +* Add release_asset [Otávio Jacobi] + +## 14.11.4 - 2023-10-16 + +* Increase max webresource file [Otávio Jacobi] + +## 14.11.3 - 2023-10-16 + +* Bump @babel/traverse from 7.21.2 to 7.23.2 [dependabot[bot]] + +## 14.11.2 - 2023-10-16 + +* Update grafana/loki Docker tag to v2.9.2 [Self-hosted Renovate Bot] + +## 14.11.1 - 2023-10-11 + + +
+ Update @balena/pinejs dependencies [Otávio Jacobi] + +> ### pinejs-15.3.10 - 2023-10-06 +> +> * Allow uploading file on resourceName and synonyms [Otávio Jacobi] +> +> ### pinejs-15.3.9 - 2023-10-06 +> +> * Fix Term Forms and Synonyms on webresources models [Otávio Jacobi] +> + +
+ +## 14.11.0 - 2023-10-10 + +* Update /os/v1/config endpoint for config.json migration [Christina Ying Wang] + +## 14.10.2 - 2023-10-10 + +* Augment supertest .expect(status) to log the response body when failing Change-type: patch [Thodoris Greasidis] + +## 14.10.1 - 2023-10-10 + +* Update pinejs-client-supertest to v2.0.1 [Thodoris Greasidis] + +## 14.10.0 - 2023-10-06 + +* New CONTRACT_ALLOWLIST option to limit device types/contracts [Shaun Cooley] + +## 14.9.7 - 2023-10-04 + +* Bump postcss from 8.4.21 to 8.4.31 [dependabot[bot]] + +## 14.9.6 - 2023-10-03 + + +
+ Update balena/open-balena-base Docker tag to v16.0.8 [Self-hosted Renovate Bot] + +> ### open-balena-base-16.0.8 - 2023-10-03 +> +> * Update dependency npm to v10.2.0 [Self-hosted Renovate Bot] +> + +
+ +## 14.9.5 - 2023-10-03 + + +
+ Update balena/open-balena-base Docker tag to v16.0.7 [Self-hosted Renovate Bot] + +> ### open-balena-base-16.0.7 - 2023-10-02 +> +> * Prefer using local env var values before falling back to defaults [Thodoris Greasidis] +> + +
+ +## 14.9.4 - 2023-10-03 + +* Update dependency @balena/pinejs-webresource-cloudfront to ^0.0.5 [Self-hosted Renovate Bot] + +## 14.9.3 - 2023-10-01 + + +
+ Update balena/open-balena-base Docker tag to v16.0.6 [Self-hosted Renovate Bot] + +> ### open-balena-base-16.0.6 - 2023-09-29 +> +> * Update dependency node to v20.8.0 [Self-hosted Renovate Bot] +> +> ### open-balena-base-16.0.5 - 2023-09-21 +> +> * Build confd from source to avoid upx issues in released binaries [Kyle Harding] +> +> ### open-balena-base-16.0.4 - 2023-09-21 +> +> * Bump no-systemd image to node 20/npm 10 matching systemd [Page-] +> +> ### open-balena-base-16.0.3 - 2023-09-18 +> +> * Update dependency node to v18.18.0 [Self-hosted Renovate Bot] +> +> ### open-balena-base-16.0.2 - 2023-09-18 +> +> * Update dependency node to v20.7.0 [Self-hosted Renovate Bot] +> + +
+ +## 14.9.2 - 2023-10-01 + +* Bump protobufjs from 7.2.2 to 7.2.5 [dependabot[bot]] + +## 14.9.1 - 2023-10-01 + +* Update dependency sinon to v16 [Self-hosted Renovate Bot] + +## 14.9.0 - 2023-09-29 + +* Add S3 webresource handler [Otávio Jacobi] + +## 14.8.0 - 2023-09-28 + +* Expose the RPi family config vars to raspberrypi5 board [Alex Gonzalez] + +## 14.7.1 - 2023-09-28 + +* Check user access to the device type provided to /config/vars [Thodoris Greasidis] + +## 14.7.0 - 2023-09-28 + +* Support extending the device fields populated in the "get-state" event [Thodoris Greasidis] + +## 14.6.1 - 2023-09-27 + +* Mark expected floating promises with the `void` operator [Thodoris Greasidis] + +## 14.6.0 - 2023-09-20 + +* Use general Redis auth when also using the general Redis host [Shaun Cooley] + +## 14.5.6 - 2023-09-14 + +* Update grafana/loki Docker tag to v2.9.1 [Self-hosted Renovate Bot] + +## 14.5.5 - 2023-09-13 + + +
+ Update balena/open-balena-base Docker tag to v16.0.1 [Self-hosted Renovate Bot] + +> ### open-balena-base-16.0.1 - 2023-09-12 +> +> * don't clobber existing values [Anton Belodedenko] +> + +
+ +## 14.5.4 - 2023-09-11 + +* Update open-balena-base package.json to specify nodejs 20 [Pagan Gazzard] + +## 14.5.3 - 2023-09-11 + +* Update open-balena-base to 16.0.0 [Pagan Gazzard] + +## 14.5.2 - 2023-09-07 + +* Update grafana/loki Docker tag to v2.9.0 [Self-hosted Renovate Bot] + +## 14.5.1 - 2023-08-30 + + +
+ Update @balena/pinejs dependencies [Harald Fischer] + +> ### pinejs-15.3.4 - 2023-08-29 +> +> * Fix skipped migrations on empty database schema [Harald Fischer] +> +> ### pinejs-15.3.3 - 2023-08-29 +> +> * Change S3Handler signing config from private to protected [Otávio Jacobi] +> +> ### pinejs-15.3.2 - 2023-08-24 +> +> * Fix webresource patch on not accessible/inexistent key [Otávio Jacobi] +> +> ### pinejs-15.3.1 - 2023-08-24 +> +> * bin: Use async imports in the cli commands [Thodoris Greasidis] +> + +
+ +## 14.5.0 - 2023-08-30 + +* Export the augmentReqApiKeyPermissions api key helper [Thodoris Greasidis] + +## 14.4.0 - 2023-08-29 + +* Use snappy compression for device logs [Pagan Gazzard] + +## 14.3.11 - 2023-08-29 + +* device-logs: Import the Loki backend asyncronoushly [Thodoris Greasidis] + +## 14.3.10 - 2023-08-29 + +* Update TypeScript to 5.2.2 [Thodoris Greasidis] + +## 14.3.9 - 2023-08-29 + +* Mark runCommand & runFromCommandLine as deprecated [Thodoris Greasidis] +* Fix the remaining eslint errors [Thodoris Greasidis] +* Properly mark floating-promise errors [Thodoris Greasidis] +* scheduler: Add missing await to the unlocking phase [Thodoris Greasidis] +* Stop using {} as a type [Thodoris Greasidis] +* Switch hasOwnProperty() to Object.prototype.hasOwnProperty.call [Thodoris Greasidis] +* Remove unnecessary escaping from regexes [Thodoris Greasidis] +* Remove not used lodash imports [Thodoris Greasidis] +* Update @balena/lint to 7.0.2 [Thodoris Greasidis] + +## 14.3.8 - 2023-08-29 + +* config: Refactor the cluster mode Redis auth env var checks [Thodoris Greasidis] +* Throw when the redis auth env vars are not in the expected format [Thodoris Greasidis] +* Annotate a few type-only ioredis imports as such [Thodoris Greasidis] + +## 14.3.7 - 2023-08-29 + +* Fix the construction of the Redis RO auth options in non-cluster mode [Thodoris Greasidis] + +## 14.3.6 - 2023-08-25 + + +
+ Update balena/open-balena-base Docker tag to v15.1.0 [Self-hosted Renovate Bot] + +> ### open-balena-base-15.1.0 - 2023-08-24 +> +> * Add WEBRESOURCES_S3 ACCESS_KEY, SECRET_KEY and HOST to en configuration [Otávio Jacobi] +> + +
+ +## 14.3.5 - 2023-08-24 + + +
+ Update balena/open-balena-base Docker tag to v15.0.5 [Self-hosted Renovate Bot] + +> ### open-balena-base-15.0.5 - 2023-08-24 +> +> * Update dependency node to v18.17.1 [Self-hosted Renovate Bot] +> + +
+ +## 14.3.4 - 2023-08-24 + + +
+ Update balena/open-balena-base Docker tag to v15.0.4 [Self-hosted Renovate Bot] + +> ### open-balena-base-15.0.4 - 2023-08-24 +> +> * Use renovate regex annotations to manage confd releases [Kyle Harding] +> * Install node and npm manually in no-systemd variant [Kyle Harding] +> * Use renovate regex annotations to version node and npm [Kyle Harding] +> + +
+ +## 14.3.3 - 2023-08-23 + +* Enable external PRs to run custom actions [Pagan Gazzard] + +## 14.3.2 - 2023-08-23 + +* Make use of `.at(-1)` instead of `.length - 1` [Pagan Gazzard] + +## 14.3.1 - 2023-08-23 + +* One additional Redis AUTH location also fixed possible 'redisAuthVar' use before initialization [Shaun Cooley] + +## 14.3.0 - 2023-08-22 + +* Add support for Redis auth [Shaun Cooley] + +## 14.2.3 - 2023-08-22 + +* Update dependency lint-staged to v14 [Self-hosted Renovate Bot] + +## 14.2.2 - 2023-08-21 + +* Remove imports from pinejs/out directory [Otávio Jacobi] + +## 14.2.1 - 2023-08-18 + +* CI: Use pglast to validate SQL [Josh Bowling] + +## 14.2.0 - 2023-08-17 + + +
+ Adds webresource typing [Otávio Jacobi] + +> ### pinejs-15.3.0 - 2023-08-16 +> +> * Add support to WebResrouce type [Otávio Jacobi] +> +> ### pinejs-15.2.1 - 2023-08-14 +> +> * Mark that `tx` is always passed to `POSTRUN-ERROR` hooks [Pagan Gazzard] +> +> ### pinejs-15.2.0 - 2023-08-02 +> +> * Return a response even when the request resolves to an HTTP error [myarmolinsky] +> +> ### pinejs-15.1.1 - 2023-08-02 +> +> * Throw a Bad Request error when passing unknown vocabulary in a request [myarmolinsky] +> +> ### pinejs-15.1.0 - 2023-07-11 +> +> +>
+> Update pinejs-client-core to 6.13.0 [Thodoris Greasidis] +> +>> #### pinejs-client-js-6.13.0 - 2023-07-11 +>> +>> * Add support for $duration [Thodoris Greasidis] +>> +>> #### pinejs-client-js-6.12.4 - 2023-05-09 +>> +>> * Avoid an unnecessary function creation on each get() call [Thodoris Greasidis] +>> +> +>
+> +> +> ### pinejs-15.0.5 - 2023-07-07 +> +> * Mark the bin scripts as executable [Thodoris Greasidis] +> +> ### pinejs-15.0.4 - 2023-06-27 +> +> * Add transaction cancelation tests for properly hooked custom endpoints [Thodoris Greasidis] +> * Add OData request transaction cancelation tests [Thodoris Greasidis] +> +> ### pinejs-15.0.3 - 2023-06-15 +> +> * Fix pinejs 15 migrations for the migrations model [Pagan Gazzard] +> +> ### pinejs-15.0.2 - 2023-06-02 +> +> * Update TypeScript to 5.1.3 [Thodoris Greasidis] +> +> ### pinejs-15.0.1 - 2023-05-23 +> +> * Migrations.md: Add marking the sbvr field as optional on the 2nd deploy [Thodoris Greasidis] +> + +
+ +## 14.1.1 - 2023-08-11 + +* Update grafana/loki Docker tag to v2.8.4 [Self-hosted Renovate Bot] + +## 14.1.0 - 2023-08-02 + +* Add /actor/v1/whoami endpoint [Otávio Jacobi] + +## 14.0.4 - 2023-07-21 + +* Update grafana/loki Docker tag to v2.8.3 [Self-hosted Renovate Bot] + +## 14.0.3 - 2023-07-19 + + +
+ Update balena/open-balena-base Docker tag to v15.0.3 [Self-hosted Renovate Bot] + +> ### open-balena-base-15.0.3 - 2023-07-19 +> +> * Update Node.js to v18.17.0 [Self-hosted Renovate Bot] +> + +
+ +## 14.0.2 - 2023-07-19 + + +
+ Update balena/open-balena-base Docker tag to v15.0.2 [Self-hosted Renovate Bot] + +> ### open-balena-base-15.0.2 - 2023-07-19 +> +> * Update dependency npm to v9.8.1 [Self-hosted Renovate Bot] +> + +
+ +## 14.0.1 - 2023-07-18 + + +
+ Update balena/open-balena-base Docker tag to v15.0.1 [Self-hosted Renovate Bot] + +> ### open-balena-base-15.0.1 - 2023-07-18 +> +> * Update dependency node to v18.17.0 [Self-hosted Renovate Bot] +> + +
+ +## 14.0.0 - 2023-07-17 + +* Use the graceful deny mechanism for device state PATCH v3 [Thodoris Greasidis] + +## 13.3.0 - 2023-07-12 + +* vars-schema: Add custom DTB support for Jetson Orin Nano [Alexandru Costache] + +## 13.2.2 - 2023-07-10 + +* Update open-balena-base to 15.0.0 [Pagan Gazzard] + +## 13.2.1 - 2023-07-05 + + +
+ Update balena/open-balena-base Docker tag to v14.11.1 [Self-hosted Renovate Bot] + +> ### open-balena-base-14.11.1 - 2023-07-05 +> +> * Update Node.js to v18.16.1 [Self-hosted Renovate Bot] +> + +
+ +## 13.2.0 - 2023-07-05 + + +
+ Update balena/open-balena-base Docker tag to v14.11.0 [Self-hosted Renovate Bot] + +> ### open-balena-base-14.11.0 - 2023-07-05 +> +> * Update dependency npm to v9.8.0 [Self-hosted Renovate Bot] +> + +
+ +## 13.1.0 - 2023-07-05 + +* Expose the RPi family config vars to Revolution Pi Connect and Revolution Pi Connect S [Florin Sarbu] + +## 13.0.7 - 2023-07-01 + +* Update dependency semver to v7.5.2 [SECURITY] [Self-hosted Renovate Bot] + +## 13.0.6 - 2023-06-27 + +* Rollback device registration if the request ends/is aborted midway [Pagan Gazzard] + +## 13.0.5 - 2023-06-21 + + +
+ Update balena/open-balena-base Docker tag to v14.10.2 [Self-hosted Renovate Bot] + +> ### open-balena-base-14.10.2 - 2023-06-21 +> +> * Update dependency npm to v9.7.2 [Self-hosted Renovate Bot] +> + +
+ +## 13.0.4 - 2023-06-21 + + +
+ Update balena/open-balena-base Docker tag to v14.10.1 [Self-hosted Renovate Bot] + +> ### open-balena-base-14.10.1 - 2023-06-21 +> +> * Update dependency node to v18.16.1 [Self-hosted Renovate Bot] +> + +
+ +## 13.0.3 - 2023-06-14 + +* device-provisioning: Stop reporting conflict errors [Thodoris Greasidis] + +## 13.0.2 - 2023-06-14 + +* Combine two of the rules about supervisor releases managing devices [Thodoris Greasidis] + +## 13.0.1 - 2023-06-13 + +* Gracefully deny device registrations with duplicate api key [Thodoris Greasidis] + +## 13.0.0 - 2023-06-12 + +* Drop unused `device has vpn address` property [Pagan Gazzard] + +## 12.1.0 - 2023-06-07 + + +
+ Update balena/open-balena-base Docker tag to v14.10.0 [Self-hosted Renovate Bot] + +> ### open-balena-base-14.10.0 - 2023-06-07 +> +> * Update dependency npm to v9.7.1 [Self-hosted Renovate Bot] +> + +
+ +## 12.0.6 - 2023-06-07 + +* Clear the associated service instance when a device disconnects from it [Pagan Gazzard] + +## 12.0.5 - 2023-06-02 + +* Update TypeScript to 5.1.3 [Thodoris Greasidis] + +## 12.0.4 - 2023-05-31 + + +
+ Update balena/open-balena-base Docker tag to v14.9.4 [Self-hosted Renovate Bot] + +> ### open-balena-base-14.9.4 - 2023-06-01 +> +> * Set systemd stopsignal to SIGRTMIN+3 [Pagan Gazzard] +> + +
+ +## 12.0.3 - 2023-05-24 + +* Add a CPU ID readable character filter [fisehara] + +## 12.0.2 - 2023-05-24 + +* Update grafana/loki Docker tag to v2.8.2 [Renovate Bot] + +## 12.0.1 - 2023-05-24 + + +
+ Update balena/open-balena-base Docker tag to v14.9.3 [Renovate Bot] + +> ### open-balena-base-14.9.3 - 2023-05-18 +> +> * Update dependency npm to v9.6.7 [Renovate Bot] +> +> ### open-balena-base-14.9.2 - 2023-05-03 +> +> * Update dependency npm to v9.6.6 [Renovate Bot] +> + +
+ +## 12.0.0 - 2023-05-24 + + +
+ Update to pinejs 15 [Pagan Gazzard] + +> ### pinejs-15.0.0 - 2023-05-17 +> +> * Stop re-exporting `ODataRequest` as `HookRequest` [Pagan Gazzard] +> * Don't add a returning clause to requests if affectedIds has been populated [Pagan Gazzard] +> * Remove the deprecated `data` property from `PRERESPOND` hooks [Pagan Gazzard] +> * Remove support for the deprecated db result form of async migrations [Pagan Gazzard] +> * Update grunt [Harald Fischer] +> * Do not convert `null` to the default value in `customApiKeyMiddleware` [Pagan Gazzard] +> * Use `{ value: modelValue }` for se and odataMetadata model entries [Pagan Gazzard] +> * Switch mysql `sql_mode` from `ANSI_QUOTES` to `ANSI` [Pagan Gazzard] +> * Make `actor` a required property of the req.apiKey object [Pagan Gazzard] +> * Change `resolveAuthHeader`/`resolveApiKey` to throw on invalid api keys [Pagan Gazzard] +> * Do not bail in `resolveAuthHeader` if there is an existing api key [Pagan Gazzard] +> * Do not bail in `resolveApiKey` if there is an existing api key [Pagan Gazzard] +> * Treat ConceptType fields as expandable/foreign key fields as they are [Pagan Gazzard] +> * Throw rather than warn on invalid value for `PINEJS_DEBUG` [Pagan Gazzard] +> * Remove support for `DEBUG` env var in favor of only `PINEJS_DEBUG` [Pagan Gazzard] +> * Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 [Pagan Gazzard] +> * Reflect the usage of BOOLEAN/JSON database types [Pagan Gazzard] +> +>
+> Update dependencies [Pagan Gazzard] +> +>> #### abstract-sql-compiler-9.0.2 - 2023-05-16 +>> +>> +>>
+>> Update @balena/sbvr-types to 5.0.0 [Pagan Gazzard] +>> +>>> ##### sbvr-types-5.0.0 - 2023-05-16 +>>> +>>> * Switch from `export =` to `export default` [Pagan Gazzard] +>>> +>>> ##### sbvr-types-4.0.2 - 2023-05-03 +>>> +>>> * Improve typings [Pagan Gazzard] +>>> +>>> ##### sbvr-types-4.0.1 - 2023-05-02 +>>> +>>> * boolean: Avoid unnecessary array creation to reduce GCs [Thodoris Greasidis] +>>> +>> +>>
+>> +>> +>> #### abstract-sql-compiler-9.0.1 - 2023-05-15 +>> +>> * Fix TS errors for the latest sbvrTypes [Thodoris Greasidis] +>> +>> #### abstract-sql-compiler-9.0.0 - 2023-05-02 +>> +>> * Drop `require-npm4-to-publish` as `engines` used [fisehara] +>> +>>
+>> Update @balena/odata-to-abstract-sql to 6.x [Pagan Gazzard] +>> +>>> ##### odata-to-abstract-sql-6.0.1 - 2023-04-27 +>>> +>>> +>>>
+>>> Update dependencies [Pagan Gazzard] +>>> +>>>> ###### odata-parser-3.0.0 - 2023-04-26 +>>>> +>>>> * Use optional chaining operator [Pagan Gazzard] +>>>> * Set minimum supported nodejs version to 16.13.0 [Pagan Gazzard] +>>>> +>>>> ###### odata-parser-2.5.0 - 2023-04-26 +>>>> +>>>> * Update to peggy 3 and make us of the repetition operator [Pagan Gazzard] +>>>> +>>>> ###### sbvr-types-4.0.0 - 2023-04-26 +>>>> +>>>> * Add test cases for Objects in JSON validate [fisehara] +>>>> * Drop `require-npm4-to-publish` devDependency [fisehara] +>>>> * Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 [Pagan Gazzard] +>>>> * Switch `JSON` to use `JSON` db type instead of `TEXT` [Pagan Gazzard] +>>>> * Switch `Boolean` to use `BOOLEAN` db type instead of `INTEGER` [Pagan Gazzard] +>>>> * Assert that JSON input typeof is object [Josh Bowling] +>>>> +>>> +>>>
+>>> +>>> +>>> ##### odata-to-abstract-sql-6.0.0 - 2023-04-26 +>>> +>>> * Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 [Pagan Gazzard] +>>> * Switch `AggregateJSON` to use the newer `ReferencedField` format [Pagan Gazzard] +>>> +>>> ##### odata-to-abstract-sql-5.9.6 - 2023-04-25 +>>> +>>> * Collapse `AliasedFunction` into `FunctionMatch` [Pagan Gazzard] +>>> +>>> ##### odata-to-abstract-sql-5.9.5 - 2023-04-25 +>>> +>>> +>>>
+>>> Improve typings [Pagan Gazzard] +>>> +>>>> ###### abstract-sql-compiler-8.4.1 - 2023-04-25 +>>>> +>>>> * Add much finer grained typings for abstract-sql-optimizer [Pagan Gazzard] +>>>> +>>> +>>>
+>>> +>>> +>>> ##### odata-to-abstract-sql-5.9.4 - 2023-04-24 +>>> +>>> +>>>
+>>> Update dependencies [Pagan Gazzard] +>>> +>>>> ###### abstract-sql-compiler-8.4.0 - 2023-04-24 +>>>> +>>>> * Add support for using field type nodes with an AggregateJSON node [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.13 - 2023-04-24 +>>>> +>>>> * Deprecate `AliasableFromTypeNodes` type as it's redundant [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.12 - 2023-04-17 +>>>> +>>>> * Revert tightening of `OrderBy` to only field nodes [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.11 - 2023-04-13 +>>>> +>>>> * Do not allow ON clauses for CROSS JOIN as it is invalid [Pagan Gazzard] +>>>> * Stop accepting `ExtractJSONPathAsText`/`ToJSON` as unknown node types [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.10 - 2023-04-13 +>>>> +>>>> * Fix DateNode/AnyNode typings [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.9 - 2023-04-13 +>>>> +>>>> +>>>>
+>>>> Update dependencies [Pagan Gazzard] +>>>> +>>>>> ####### sbvr-types-3.5.0 - 2023-03-21 +>>>>> +>>>>> * Add Big Serial type [Josh Bowling] +>>>>> +>>>>> ####### sbvr-types-3.4.19 - 2022-12-08 +>>>>> +>>>>> * Flowzone: Allow external contributions [Josh Bowling] +>>>>> +>>>> +>>>>
+>>>> +>>>> +>>>> ###### abstract-sql-compiler-8.3.8 - 2023-04-12 +>>>> +>>>> * Improve typings [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.7 - 2023-04-12 +>>>> +>>>> * Remove typing for non-existent JSON node [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.6 - 2023-04-12 +>>>> +>>>> * Tighten the `isXValue` function typings [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.5 - 2023-04-12 +>>>> +>>>> * Correctly treat `Value` nodes as rewritten to `Text` by the optimizer [Pagan Gazzard] +>>>> * Add EmbeddedTextNode typing [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.4 - 2023-04-12 +>>>> +>>>> * Enforce the first argument of ExtractJSONPathAsText is a JSON type node [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.3 - 2023-04-12 +>>>> +>>>> * Improve node typings [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.2 - 2023-04-12 +>>>> +>>>> * Add more node typings [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.1 - 2023-04-12 +>>>> +>>>> * Add more node typings [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.0 - 2023-04-11 +>>>> +>>>> * Support boolean nodes in a ValuesNode [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.2.0 - 2023-04-11 +>>>> +>>>> * Add `Between` node type [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.1.0 - 2023-04-11 +>>>> +>>>> * Add `BitwiseAnd`/`BitwiseShiftRight` node types [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.0.2 - 2023-04-06 +>>>> +>>>> * Add `NotInNode` type [Pagan Gazzard] +>>>> * Add `IsDistinctFromNode`/`IsNotDistinctFromNode` types [Pagan Gazzard] +>>>> * Add `CharacterLengthNode` type [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.0.1 - 2023-04-06 +>>>> +>>>> * Adds Cast node type to tree parsing [Otávio Jacobi] +>>>> +>>>> ###### odata-parser-2.4.6 - 2023-02-24 +>>>> +>>>> * Improve typings [Pagan Gazzard] +>>>> +>>>> ###### odata-parser-2.4.5 - 2023-02-23 +>>>> +>>>> * Use const/let as appropriate [Pagan Gazzard] +>>>> +>>>> ###### odata-parser-2.4.4 - 2023-02-23 +>>>> +>>>> * Use shorthand object notation [Pagan Gazzard] +>>>> +>>>> ###### odata-parser-2.4.3 - 2023-02-23 +>>>> +>>>> * Update dependencies [Pagan Gazzard] +>>>> +>>> +>>>
+>>> +>>> +>> +>>
+>> +>> * Remove support for the legacy AggregateJSON format of `[tableName, fieldName]` [Pagan Gazzard] +>> * Remove support for the legacy boolean format of `true|false` [Pagan Gazzard] +>> * Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 [Pagan Gazzard] +>> * Remove support for the legacy alias format of `[node, alias]` [Pagan Gazzard] +>> * Remove support for the legacy table format of `tableName` [Pagan Gazzard] +>> * Remove support for the legacy null formats of `null` and `'Null'` [Pagan Gazzard] +>> * Reflect the usage of BOOLEAN db type [Pagan Gazzard] +>> +>>
+>> Update @balena/sbvr-types to 4.x [Pagan Gazzard] +>> +>>> ##### sbvr-types-4.0.0 - 2023-04-26 +>>> +>>> * Add test cases for Objects in JSON validate [fisehara] +>>> * Drop `require-npm4-to-publish` devDependency [fisehara] +>>> * Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 [Pagan Gazzard] +>>> * Switch `JSON` to use `JSON` db type instead of `TEXT` [Pagan Gazzard] +>>> * Switch `Boolean` to use `BOOLEAN` db type instead of `INTEGER` [Pagan Gazzard] +>>> * Assert that JSON input typeof is object [Josh Bowling] +>>> +>> +>>
+>> +>> +>> #### abstract-sql-to-typescript-2.0.0 - 2023-05-02 +>> +>> * Update @balena/abstract-sql-compiler to 9.x [Pagan Gazzard] +>> * Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 [Pagan Gazzard] +>> * Treat ConceptType like foreign keys, in line with pinejs 15 [Pagan Gazzard] +>> +>> #### odata-parser-3.0.0 - 2023-04-26 +>> +>> * Use optional chaining operator [Pagan Gazzard] +>> * Set minimum supported nodejs version to 16.13.0 [Pagan Gazzard] +>> +>> #### odata-to-abstract-sql-6.0.1 - 2023-04-27 +>> +>> +>>
+>> Update dependencies [Pagan Gazzard] +>> +>>> ##### odata-parser-3.0.0 - 2023-04-26 +>>> +>>> * Use optional chaining operator [Pagan Gazzard] +>>> * Set minimum supported nodejs version to 16.13.0 [Pagan Gazzard] +>>> +>>> ##### odata-parser-2.5.0 - 2023-04-26 +>>> +>>> * Update to peggy 3 and make us of the repetition operator [Pagan Gazzard] +>>> +>>> ##### sbvr-types-4.0.0 - 2023-04-26 +>>> +>>> * Add test cases for Objects in JSON validate [fisehara] +>>> * Drop `require-npm4-to-publish` devDependency [fisehara] +>>> * Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 [Pagan Gazzard] +>>> * Switch `JSON` to use `JSON` db type instead of `TEXT` [Pagan Gazzard] +>>> * Switch `Boolean` to use `BOOLEAN` db type instead of `INTEGER` [Pagan Gazzard] +>>> * Assert that JSON input typeof is object [Josh Bowling] +>>> +>> +>>
+>> +>> +>> #### odata-to-abstract-sql-6.0.0 - 2023-04-26 +>> +>> * Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 [Pagan Gazzard] +>> * Switch `AggregateJSON` to use the newer `ReferencedField` format [Pagan Gazzard] +>> +>> #### sbvr-types-5.0.0 - 2023-05-16 +>> +>> * Switch from `export =` to `export default` [Pagan Gazzard] +>> +>> #### sbvr-types-4.0.2 - 2023-05-03 +>> +>> * Improve typings [Pagan Gazzard] +>> +>> #### sbvr-types-4.0.1 - 2023-05-02 +>> +>> * boolean: Avoid unnecessary array creation to reduce GCs [Thodoris Greasidis] +>> +>> #### sbvr-types-4.0.0 - 2023-04-26 +>> +>> * Add test cases for Objects in JSON validate [fisehara] +>> * Drop `require-npm4-to-publish` devDependency [fisehara] +>> * Set minimum supported nodejs version to 16.13.0 and tsconfig to es2021 [Pagan Gazzard] +>> * Switch `JSON` to use `JSON` db type instead of `TEXT` [Pagan Gazzard] +>> * Switch `Boolean` to use `BOOLEAN` db type instead of `INTEGER` [Pagan Gazzard] +>> * Assert that JSON input typeof is object [Josh Bowling] +>> +> +>
+> +> +> ### pinejs-14.64.1 - 2023-04-27 +> +> * Update async migration function typing to also accept `Promise` [Pagan Gazzard] +> +> ### pinejs-14.64.0 - 2023-04-27 +> +> +>
+> Update dependencies [Pagan Gazzard] +> +>> #### abstract-sql-compiler-8.5.0 - 2023-04-27 +>> +>> * Use native `StartsWith` node type for postgres [Pagan Gazzard] +>> * Convert `EscapeForLike` into a standalone node type [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.4.1 - 2023-04-25 +>> +>> * Add much finer grained typings for abstract-sql-optimizer [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.4.0 - 2023-04-24 +>> +>> * Add support for using field type nodes with an AggregateJSON node [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.3.13 - 2023-04-24 +>> +>> * Deprecate `AliasableFromTypeNodes` type as it's redundant [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.3.12 - 2023-04-17 +>> +>> * Revert tightening of `OrderBy` to only field nodes [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.3.11 - 2023-04-13 +>> +>> * Do not allow ON clauses for CROSS JOIN as it is invalid [Pagan Gazzard] +>> * Stop accepting `ExtractJSONPathAsText`/`ToJSON` as unknown node types [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.3.10 - 2023-04-13 +>> +>> * Fix DateNode/AnyNode typings [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.3.9 - 2023-04-13 +>> +>> +>>
+>> Update dependencies [Pagan Gazzard] +>> +>>> ##### sbvr-types-3.5.0 - 2023-03-21 +>>> +>>> * Add Big Serial type [Josh Bowling] +>>> +>>> ##### sbvr-types-3.4.19 - 2022-12-08 +>>> +>>> * Flowzone: Allow external contributions [Josh Bowling] +>>> +>> +>>
+>> +>> +>> #### abstract-sql-compiler-8.3.8 - 2023-04-12 +>> +>> * Improve typings [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.3.7 - 2023-04-12 +>> +>> * Remove typing for non-existent JSON node [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.3.6 - 2023-04-12 +>> +>> * Tighten the `isXValue` function typings [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.3.5 - 2023-04-12 +>> +>> * Correctly treat `Value` nodes as rewritten to `Text` by the optimizer [Pagan Gazzard] +>> * Add EmbeddedTextNode typing [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.3.4 - 2023-04-12 +>> +>> * Enforce the first argument of ExtractJSONPathAsText is a JSON type node [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.3.3 - 2023-04-12 +>> +>> * Improve node typings [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.3.2 - 2023-04-12 +>> +>> * Add more node typings [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.3.1 - 2023-04-12 +>> +>> * Add more node typings [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.3.0 - 2023-04-11 +>> +>> * Support boolean nodes in a ValuesNode [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.2.0 - 2023-04-11 +>> +>> * Add `Between` node type [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.1.0 - 2023-04-11 +>> +>> * Add `BitwiseAnd`/`BitwiseShiftRight` node types [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.0.2 - 2023-04-06 +>> +>> * Add `NotInNode` type [Pagan Gazzard] +>> * Add `IsDistinctFromNode`/`IsNotDistinctFromNode` types [Pagan Gazzard] +>> * Add `CharacterLengthNode` type [Pagan Gazzard] +>> +>> #### abstract-sql-compiler-8.0.1 - 2023-04-06 +>> +>> * Adds Cast node type to tree parsing [Otávio Jacobi] +>> +>> #### abstract-sql-to-typescript-1.5.1 - 2023-04-27 +>> +>> +>>
+>> Update dependencies [Pagan Gazzard] +>> +>>> ##### odata-to-abstract-sql-5.9.6 - 2023-04-25 +>>> +>>> * Collapse `AliasedFunction` into `FunctionMatch` [Pagan Gazzard] +>>> +>>> ##### odata-to-abstract-sql-5.9.5 - 2023-04-25 +>>> +>>> +>>>
+>>> Improve typings [Pagan Gazzard] +>>> +>>>> ###### abstract-sql-compiler-8.4.1 - 2023-04-25 +>>>> +>>>> * Add much finer grained typings for abstract-sql-optimizer [Pagan Gazzard] +>>>> +>>> +>>>
+>>> +>>> +>>> ##### odata-to-abstract-sql-5.9.4 - 2023-04-24 +>>> +>>> +>>>
+>>> Update dependencies [Pagan Gazzard] +>>> +>>>> ###### abstract-sql-compiler-8.4.0 - 2023-04-24 +>>>> +>>>> * Add support for using field type nodes with an AggregateJSON node [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.13 - 2023-04-24 +>>>> +>>>> * Deprecate `AliasableFromTypeNodes` type as it's redundant [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.12 - 2023-04-17 +>>>> +>>>> * Revert tightening of `OrderBy` to only field nodes [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.11 - 2023-04-13 +>>>> +>>>> * Do not allow ON clauses for CROSS JOIN as it is invalid [Pagan Gazzard] +>>>> * Stop accepting `ExtractJSONPathAsText`/`ToJSON` as unknown node types [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.10 - 2023-04-13 +>>>> +>>>> * Fix DateNode/AnyNode typings [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.9 - 2023-04-13 +>>>> +>>>> +>>>>
+>>>> Update dependencies [Pagan Gazzard] +>>>> +>>>>> ####### sbvr-types-3.5.0 - 2023-03-21 +>>>>> +>>>>> * Add Big Serial type [Josh Bowling] +>>>>> +>>>>> ####### sbvr-types-3.4.19 - 2022-12-08 +>>>>> +>>>>> * Flowzone: Allow external contributions [Josh Bowling] +>>>>> +>>>> +>>>>
+>>>> +>>>> +>>>> ###### abstract-sql-compiler-8.3.8 - 2023-04-12 +>>>> +>>>> * Improve typings [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.7 - 2023-04-12 +>>>> +>>>> * Remove typing for non-existent JSON node [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.6 - 2023-04-12 +>>>> +>>>> * Tighten the `isXValue` function typings [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.5 - 2023-04-12 +>>>> +>>>> * Correctly treat `Value` nodes as rewritten to `Text` by the optimizer [Pagan Gazzard] +>>>> * Add EmbeddedTextNode typing [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.4 - 2023-04-12 +>>>> +>>>> * Enforce the first argument of ExtractJSONPathAsText is a JSON type node [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.3 - 2023-04-12 +>>>> +>>>> * Improve node typings [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.2 - 2023-04-12 +>>>> +>>>> * Add more node typings [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.1 - 2023-04-12 +>>>> +>>>> * Add more node typings [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.3.0 - 2023-04-11 +>>>> +>>>> * Support boolean nodes in a ValuesNode [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.2.0 - 2023-04-11 +>>>> +>>>> * Add `Between` node type [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.1.0 - 2023-04-11 +>>>> +>>>> * Add `BitwiseAnd`/`BitwiseShiftRight` node types [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.0.2 - 2023-04-06 +>>>> +>>>> * Add `NotInNode` type [Pagan Gazzard] +>>>> * Add `IsDistinctFromNode`/`IsNotDistinctFromNode` types [Pagan Gazzard] +>>>> * Add `CharacterLengthNode` type [Pagan Gazzard] +>>>> +>>>> ###### abstract-sql-compiler-8.0.1 - 2023-04-06 +>>>> +>>>> * Adds Cast node type to tree parsing [Otávio Jacobi] +>>>> +>>>> ###### odata-parser-2.4.6 - 2023-02-24 +>>>> +>>>> * Improve typings [Pagan Gazzard] +>>>> +>>>> ###### odata-parser-2.4.5 - 2023-02-23 +>>>> +>>>> * Use const/let as appropriate [Pagan Gazzard] +>>>> +>>>> ###### odata-parser-2.4.4 - 2023-02-23 +>>>> +>>>> * Use shorthand object notation [Pagan Gazzard] +>>>> +>>>> ###### odata-parser-2.4.3 - 2023-02-23 +>>>> +>>>> * Update dependencies [Pagan Gazzard] +>>>> +>>> +>>>
+>>> +>>> +>>> ##### odata-to-abstract-sql-5.9.3 - 2023-03-08 +>>> +>>> * Fixes ODataBindings imported types [Otávio Jacobi] +>>> +>>> ##### odata-to-abstract-sql-5.9.2 - 2023-02-15 +>>> +>>> * Update typings to the minimal subset of the abstract sql model we need [Pagan Gazzard] +>>> +>> +>>
+>> +>> +>> #### abstract-sql-to-typescript-1.5.0 - 2023-03-01 +>> +>> * Adds native SQL Date type [Otávio Jacobi] +>> +>> #### odata-parser-2.5.0 - 2023-04-26 +>> +>> * Update to peggy 3 and make us of the repetition operator [Pagan Gazzard] +>> +>> #### odata-to-abstract-sql-5.9.6 - 2023-04-25 +>> +>> * Collapse `AliasedFunction` into `FunctionMatch` [Pagan Gazzard] +>> +>> #### odata-to-abstract-sql-5.9.5 - 2023-04-25 +>> +>> +>>
+>> Improve typings [Pagan Gazzard] +>> +>>> ##### abstract-sql-compiler-8.4.1 - 2023-04-25 +>>> +>>> * Add much finer grained typings for abstract-sql-optimizer [Pagan Gazzard] +>>> +>> +>>
+>> +>> +>> #### odata-to-abstract-sql-5.9.4 - 2023-04-24 +>> +>> +>>
+>> Update dependencies [Pagan Gazzard] +>> +>>> ##### abstract-sql-compiler-8.4.0 - 2023-04-24 +>>> +>>> * Add support for using field type nodes with an AggregateJSON node [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.3.13 - 2023-04-24 +>>> +>>> * Deprecate `AliasableFromTypeNodes` type as it's redundant [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.3.12 - 2023-04-17 +>>> +>>> * Revert tightening of `OrderBy` to only field nodes [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.3.11 - 2023-04-13 +>>> +>>> * Do not allow ON clauses for CROSS JOIN as it is invalid [Pagan Gazzard] +>>> * Stop accepting `ExtractJSONPathAsText`/`ToJSON` as unknown node types [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.3.10 - 2023-04-13 +>>> +>>> * Fix DateNode/AnyNode typings [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.3.9 - 2023-04-13 +>>> +>>> +>>>
+>>> Update dependencies [Pagan Gazzard] +>>> +>>>> ###### sbvr-types-3.5.0 - 2023-03-21 +>>>> +>>>> * Add Big Serial type [Josh Bowling] +>>>> +>>>> ###### sbvr-types-3.4.19 - 2022-12-08 +>>>> +>>>> * Flowzone: Allow external contributions [Josh Bowling] +>>>> +>>> +>>>
+>>> +>>> +>>> ##### abstract-sql-compiler-8.3.8 - 2023-04-12 +>>> +>>> * Improve typings [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.3.7 - 2023-04-12 +>>> +>>> * Remove typing for non-existent JSON node [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.3.6 - 2023-04-12 +>>> +>>> * Tighten the `isXValue` function typings [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.3.5 - 2023-04-12 +>>> +>>> * Correctly treat `Value` nodes as rewritten to `Text` by the optimizer [Pagan Gazzard] +>>> * Add EmbeddedTextNode typing [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.3.4 - 2023-04-12 +>>> +>>> * Enforce the first argument of ExtractJSONPathAsText is a JSON type node [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.3.3 - 2023-04-12 +>>> +>>> * Improve node typings [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.3.2 - 2023-04-12 +>>> +>>> * Add more node typings [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.3.1 - 2023-04-12 +>>> +>>> * Add more node typings [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.3.0 - 2023-04-11 +>>> +>>> * Support boolean nodes in a ValuesNode [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.2.0 - 2023-04-11 +>>> +>>> * Add `Between` node type [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.1.0 - 2023-04-11 +>>> +>>> * Add `BitwiseAnd`/`BitwiseShiftRight` node types [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.0.2 - 2023-04-06 +>>> +>>> * Add `NotInNode` type [Pagan Gazzard] +>>> * Add `IsDistinctFromNode`/`IsNotDistinctFromNode` types [Pagan Gazzard] +>>> * Add `CharacterLengthNode` type [Pagan Gazzard] +>>> +>>> ##### abstract-sql-compiler-8.0.1 - 2023-04-06 +>>> +>>> * Adds Cast node type to tree parsing [Otávio Jacobi] +>>> +>>> ##### odata-parser-2.4.6 - 2023-02-24 +>>> +>>> * Improve typings [Pagan Gazzard] +>>> +>>> ##### odata-parser-2.4.5 - 2023-02-23 +>>> +>>> * Use const/let as appropriate [Pagan Gazzard] +>>> +>>> ##### odata-parser-2.4.4 - 2023-02-23 +>>> +>>> * Use shorthand object notation [Pagan Gazzard] +>>> +>>> ##### odata-parser-2.4.3 - 2023-02-23 +>>> +>>> * Update dependencies [Pagan Gazzard] +>>> +>> +>>
+>> +>> +>> #### odata-to-abstract-sql-5.9.3 - 2023-03-08 +>> +>> * Fixes ODataBindings imported types [Otávio Jacobi] +>> +>> #### sbvr-types-3.5.0 - 2023-03-21 +>> +>> * Add Big Serial type [Josh Bowling] +>> +>> #### sbvr-types-3.4.19 - 2022-12-08 +>> +>> * Flowzone: Allow external contributions [Josh Bowling] +>> +> +>
+> +> +> ### pinejs-14.63.0 - 2023-04-27 +> +> * Support returning a number from async migrations rather than db result [Pagan Gazzard] +> + +
+ +## 11.8.5 - 2023-05-17 + +* Optimize the unique release_version rule [Thodoris Greasidis] + +## 11.8.4 - 2023-05-16 + +* Add device type yocto properties to typings [Otávio Jacobi] + ## 11.8.3 - 2023-05-12 * Add partial index to optimize the unique release_version rule [Thodoris Greasidis] diff --git a/Dockerfile b/Dockerfile index 4eba2d05d..755e3586a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM balena/open-balena-base:v14.9.1 as runtime +FROM balena/open-balena-base:v16.0.17 as runtime EXPOSE 80 @@ -16,6 +16,10 @@ RUN systemctl enable open-balena-api.service # Set up a test image that can be reused FROM runtime as test +RUN apt update && apt install \ + && apt install python3-pglast \ + && rm -rf /var/lib/apt/lists/* + RUN npm ci && npm run lint # Make the default output be the runtime image diff --git a/automation/fasttest.sh b/automation/fasttest.sh index e04a338b6..599b66b5d 100755 --- a/automation/fasttest.sh +++ b/automation/fasttest.sh @@ -37,7 +37,7 @@ if [[ ! -f ".materialized-config.json" ]]; then touch .materialized-config.json fi -docker compose -f docker-compose.test-custom.yml up --renew-anon-volumes --force-recreate --detach redis db +docker compose -f docker-compose.test-custom.yml up --renew-anon-volumes --force-recreate --detach redis db minio-server minio-client if [[ -z "$test_files" ]]; then echo "Running all tests" else diff --git a/automation/test.sh b/automation/test.sh index 09077d981..dea717db0 100755 --- a/automation/test.sh +++ b/automation/test.sh @@ -15,5 +15,5 @@ docker compose -f docker-compose.test-custom.yml run \ sut bash -c "npx mocha && npm run check-model-types-generated" # ensure redis and db have clean volumes -docker compose -f docker-compose.test-custom.yml up --force-recreate --renew-anon-volumes -d db redis loki +docker compose -f docker-compose.test-custom.yml up --force-recreate --renew-anon-volumes -d db redis loki minio-server minio-client docker compose -f docker-compose.test-custom.yml run --env NODE_ENV=production sut npx mocha diff --git a/config.ts b/config.ts index 17cb4db8b..211a295e5 100644 --- a/config.ts +++ b/config.ts @@ -1,5 +1,6 @@ import type { ConfigLoader } from '@balena/pinejs'; import * as balenaModel from './src/balena'; +import { getFileUploadHandler } from './src/fileupload-handler'; export = { models: [balenaModel], @@ -25,4 +26,5 @@ export = { ], }, ], + webResourceHandler: getFileUploadHandler(), } as ConfigLoader.Config; diff --git a/config/confd/conf.d/cloudront-pk.pem.toml b/config/confd/conf.d/cloudront-pk.pem.toml new file mode 100644 index 000000000..8127f2759 --- /dev/null +++ b/config/confd/conf.d/cloudront-pk.pem.toml @@ -0,0 +1,7 @@ +[template] +src = "cloudfront-pk.pem.tmpl" +dest = "/etc/ssl/private/cloudfront-pk.pem" +keys = [ + "WEBRESOURCES_CLOUDFRONT_PRIVATEKEY", +] +mode = "0400" diff --git a/config/confd/conf.d/env.toml b/config/confd/conf.d/env.toml index 2154d1f39..e69f93b54 100644 --- a/config/confd/conf.d/env.toml +++ b/config/confd/conf.d/env.toml @@ -29,11 +29,13 @@ keys = [ "IMAGE_STORAGE_FORCE_PATH_STYLE", "IMAGE_STORAGE_PREFIX", "IMAGE_STORAGE_SECRET_KEY", + "CONTRACT_ALLOWLIST", "JSON_WEB_TOKEN_EXPIRY_MINUTES", "JSON_WEB_TOKEN_SECRET", "MIXPANEL_TOKEN", "PRODUCTION_MODE", "REDIS_HOST", + "REDIS_AUTH", "LOGS_HOST", "LOKI_HOST", "LOKI_PORT", @@ -52,5 +54,14 @@ keys = [ "VPN_PORT", "VPN_SERVICE_API_KEY", "VPN_GUEST_API_KEY", - "VPN_CONNECT_PROXY_PORT" + "VPN_CONNECT_PROXY_PORT", + "WEBRESOURCES_S3_ACCESS_KEY", + "WEBRESOURCES_S3_SECRET_KEY", + "WEBRESOURCES_S3_REGION", + "WEBRESOURCES_S3_HOST", + "WEBRESOURCES_S3_BUCKET", + "WEBRESOURCES_S3_MAX_FILESIZE", + "WEBRESOURCES_CLOUDFRONT_PUBLICKEY", + "WEBRESOURCES_CLOUDFRONT_HOST", + "WEBRESOURCES_CLOUDFRONT_PRIVATEKEY_PATH" ] diff --git a/config/confd/templates/cloudfront-pk.pem.tmpl b/config/confd/templates/cloudfront-pk.pem.tmpl new file mode 100644 index 000000000..068ad8bd9 --- /dev/null +++ b/config/confd/templates/cloudfront-pk.pem.tmpl @@ -0,0 +1 @@ +{{base64Decode (getenv "WEBRESOURCES_CLOUDFRONT_PRIVATEKEY" "")}} diff --git a/config/confd/templates/env.tmpl b/config/confd/templates/env.tmpl index 9b28ab4eb..55d261d5f 100644 --- a/config/confd/templates/env.tmpl +++ b/config/confd/templates/env.tmpl @@ -8,6 +8,7 @@ COOKIE_SESSION_SECRET={{getenv "COOKIE_SESSION_SECRET"}} {{if getenv "CONTRACTS_PRIVATE_REPO_NAME"}}CONTRACTS_PRIVATE_REPO_NAME={{getenv "CONTRACTS_PRIVATE_REPO_NAME"}}{{end}} {{if getenv "CONTRACTS_PRIVATE_REPO_BRANCH"}}CONTRACTS_PRIVATE_REPO_BRANCH"CONTRACTS_PRIVATE_REPO_BRANCH"}}{{end}} {{if getenv "CONTRACTS_PRIVATE_REPO_TOKEN"}}CONTRACTS_PRIVATE_REPO_TOKEN={{getenv "CONTRACTS_PRIVATE_REPO_TOKEN"}}{{end}} +{{if getenv "CONTRACT_ALLOWLIST"}}CONTRACT_ALLOWLIST={{getenv "CONTRACT_ALLOWLIST"}}{{end}} DATABASE_URL=postgres://{{getenv "DB_USER"}}:{{getenv "DB_PASSWORD"}}@{{getenv "DB_HOST"}}:{{getenv "DB_PORT"}}/{{getenv "DB_NAME" "resin"}} DB_HOST={{getenv "DB_HOST"}} DB_PASSWORD={{getenv "DB_PASSWORD"}} @@ -44,10 +45,14 @@ PRODUCTION_MODE={{getenv "PRODUCTION_MODE"}} PROFILING_MODE=false REDIS_IS_CLUSTER={{getenv "REDIS_IS_CLUSTER"}} REDIS_HOST={{getenv "REDIS_HOST"}} +REDIS_AUTH={{getenv "REDIS_AUTH"}} {{if getenv "REDIS_RO_HOST"}}REDIS_RO_HOST={{getenv "REDIS_RO_HOST"}}{{end}} +{{if getenv "REDIS_RO_AUTH"}}REDIS_RO_AUTH={{getenv "REDIS_RO_AUTH"}}{{end}} {{if getenv "REDIS_LOGS_IS_CLUSTER"}}REDIS_LOGS_IS_CLUSTER={{getenv "REDIS_LOGS_IS_CLUSTER"}}{{end}} {{if getenv "REDIS_LOGS_HOST"}}REDIS_LOGS_HOST={{getenv "REDIS_LOGS_HOST"}}{{end}} +{{if getenv "REDIS_LOGS_AUTH"}}REDIS_LOGS_AUTH={{getenv "REDIS_LOGS_AUTH"}}{{end}} {{if getenv "REDIS_LOGS_RO_HOST"}}REDIS_LOGS_RO_HOST={{getenv "REDIS_LOGS_RO_HOST"}}{{end}} +{{if getenv "REDIS_LOGS_RO_AUTH"}}REDIS_LOGS_RO_AUTH={{getenv "REDIS_LOGS_RO_AUTH"}}{{end}} {{if getenv "REDIS_LOGS_SHARDED_PUBSUB"}}REDIS_LOGS_SHARDED_PUBSUB={{getenv "REDIS_LOGS_SHARDED_PUBSUB"}}{{end}} {{if getenv "LOKI_HOST"}}LOKI_HOST={{getenv "LOKI_HOST"}}{{end}} {{if getenv "LOKI_PORT"}}LOKI_PORT={{getenv "LOKI_PORT"}}{{end}} @@ -75,3 +80,12 @@ VPN_SERVICE_API_KEY={{getenv "VPN_SERVICE_API_KEY"}} {{if getenv "VPN_GUEST_API_KEY"}}VPN_GUEST_API_KEY={{getenv "VPN_GUEST_API_KEY"}}{{end}} {{if getenv "AUTH_RESINOS_REGISTRY_CODE"}}AUTH_RESINOS_REGISTRY_CODE={{getenv "AUTH_RESINOS_REGISTRY_CODE"}}{{end}} {{if getenv "BROTLI_COMPRESSION_QUALITY"}}BROTLI_COMPRESSION_QUALITY={{getenv "BROTLI_COMPRESSION_QUALITY"}}{{end}} +{{if getenv "WEBRESOURCES_S3_ACCESS_KEY"}}WEBRESOURCES_S3_ACCESS_KEY={{getenv "WEBRESOURCES_S3_ACCESS_KEY"}}{{end}} +{{if getenv "WEBRESOURCES_S3_SECRET_KEY"}}WEBRESOURCES_S3_SECRET_KEY={{getenv "WEBRESOURCES_S3_SECRET_KEY"}}{{end}} +{{if getenv "WEBRESOURCES_S3_REGION"}}WEBRESOURCES_S3_REGION={{getenv "WEBRESOURCES_S3_REGION"}}{{end}} +{{if getenv "WEBRESOURCES_S3_HOST"}}WEBRESOURCES_S3_HOST={{getenv "WEBRESOURCES_S3_HOST"}}{{end}} +{{if getenv "WEBRESOURCES_S3_BUCKET"}}WEBRESOURCES_S3_BUCKET={{getenv "WEBRESOURCES_S3_BUCKET"}}{{end}} +{{if getenv "WEBRESOURCES_S3_MAX_FILESIZE"}}WEBRESOURCES_S3_MAX_FILESIZE={{getenv "WEBRESOURCES_S3_MAX_FILESIZE"}}{{end}} +{{if getenv "WEBRESOURCES_CLOUDFRONT_PUBLICKEY"}}WEBRESOURCES_CLOUDFRONT_PUBLICKEY={{getenv "WEBRESOURCES_CLOUDFRONT_PUBLICKEY"}}{{end}} +{{if getenv "WEBRESOURCES_CLOUDFRONT_HOST"}}WEBRESOURCES_CLOUDFRONT_HOST={{getenv "WEBRESOURCES_CLOUDFRONT_HOST"}}{{end}} +WEBRESOURCES_CLOUDFRONT_PRIVATEKEY_PATH=/etc/ssl/private/cloudfront-pk.pem diff --git a/docker-bake.hcl b/docker-bake.hcl new file mode 100644 index 000000000..3514664f8 --- /dev/null +++ b/docker-bake.hcl @@ -0,0 +1,8 @@ + +target "default" { + target = "runtime" + platforms = [ + "linux/amd64", + "linux/arm64" + ] +} diff --git a/docker-compose.test-custom.yml b/docker-compose.test-custom.yml index c15127696..81b3fb888 100644 --- a/docker-compose.test-custom.yml +++ b/docker-compose.test-custom.yml @@ -16,13 +16,37 @@ services: networks: - local-test loki: - image: grafana/loki:2.8.1 + image: grafana/loki:2.9.3 restart: "no" ports: - "9095:9095" - "3100:3100" networks: - local-test + minio-server: + image: minio/minio + restart: always + environment: + MINIO_ROOT_USER: USERNAME + MINIO_ROOT_PASSWORD: PASSWORD + command: server /data --console-address ":9001" + ports: + - "43680:9000" + - "43697:9001" + networks: + - local-test + minio-client: + image: minio/mc + depends_on: + - minio-server + entrypoint: > + /bin/sh -c " + /usr/bin/mc config host add minio-server http://minio-server:9000 USERNAME PASSWORD; + /usr/bin/mc mb --ignore-existing minio-server/balena-pine-web-resources; + sleep infinity; + " + networks: + - local-test sut: build: context: ./ @@ -33,6 +57,7 @@ services: - "db" - "redis" - "loki" + - "minio-client" ports: - "9228:9229" networks: @@ -89,6 +114,12 @@ services: VPN_PORT: 5433 VPN_SERVICE_API_KEY: vpn_service_api_key VPN_SERVICE_CONNECTIONS: 5 + WEBRESOURCES_S3_ACCESS_KEY: USERNAME + WEBRESOURCES_S3_SECRET_KEY: PASSWORD + WEBRESOURCES_S3_REGION: devenv + WEBRESOURCES_S3_HOST: http://minio-server:9000 + WEBRESOURCES_S3_BUCKET: balena-pine-web-resources + WEBRESOURCES_S3_MAX_FILESIZE: 50000000 sut-fast: build: @@ -99,6 +130,7 @@ services: - "db" - "redis" - "loki" + - "minio-client" ports: - "9228:9229" networks: @@ -112,7 +144,6 @@ services: - /usr/src/app/node_modules/@mapbox/node-pre-gyp - /usr/src/app/node_modules/bcrypt - /usr/src/app/node_modules/grpc - - /usr/src/app/node_modules/libpg-query - /usr/src/app/node_modules/nan - /usr/src/app/node_modules/node-addon-api - ./package.json:/usr/src/app/package.json diff --git a/index.js b/index.js index b4460d1c8..c9616f31a 100644 --- a/index.js +++ b/index.js @@ -1,10 +1,10 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ const numWorkers = process.env.NUM_WORKERS || require('os').cpus().length; if (numWorkers > 1) { const cluster = require('cluster'); if (cluster.isPrimary) { // Setup the RateLimiterCluster store on the master worker const { RateLimiterClusterMaster } = require('rate-limiter-flexible'); - // tslint:disable-next-line:no-unused-expression-chai new RateLimiterClusterMaster(); console.log(`Forking ${numWorkers} workers`); diff --git a/init.ts b/init.ts index 273274f6c..295c824bd 100644 --- a/init.ts +++ b/init.ts @@ -137,8 +137,8 @@ async function onInitHooks() { }, }); - // this will pre-fetch the device types and populate the cache... - getAccessibleDeviceTypes(sbvrUtils.api.resin); + // Pre-fetch the device types and populate the cache w/o blocking the API startup + void getAccessibleDeviceTypes(sbvrUtils.api.resin); await sbvrUtils.db.transaction((tx) => createAll(tx, permissionNames, auth.ROLES, auth.KEYS, {}), @@ -256,4 +256,5 @@ const init = async () => { process.exit(1); } }; -init(); + +void init(); diff --git a/package-lock.json b/package-lock.json index d508dcfb3..7b0b552e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,20 @@ { "name": "@balena/open-balena-api", - "version": "11.8.3", + "version": "14.15.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@balena/open-balena-api", - "version": "11.8.3", + "version": "14.15.5", "license": "AGPL-3.0", "dependencies": { - "@balena/abstract-sql-compiler": "^8.4.1", + "@balena/abstract-sql-compiler": "^9.0.3", "@balena/env-parsing": "^1.1.5", "@balena/es-version": "^1.0.2", "@balena/node-metrics-gatherer": "^6.0.3", - "@balena/pinejs": "^14.62.9", + "@balena/pinejs": "^15.3.28", + "@balena/pinejs-webresource-cloudfront": "^0.0.5", "@sentry/node": "^7.49.0", "@types/basic-auth": "^1.1.3", "@types/bluebird": "^3.5.38", @@ -32,7 +33,7 @@ "@types/memoizee": "^0.4.8", "@types/morgan": "^1.9.4", "@types/ndjson": "^2.0.1", - "@types/node": "^18.16.1", + "@types/node": "^20.6.0", "@types/node-schedule": "^2.1.0", "@types/on-finished": "^2.3.1", "@types/passport-jwt": "^3.0.8", @@ -80,1845 +81,4865 @@ "passport-jwt": "^4.0.1", "proxy-addr": "^2.0.7", "randomstring": "^1.2.3", - "rate-limiter-flexible": "^2.4.1", + "rate-limiter-flexible": "^3.0.0", "redlock": "^4.2.0", "request": "^2.88.2", "rsmq": "^0.12.4", "semver": "^7.5.0", + "snappy": "^7.2.2", "strict-event-emitter-types": "^2.0.0", "supervisor": "^0.12.0", "tar": "^6.1.13", "thirty-two": "^1.0.2", "ts-node": "^10.9.1", "typed-error": "^3.2.2", - "typescript": "^5.0.4", + "typescript": "^5.3.2", "uuid": "^9.0.0", "validator": "^13.9.0" }, "devDependencies": { - "@balena/lint": "^6.2.2", + "@balena/lint": "^7.1.1", "@types/chai": "^4.3.4", "@types/mocha": "^10.0.1", "@types/mockery": "^1.4.30", - "@types/sinon": "^10.0.14", + "@types/sinon": "^17.0.0", "@types/supertest": "^2.0.12", "@types/temp": "^0.9.1", "chai": "^4.3.7", "copyfiles": "^2.4.1", "husky": "^8.0.3", - "libpg-query": "^15.0.2", - "lint-staged": "^13.2.1", + "lint-staged": "^15.0.0", "mocha": "^10.2.0", "mockery": "^2.1.0", "nock": "^13.3.0", - "pinejs-client-supertest": "^1.4.0", + "pinejs-client-supertest": "^2.0.1", "rimraf": "^5.0.0", - "sinon": "^15.0.4", + "sinon": "^17.0.0", "supertest": "^6.3.3" }, "engines": { - "node": "^18.14.0", - "npm": "^9.4.1" + "node": "^20.6.1", + "npm": "^10.1.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "optional": true, + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/crc32c": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", + "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", + "optional": true, + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32c/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "optional": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", + "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", + "optional": true, + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "optional": true, + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "optional": true, + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "optional": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.449.0.tgz", + "integrity": "sha512-+xRyzPc2pVR1sX5cGvOIjyxWroa2hQ1IgjA5t4OV5QfQe87uFrxP2zHTclUo8+1USzaB5fESwUs2jXZQ647Z0g==", + "optional": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@aws-crypto/sha1-browser": "3.0.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.449.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.449.0", + "@aws-sdk/middleware-bucket-endpoint": "3.449.0", + "@aws-sdk/middleware-expect-continue": "3.449.0", + "@aws-sdk/middleware-flexible-checksums": "3.449.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-location-constraint": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-sdk-s3": "3.449.0", + "@aws-sdk/middleware-signing": "3.449.0", + "@aws-sdk/middleware-ssec": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/signature-v4-multi-region": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.0", + "@aws-sdk/xml-builder": "3.310.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/eventstream-serde-browser": "^2.0.12", + "@smithy/eventstream-serde-config-resolver": "^2.0.12", + "@smithy/eventstream-serde-node": "^2.0.12", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-blob-browser": "^2.0.12", + "@smithy/hash-node": "^2.0.12", + "@smithy/hash-stream-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/md5-js": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-stream": "^2.0.17", + "@smithy/util-utf8": "^2.0.0", + "@smithy/util-waiter": "^2.0.12", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.449.0.tgz", + "integrity": "sha512-HFTlFbf9jwp5BJkXbMKlEwk6oGC7AVYaPEkaNk77kzZ8RGoqVSAqe0HL74DACcJUpMD/VWYX7pfWq/Wm+2B79g==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.449.0.tgz", + "integrity": "sha512-iKh5Es9tyY+Ch17bvMubW67ydW4X3Buy9vwTIqpmXlnXEfbvjZRwycjWK2MO/P1Su3wjA14zNBq2ifNWFxkwFA==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.449.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-sdk-sts": "3.449.0", + "@aws-sdk/middleware-signing": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/cloudfront-signer": { + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/cloudfront-signer/-/cloudfront-signer-3.445.0.tgz", + "integrity": "sha512-FlBe4YsswZ2hB3kfvlBWPfWzf02/NM4S8qtEjlQQXQhiX+AqirMT6NcvbR67yGncM7Tpe9asMMHQpNCWaT5QZA==", + "dependencies": { + "@smithy/url-parser": "^2.0.12", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.445.0.tgz", + "integrity": "sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg==", + "optional": true, + "dependencies": { + "@smithy/smithy-client": "^2.1.12", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.449.0.tgz", + "integrity": "sha512-SwO9XQcBoyA0XrsSmgnMqCnR99wIyp+BjGhvzDU+Wetib7QPt++E2slJkLM/iCNc6YiqiHZtHsvXapSV7RzBJw==", + "optional": true, "dependencies": { - "@babel/types": "^7.21.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.449.0.tgz", + "integrity": "sha512-C2pMYysIfbRBR4Q+Aj7J0cRsKY/X2cOnrggrWzsEUJK3EJ1aHwrzm3HI0VM5DttJyya5hE4tZ/H1VX3zNGUtKA==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.449.0", + "@aws-sdk/credential-provider-process": "3.449.0", + "@aws-sdk/credential-provider-sso": "3.449.0", + "@aws-sdk/credential-provider-web-identity": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.449.0.tgz", + "integrity": "sha512-cCsqMqL8vmHADwIHCmTWDB4vr5fCXb4PZn3njbA/PIA92xL4S7hRmYi/1ll0CMd+fks+t/h+s+PIhFGo54C7cA==", + "optional": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@aws-sdk/credential-provider-env": "3.449.0", + "@aws-sdk/credential-provider-ini": "3.449.0", + "@aws-sdk/credential-provider-process": "3.449.0", + "@aws-sdk/credential-provider-sso": "3.449.0", + "@aws-sdk/credential-provider-web-identity": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.449.0.tgz", + "integrity": "sha512-IofhAgpwdSnaEg9H0dhydac07GCQ55Mc5oRzdzp/tm0Rl0MqnGdIvN8wYsxAeVhEi9pBSNla4eRiTu3LY6Z5+A==", + "optional": true, "dependencies": { - "@babel/types": "^7.18.6" + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.449.0.tgz", + "integrity": "sha512-Lfhh38rOjFAZBjZZJ2ehve+X048xxr+hTr+ntGOKady1GAH6W1U5UGNYuD9fr5vFaQQtAcNLKkUui+TnmJ4z/w==", + "optional": true, "dependencies": { - "@babel/types": "^7.18.6" + "@aws-sdk/client-sso": "3.449.0", + "@aws-sdk/token-providers": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.449.0.tgz", + "integrity": "sha512-BdqATzdqg39z2VXnEH7I6dzuX/Di6F/4C8FyiiJYx2+VciYdqt6GPprlpGdpngtWct/f8pA/LxQysNBVuwU/RA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, + "node_modules/@aws-sdk/lib-storage": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.449.0.tgz", + "integrity": "sha512-s2T97mjwRHNvAhYZ9po9pwsL75LhoIdNh2NJYjazGl7hPbUOJlliAVdowr1TtnpAwH+NWwc/oijUMdU31i3y5w==", + "optional": true, + "dependencies": { + "@smithy/abort-controller": "^2.0.1", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/smithy-client": "^2.1.12", + "buffer": "5.6.0", + "events": "3.3.0", + "stream-browserify": "3.0.0", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.0.0" } }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.449.0.tgz", + "integrity": "sha512-gH+IEdDfhzTmQLdWwfc23A40EhvvAhk8taXUu3DX/lXl+2lBqd4qCoGk8vfUtwh9y1kbRDnhLq04XM2DPvvj2w==", + "optional": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/parser": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.449.0.tgz", + "integrity": "sha512-OOR78JoTbCo/42HViuA+F2Uy/cNWo31mN0YZJRbnY5oAMgLRrY7d2+NlJpvHlS4XPdUZ6UHeUecJ9BAWuVuWAQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.449.0.tgz", + "integrity": "sha512-pKBgmwqA6jdiWZrYX0uaPOGdRldRiG2ArA7ufS5B7iz9X1JJP8ESZcO2wD+AbrLBtkZtVG31974qpqfNU6n4dQ==", + "optional": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@aws-crypto/crc32": "3.0.0", + "@aws-crypto/crc32c": "3.0.0", + "@aws-sdk/types": "3.449.0", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/template/node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.449.0.tgz", + "integrity": "sha512-uO7ao5eFhqEEPk8uqkhNhYqqJPPv/+i2aLchvSYrviDcmcbz9HURc8j+Q9WkmIj3jf0hjAJ9UVMQggBUfoLEgg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", - "debug": "^4.1.0", - "globals": "^11.1.0" + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.449.0.tgz", + "integrity": "sha512-MPCFKOpgke/ZV6WSxZZ/y9X4mn0ywLC2HVcaPJvDSKA0gsRtJLEQjWs2+I2QYTzEM0iwgoW9UOSgbFZYXF0Pow==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.449.0.tgz", + "integrity": "sha512-YwmPLuSx5Zjdnloxr7bArT2KgF+VvlSe5+p5T/woZWEQgINRaCLdvDB37p7x/LlHrxxZRmk20MaFwSKlJU85qQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "dev": true, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.449.0.tgz", + "integrity": "sha512-8kWxxpPBHwFUADf8JaZsUbJ+FtS3K9MGQpMx0AZhh3P9xLaoh602CL0y0+UEEdb2uh6FJJjQiIk4eQXEolhG6Q==", + "optional": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@balena/abstract-sql-compiler": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@balena/abstract-sql-compiler/-/abstract-sql-compiler-8.4.1.tgz", - "integrity": "sha512-J/UHPDcO6zFt0al63wmJNakBSxSSISFkeIRjAcC/3xwNtPBOuoh+UMMldEqzw07BRR9LSTv8eoXGvRF2WF6klQ==", + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.449.0.tgz", + "integrity": "sha512-HbgWdv0txBdV9+9aJSGtGWXnQlVvpIXS6gqmJ5ESHKwZMiRHXswwptccZkvSrLjCQr5uuN37yIz3219MRrvrmw==", + "optional": true, "dependencies": { - "@balena/sbvr-types": "^3.5.0", - "lodash": "^4.17.21" + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@balena/abstract-sql-to-typescript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@balena/abstract-sql-to-typescript/-/abstract-sql-to-typescript-1.5.0.tgz", - "integrity": "sha512-FnrX2bIPZ8WzfvwW88e8W2MIob+L0HcB8LnjPsgj0nN/W4tgxJSIVsEaXbG9L0bCdoVsiPCmvGDwOmyhj3eY5Q==", + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.449.0.tgz", + "integrity": "sha512-a+mknJkS9jDiDoHg2sFW24B0f6MgT2zs/oF6zMFvVmImvUHjbhSgBzYStE+Phl/uM1zwp1lJfbuO+I+5tVwZEw==", + "optional": true, "dependencies": { - "@balena/abstract-sql-compiler": "^8.0.0", - "@balena/odata-to-abstract-sql": "^5.9.1", - "@types/node": "^12.20.55", - "common-tags": "^1.8.2" + "@aws-sdk/middleware-signing": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@balena/abstract-sql-to-typescript/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.449.0.tgz", + "integrity": "sha512-L33efrgdDDY3myjLwraeS2tzUlebaZL6WS7ooACsOwkB9mRs6UQRpSpT90HbcSAjwLaa+xGqaxTA0biAuRjT5A==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@balena/env-parsing": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@balena/env-parsing/-/env-parsing-1.1.5.tgz", - "integrity": "sha512-9ISTzFUSwPg7hQWm4fQRLiG/5D1I2N4jBu/tR7bvlr7uOykVtdrtKxsQjPLHsJ+9pDwoPThY2FGlnrrvysKvmA==" + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.449.0.tgz", + "integrity": "sha512-NY7jt1/ukqXCUqnaK2rlm5yGFyj9sOJBqK6X8Gpu5qQaYAvIP892U1UMj6VTPC7yBLPYhW2/YCfDvxOClbqKEg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@balena/es-version": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@balena/es-version/-/es-version-1.0.2.tgz", - "integrity": "sha512-hoYEg44i27yyw1Rv+j07O2vBjK5dMsbgb6ktsPz8czxS7R0wm3tAC6h+0ump13UxMK4l3MaAbb1EGIIRM/f9ig==" + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.449.0.tgz", + "integrity": "sha512-0cRptIhIthxUYadrgb5FmcTgGhPIeXnFATBILaa2gA/ivfVY/CiqMAvOvLHxtBAYNK8/VXM9DFL5TfOt8mF2UQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@balena/lf-to-abstract-sql": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@balena/lf-to-abstract-sql/-/lf-to-abstract-sql-5.0.0.tgz", - "integrity": "sha512-3yDQiGfsgBmKFllZiLNaHg069bavh/KmXBYO12iepNEWRsifCPaXKlXbkxRG6DsaXrR1GQiVgI+t6QclSXFeng==", + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", + "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", + "optional": true, "dependencies": { - "@balena/sbvr-parser": "^1.4.3", - "lodash": "^4.17.21", - "ometa-js": "^1.5.4" + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@balena/lint": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@balena/lint/-/lint-6.2.2.tgz", - "integrity": "sha512-PD1l90kE109lhj6+U2l1jgoDC92qkpI9EFREkqIv+aCc6ZtBvBBcyjCFaD8NMw46xom/TJYC3mD8ir3QsR5Xgg==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.3", - "@types/node": "^12.20.13", - "@types/prettier": "^2.2.3", - "depcheck": "^1.4.1", - "glob": "^7.1.7", - "prettier": "^2.3.0", - "tslint": "^6.1.3", - "tslint-config-prettier": "^1.18.0", - "tslint-no-unused-expression-chai": "^0.1.4", - "typescript": "^5.0.2", - "yargs": "^16.2.0" + "node_modules/@aws-sdk/s3-request-presigner": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.449.0.tgz", + "integrity": "sha512-Rt4ys/Jt3deLCdLDyn8aEDMbpkbQaKKAitF2N2awGS/3pGGoz/V7BftMLi96yUARWo4cUWqnzfz/rEyVZFkNPg==", + "optional": true, + "dependencies": { + "@aws-sdk/signature-v4-multi-region": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-format-url": "3.449.0", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, - "bin": { - "balena-lint": "bin/balena-lint" + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.449.0.tgz", + "integrity": "sha512-Ne8dF3R2Cj6JJBw0Utm7INtoJ2PdqGNgDpeTOFTnFGSGWnsumACbcVp4ikcZzgABTCQgKx88wPdXUHUZtaBqcg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" + "node": ">=14.0.0" } }, - "node_modules/@balena/lint/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true + "node_modules/@aws-sdk/token-providers": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.449.0.tgz", + "integrity": "sha512-Tgu6Z/l75uFuNQpKIidbn1gc5bI7OKmGdH5+E/ZAc58XYvxYs9N77HjhrhAGvYQEnXY6gRm26/WSeHAAh5wlgQ==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.449.0.tgz", + "integrity": "sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@balena/node-metrics-gatherer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@balena/node-metrics-gatherer/-/node-metrics-gatherer-6.0.3.tgz", - "integrity": "sha512-BNGhWQ1Sxd5enRhbIza54YKqugW15zYDBL6vD0xSb7p5wejLmjHEyvLQs/oq/5+fpYsbD0COcVTjHQUAeyvK0w==", + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz", + "integrity": "sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==", + "optional": true, "dependencies": { - "@types/debug": "^4.1.7", - "@types/express": "^4.17.13", - "@types/on-finished": "^2.3.1", - "debug": "^4.3.4", - "express": "^4.17.3", - "on-finished": "^2.4.1", - "prom-client": "^14.0.1", - "typed-error": "^3.2.1" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@balena/odata-parser": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@balena/odata-parser/-/odata-parser-2.4.6.tgz", - "integrity": "sha512-0OZoVLLek6xAQFgPENDy27pJVPq4He/vKpsZ2sUK6rEevPWUJtjksJU3F9LBvD9feezAS2rjdSD2/mm3y6utdg==" + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.449.0.tgz", + "integrity": "sha512-hWGM/e+BnbCExXLaIEa6gRb0JW3+XGfcHgRqWkAxsKCaxQuXVIPUA3HyifimxTZDKmTbGZcyWfxCnKGS7I19rw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/util-endpoints": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@balena/odata-to-abstract-sql": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/@balena/odata-to-abstract-sql/-/odata-to-abstract-sql-5.9.2.tgz", - "integrity": "sha512-fqCP9R/FCgvH61eSpqnbdghbkz+QFgeWJmDWR1AL+QXCUAjXWmKqTZYtW7BOx2707HwZ52o0eIEv+tiK5Q9cAA==", + "node_modules/@aws-sdk/util-format-url": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.449.0.tgz", + "integrity": "sha512-ZZR2clVM1U5NH7CQ2YQfTy/JsQlLbt/p0MjvlTIPWIm9ZLFUPww7yPR0+Ps/bCAOqKYs5xj+/WjgzvRnDk4Vyg==", + "optional": true, "dependencies": { - "@balena/abstract-sql-compiler": "^8.0.0", - "@balena/odata-parser": "^2.4.2", - "@types/lodash": "^4.14.189", - "@types/memoizee": "^0.4.8", - "@types/string-hash": "^1.1.1", - "lodash": "^4.17.21", - "memoizee": "^0.4.15", - "string-hash": "^1.1.3" + "@aws-sdk/types": "3.449.0", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@balena/pinejs": { - "version": "14.62.9", - "resolved": "https://registry.npmjs.org/@balena/pinejs/-/pinejs-14.62.9.tgz", - "integrity": "sha512-lG52z9hhL6j5/luSNaJRnGsNReypImOJB6zOKCr92Jn5f4MC1sklJhojTNtK8cxgUqt+XuXdvCPHgODj1QOlQw==", + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "optional": true, "dependencies": { - "@balena/abstract-sql-compiler": "^8.0.0", - "@balena/abstract-sql-to-typescript": "^1.4.2", - "@balena/env-parsing": "^1.1.5", - "@balena/lf-to-abstract-sql": "^5.0.0", - "@balena/odata-parser": "^2.4.6", - "@balena/odata-to-abstract-sql": "^5.9.2", - "@balena/sbvr-parser": "^1.4.3", - "@balena/sbvr-types": "^3.4.18", - "@types/body-parser": "^1.19.2", - "@types/compression": "^1.7.2", - "@types/cookie-parser": "^1.4.3", - "@types/deep-freeze": "^0.1.2", - "@types/express": "^4.17.17", - "@types/express-session": "^1.17.6", - "@types/lodash": "^4.14.191", - "@types/memoizee": "^0.4.8", - "@types/method-override": "^0.0.32", - "@types/multer": "^1.4.7", - "@types/mysql": "^2.15.21", - "@types/node": "^18.14.1", - "@types/passport": "^1.0.12", - "@types/passport-local": "^1.0.35", - "@types/passport-strategy": "^0.2.35", - "@types/pg": "^8.6.6", - "@types/randomstring": "^1.1.8", - "@types/websql": "^0.0.27", - "commander": "^10.0.0", - "deep-freeze": "^0.0.1", - "eventemitter3": "^5.0.0", - "express-session": "^1.17.3", - "lodash": "^4.17.21", - "memoizee": "^0.4.15", - "pinejs-client-core": "^6.12.3", - "randomstring": "^1.2.3", - "typed-error": "^3.2.1" - }, - "bin": { - "abstract-sql-compiler": "bin/abstract-sql-compiler.js", - "odata-compiler": "bin/odata-compiler.js", - "sbvr-compiler": "bin/sbvr-compiler.js" + "tslib": "^2.5.0" }, "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - }, - "optionalDependencies": { - "bcrypt": "^5.1.0", - "body-parser": "^1.20.2", - "compression": "^1.7.4", - "cookie-parser": "^1.4.6", - "express": "^4.18.2", - "method-override": "^3.0.0", - "multer": "1.4.5-lts.1", - "mysql": "^2.18.1", - "passport": "^0.6.0", - "passport-local": "^1.0.0", - "pg": "^8.9.0", - "pg-connection-string": "^2.5.0", - "serve-static": "^1.15.0" + "node": ">=14.0.0" } }, - "node_modules/@balena/sbvr-parser": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@balena/sbvr-parser/-/sbvr-parser-1.4.3.tgz", - "integrity": "sha512-f6LgwNtJnTWOQ+1/KtSVHoS2/fSlmsVHAzvTfFJohw6lzHX1XCUAyVQLHrAvMRNN90NhPsnEpS9XMtVR0exHJA==", + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.449.0.tgz", + "integrity": "sha512-MUQ8YIVZNZZso5w1qlatHu9c1JKYvdjlAugzKhj7npgV4U8D9RBOJUd2Ct8meXPaH4DTfW1qohPlZu/fWWqNVQ==", + "optional": true, "dependencies": { - "lodash": "^4.17.21", - "ometa-js": "^1.5.4" - } - }, - "node_modules/@balena/sbvr-types": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@balena/sbvr-types/-/sbvr-types-3.5.0.tgz", - "integrity": "sha512-b7dXTpOnXLjnl4hHl44Gb7FhBf5yZEa2UBdL5nxDtcaXNPGQ+FVnWRy8s6Kzpa3FzABRnXlxl2t/d79UQ6u36Q==", - "optionalDependencies": { - "bcrypt": "^5.1.0", - "bcryptjs": "^2.4.3", - "sha.js": "^2.4.11" + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.449.0.tgz", + "integrity": "sha512-PFMnFMSQTdhMAS63anMFFkzz56kWKcjGscgl0bBheEaxo8zgfLf1AAdFuBM+Ob2KYXeMezUbxYu9zOC/0S2hvw==", + "optional": true, "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@aws-sdk/types": "3.449.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=12" + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "optional": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "tslib": "^2.3.1" } }, - "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/@grpc/grpc-js": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.11.tgz", - "integrity": "sha512-f/xC+6Z2QKsRJ+VSSFlt4hA5KSRm+PKvMWV8kMPkMgGlFidR6PeIkXrOasIY2roe+WROM6GFQLlgDKfeEZo2YQ==", + "node_modules/@aws-sdk/xml-builder": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz", + "integrity": "sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==", + "optional": true, "dependencies": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" + "tslib": "^2.5.0" }, "engines": { - "node": "^8.13.0 || >=10.10.0" + "node": ">=14.0.0" } }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.5.tgz", - "integrity": "sha512-mfcTuMbFowq1wh/Rn5KQl6qb95M21Prej3bewD9dUQMurYGVckGO/Pbe2Ocwto6sD05b/mxZLspvqwx60xO2Rg==", + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "node_modules/@babel/generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/types": "^7.23.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "devOptional": true, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" + "@babel/types": "^7.22.5" }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "devOptional": true, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "@babel/types": "^7.22.5" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "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==", + "node_modules/@babel/parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", "dev": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "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", + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/@babel/traverse": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@balena/abstract-sql-compiler": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@balena/abstract-sql-compiler/-/abstract-sql-compiler-9.0.3.tgz", + "integrity": "sha512-MIGMG1abVfyTHyIKX+4mXJfPJX3BMAw1tV3rL/MqMovvw69Pyh0WRFduYR4AiPcWjYNQK+W1SbK7Q57/L7JmdA==", + "dependencies": { + "@balena/sbvr-types": "^6.0.0", + "lodash": "^4.17.21" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=16.13.0", + "npm": ">=8.1.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, + "node_modules/@balena/abstract-sql-to-typescript": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@balena/abstract-sql-to-typescript/-/abstract-sql-to-typescript-2.1.3.tgz", + "integrity": "sha512-v/SMzFgTR4EEff58LCktYsm9/y1hjhVM9LYspOZizo3KnoW5K9novWURBYoblfwa7PPMTVHK871Z/VGtkcZk7Q==", + "dependencies": { + "@balena/abstract-sql-compiler": "^9.0.3", + "@balena/odata-to-abstract-sql": "^5.9.6", + "@types/node": "^20.0.0", + "common-tags": "^1.8.2" + }, "engines": { - "node": ">=14" + "node": ">=16.13.0", + "npm": ">=8.1.0" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + "node_modules/@balena/abstract-sql-to-typescript/node_modules/@balena/odata-parser": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@balena/odata-parser/-/odata-parser-2.5.0.tgz", + "integrity": "sha512-SoBiJ2f+Xcu25lLKUki6Z3zYFeE6c2jys9YRcsFx1rHc/B+CS28LkkUKo/M5shn1Ccej273pRmmSyV6/k/pBTw==" }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + "node_modules/@balena/abstract-sql-to-typescript/node_modules/@balena/odata-to-abstract-sql": { + "version": "5.9.6", + "resolved": "https://registry.npmjs.org/@balena/odata-to-abstract-sql/-/odata-to-abstract-sql-5.9.6.tgz", + "integrity": "sha512-oRiVU/EtzHK/jjiQrc7FsRtEgwypPQUeQwp/wznyMmRIpfcmGFxMKJSGpN+VVzBBFHrwgFFfBlw/ymK8CtkpMg==", + "dependencies": { + "@balena/abstract-sql-compiler": "^8.4.1", + "@balena/odata-parser": "^2.4.6", + "@types/lodash": "^4.14.194", + "@types/memoizee": "^0.4.8", + "@types/string-hash": "^1.1.1", + "lodash": "^4.17.21", + "memoizee": "^0.4.15", + "string-hash": "^1.1.3" + } }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "node_modules/@balena/abstract-sql-to-typescript/node_modules/@balena/odata-to-abstract-sql/node_modules/@balena/abstract-sql-compiler": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@balena/abstract-sql-compiler/-/abstract-sql-compiler-8.5.0.tgz", + "integrity": "sha512-LSomZ6hf86nnHQLi1JSasz0vL9O82Z9PwbYjNMcQdeFLv9k8BgWKcKIpzPBLNX9j4xh09Yp5irNd+0larZFchg==", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@balena/sbvr-types": "^3.5.0", + "lodash": "^4.17.21" } }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + "node_modules/@balena/abstract-sql-to-typescript/node_modules/@balena/sbvr-types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@balena/sbvr-types/-/sbvr-types-3.5.0.tgz", + "integrity": "sha512-b7dXTpOnXLjnl4hHl44Gb7FhBf5yZEa2UBdL5nxDtcaXNPGQ+FVnWRy8s6Kzpa3FzABRnXlxl2t/d79UQ6u36Q==", + "optionalDependencies": { + "bcrypt": "^5.1.0", + "bcryptjs": "^2.4.3", + "sha.js": "^2.4.11" + } }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + "node_modules/@balena/env-parsing": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@balena/env-parsing/-/env-parsing-1.1.8.tgz", + "integrity": "sha512-6L9U2LJ5Akov92962+NjjvrfZ1VPVJGZwjb8DIurRXxFIWldA+D0EOgvvmmZtgiRsG3OfZnRK9oBBYVC/bDFxA==" }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + "node_modules/@balena/es-version": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@balena/es-version/-/es-version-1.0.3.tgz", + "integrity": "sha512-ER6xtNwBSytZ1E1TmEzcE19mHpfJH8NPItxgGeJZjMYE4k5VHlBorl4UwZkAmsiW4vhy7LgJ+RGvHU15rB1L7g==" }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + "node_modules/@balena/lf-to-abstract-sql": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@balena/lf-to-abstract-sql/-/lf-to-abstract-sql-5.0.1.tgz", + "integrity": "sha512-sn95OD1cFzKt1hDjAUyEFq/gGHY5ELMZoix4qSc1n41DaNvVX0O2MRxq6mXUe0Dt1PxkSIXXg00bQv7LKy9zDg==", + "dependencies": { + "@balena/sbvr-parser": "^1.4.3", + "lodash": "^4.17.21", + "ometa-js": "^1.5.4" + } }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + "node_modules/@balena/lint": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@balena/lint/-/lint-7.2.4.tgz", + "integrity": "sha512-CIbhciF0Wtgl19kUspSdW1P6sbfXLz3s9oyQ62uEk+uuKPFz3EBqiv5qnAoDzoRRzqkEPXBswGI39scKCw8rWw==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", + "depcheck": "^1.4.7", + "eslint": "^8.53.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-chai-friendly": "^0.7.2", + "eslint-plugin-jsdoc": "^46.8.2", + "eslint-plugin-no-only-tests": "^3.1.0", + "eslint-plugin-react": "^7.33.2", + "glob": "^10.3.10", + "prettier": "^3.0.3", + "typescript": "^5.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "balena-lint": "bin/balena-lint" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=6.0.0" + } }, - "node_modules/@sentry-internal/tracing": { - "version": "7.49.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.49.0.tgz", - "integrity": "sha512-ESh3+ZneQk/3HESTUmIPNrW5GVPu/HrRJU+eAJJto74vm+6vP7zDn2YV2gJ1w18O/37nc7W/bVCgZJlhZ3cwew==", + "node_modules/@balena/node-metrics-gatherer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@balena/node-metrics-gatherer/-/node-metrics-gatherer-6.0.3.tgz", + "integrity": "sha512-BNGhWQ1Sxd5enRhbIza54YKqugW15zYDBL6vD0xSb7p5wejLmjHEyvLQs/oq/5+fpYsbD0COcVTjHQUAeyvK0w==", + "dependencies": { + "@types/debug": "^4.1.7", + "@types/express": "^4.17.13", + "@types/on-finished": "^2.3.1", + "debug": "^4.3.4", + "express": "^4.17.3", + "on-finished": "^2.4.1", + "prom-client": "^14.0.1", + "typed-error": "^3.2.1" + } + }, + "node_modules/@balena/odata-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@balena/odata-parser/-/odata-parser-3.0.1.tgz", + "integrity": "sha512-mNriSW+bhoZs2ZAI+gfaBPNKRxBeniasiKhmPCzj91NeN3d1e5vTv90QkjKwEhx5c14sWDCqiHNV9J+6Rz/KTw==", + "engines": { + "node": ">=16.13.0", + "npm": ">=8.1.0" + } + }, + "node_modules/@balena/odata-to-abstract-sql": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@balena/odata-to-abstract-sql/-/odata-to-abstract-sql-6.2.0.tgz", + "integrity": "sha512-pQCmb6mjURcTvpu8LEqZABB6Z5WqsJtBhra9htaC6rNHhE2DKhRVSAbhtXRauBIj+Q9UDmd5hBNWo7OQdTQnaQ==", "dependencies": { - "@sentry/core": "7.49.0", - "@sentry/types": "7.49.0", - "@sentry/utils": "7.49.0", - "tslib": "^1.9.3" + "@balena/abstract-sql-compiler": "^9.0.3", + "@balena/odata-parser": "^3.0.1", + "@types/lodash": "^4.14.199", + "@types/memoizee": "^0.4.9", + "@types/string-hash": "^1.1.1", + "lodash": "^4.17.21", + "memoizee": "^0.4.15", + "string-hash": "^1.1.3" }, "engines": { - "node": ">=8" + "node": ">=16.13.0", + "npm": ">=8.1.0" } }, - "node_modules/@sentry/core": { - "version": "7.49.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.49.0.tgz", - "integrity": "sha512-AlSnCYgfEbvK8pkNluUkmdW/cD9UpvOVCa+ERQswXNRkAv5aDGCL6Ihv6fnIajE++BYuwZh0+HwZUBVKTFzoZg==", + "node_modules/@balena/pinejs": { + "version": "15.3.28", + "resolved": "https://registry.npmjs.org/@balena/pinejs/-/pinejs-15.3.28.tgz", + "integrity": "sha512-YuGL6q9HUhNhK45cxk+aq6hV2g6sO5n8ccUAHzmV5hm2Nn82Bx05GPSWACGpaJq1W6PSncgd/jcIptw2O4kXsQ==", "dependencies": { - "@sentry/types": "7.49.0", - "@sentry/utils": "7.49.0", - "tslib": "^1.9.3" + "@balena/abstract-sql-compiler": "^9.0.3", + "@balena/abstract-sql-to-typescript": "^2.1.1", + "@balena/env-parsing": "^1.1.5", + "@balena/lf-to-abstract-sql": "^5.0.0", + "@balena/odata-parser": "^3.0.0", + "@balena/odata-to-abstract-sql": "^6.2.0", + "@balena/sbvr-parser": "^1.4.3", + "@balena/sbvr-types": "^6.0.0", + "@types/body-parser": "^1.19.2", + "@types/compression": "^1.7.2", + "@types/cookie-parser": "^1.4.3", + "@types/deep-freeze": "^0.1.2", + "@types/express": "^4.17.17", + "@types/express-session": "^1.17.7", + "@types/lodash": "^4.14.194", + "@types/memoizee": "^0.4.8", + "@types/method-override": "^0.0.35", + "@types/multer": "^1.4.7", + "@types/mysql": "^2.15.21", + "@types/node": "^20.0.0", + "@types/passport": "^1.0.12", + "@types/passport-local": "^1.0.35", + "@types/passport-strategy": "^0.2.35", + "@types/pg": "^8.6.6", + "@types/randomstring": "^1.1.8", + "@types/websql": "^0.0.30", + "busboy": "^1.6.0", + "commander": "^11.0.0", + "deep-freeze": "^0.0.1", + "eventemitter3": "^5.0.0", + "express-session": "^1.17.3", + "lodash": "^4.17.21", + "memoizee": "^0.4.15", + "pinejs-client-core": "^6.13.0", + "randomstring": "^1.2.3", + "typed-error": "^3.2.2" + }, + "bin": { + "abstract-sql-compiler": "bin/abstract-sql-compiler.js", + "odata-compiler": "bin/odata-compiler.js", + "sbvr-compiler": "bin/sbvr-compiler.js" }, "engines": { - "node": ">=8" + "node": ">=16.13.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@aws-sdk/client-s3": "^3.200.0", + "@aws-sdk/lib-storage": "^3.200.0", + "@aws-sdk/s3-request-presigner": "^3.200.0", + "bcrypt": "^5.1.0", + "body-parser": "^1.20.2", + "compression": "^1.7.4", + "cookie-parser": "^1.4.6", + "express": "^4.18.2", + "method-override": "^3.0.0", + "mysql": "^2.18.1", + "passport": "^0.7.0", + "passport-local": "^1.0.0", + "pg": "^8.10.0", + "pg-connection-string": "^2.5.0", + "serve-static": "^1.15.0" } }, - "node_modules/@sentry/node": { - "version": "7.49.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.49.0.tgz", - "integrity": "sha512-KLIrqcbKk4yR3g8fjl87Eyv4M9j4YI6b7sqVAZYj3FrX3mC6JQyGdlDfUpSKy604n1iAdr6OuUp5f9x7jPJaeQ==", - "dependencies": { - "@sentry-internal/tracing": "7.49.0", - "@sentry/core": "7.49.0", - "@sentry/types": "7.49.0", - "@sentry/utils": "7.49.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" + "node_modules/@balena/pinejs-webresource-cloudfront": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@balena/pinejs-webresource-cloudfront/-/pinejs-webresource-cloudfront-0.0.5.tgz", + "integrity": "sha512-mE9KX2yqs49abmpTU6ZZ9PlOhVK8jo6wMZ/GlOKAZp8+hKzLs6w5T7N9aPJziMNncM0qASdBsTufC3ZUPR84ig==", + "dependencies": { + "@aws-sdk/cloudfront-signer": "^3.398.0", + "@balena/pinejs": "^15.3.3", + "memoizee": "^0.4.15" + } + }, + "node_modules/@balena/pinejs/node_modules/passport": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", + "optional": true, + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" } }, - "node_modules/@sentry/types": { - "version": "7.49.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.49.0.tgz", - "integrity": "sha512-9yXXh7iv76+O6h2ONUVx0wsL1auqJFWez62mTjWk4350SgMmWp/zUkBxnVXhmcYqscz/CepC+Loz9vITLXtgxg==", + "node_modules/@balena/sbvr-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@balena/sbvr-parser/-/sbvr-parser-1.4.3.tgz", + "integrity": "sha512-f6LgwNtJnTWOQ+1/KtSVHoS2/fSlmsVHAzvTfFJohw6lzHX1XCUAyVQLHrAvMRNN90NhPsnEpS9XMtVR0exHJA==", + "dependencies": { + "lodash": "^4.17.21", + "ometa-js": "^1.5.4" + } + }, + "node_modules/@balena/sbvr-types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@balena/sbvr-types/-/sbvr-types-6.1.0.tgz", + "integrity": "sha512-dkQTZA/gVrRZDhsSrAyIJSbajy8c4BpIogGazT8mDmUcZJmqQiU1MmOGUzRtny/s/jtzN93fYMNtxU8T0KwfDw==", "engines": { - "node": ">=8" + "node": ">=16.13.0", + "npm": ">=8.1.0" + }, + "optionalDependencies": { + "bcrypt": "^5.1.0", + "bcryptjs": "^2.4.3", + "sha.js": "^2.4.11" } }, - "node_modules/@sentry/utils": { - "version": "7.49.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.49.0.tgz", - "integrity": "sha512-JdC9yGnOgev4ISJVwmIoFsk8Zx0psDZJAj2DV7x4wMZsO6QK+YjC7G3mUED/S5D5lsrkBZ/3uvQQhr8DQI4UcQ==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dependencies": { - "@sentry/types": "7.49.0", - "tslib": "^1.9.3" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dependencies": { - "type-detect": "4.0.8" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "node_modules/@es-joy/jsdoccomment": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz", + "integrity": "sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0" + "comment-parser": "1.4.1", + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", - "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { - "node": ">= 6" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" - }, - "node_modules/@types/basic-auth": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@types/basic-auth/-/basic-auth-1.1.3.tgz", - "integrity": "sha512-W3rv6J0IGlxqgE2eQ2pTb0gBjaGtejQpJ6uaCjz3UQ65+TFTPC5/lAE+POfx1YLdjtxvejJzsIAfd3MxWiVmfg==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "dev": true, "dependencies": { - "@types/node": "*" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@types/bluebird": { - "version": "3.5.38", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.38.tgz", - "integrity": "sha512-yR/Kxc0dd4FfwtEoLZMoqJbM/VE/W7hXn/MIjb+axcwag0iFmSPK7OBUZq1YWLynJUoWQkfUrI7T0HDqGApNSg==" + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/cache-manager": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/cache-manager/-/cache-manager-4.0.2.tgz", - "integrity": "sha512-fT5FMdzsiSX0AbgnS5gDvHl2Nco0h5zYyjwDQy4yPC7Ww6DeGMVKPRqIZtg9HOXDV2kkc18SL1B0N8f0BecrCA==" - }, - "node_modules/@types/cache-manager-ioredis": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/cache-manager-ioredis/-/cache-manager-ioredis-2.0.3.tgz", - "integrity": "sha512-IIwKdlUSztH0TMk1ikRes2CDr2vV4UrSMKhdZ6fBN1++PdgAl/JsxHKRzaSThGqjDUb0UzcWo7dZF4RPPMInMA==", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { - "@types/cache-manager": "*", - "@types/ioredis": "^4.28.10" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" - }, - "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true - }, - "node_modules/@types/chai-as-promised": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", - "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "dependencies": { - "@types/chai": "*" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/common-tags": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.1.tgz", - "integrity": "sha512-20R/mDpKSPWdJs5TOpz3e7zqbeCNuMCPhV7Yndk9KU2Rbij2r5W4RzwDPkzC+2lzUqXYu9rFzTktCBnDjHuNQg==" - }, - "node_modules/@types/compressible": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/compressible/-/compressible-2.0.0.tgz", - "integrity": "sha512-ioFCyNkga3vWcvLowx1qO+/4D0jw8JYpjoIC2b6NzQ7zk7A03Sw/KEsDuRtKqtAo2/GOhbyWQYuPVsg8h/ACcA==" - }, - "node_modules/@types/compression": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.2.tgz", - "integrity": "sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg==", - "dependencies": { - "@types/express": "*" + "node_modules/@eslint/js": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@types/compression-next": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/compression-next/-/compression-next-1.0.0.tgz", - "integrity": "sha512-EO8pK7yni4ge3dsAC2WJTy0O+U1dUFj8auJ//mpIOnzqO2hlx7JUCNBWQIxwc98xb7mKBXD4CRhHhEJTmCTyWQ==", + "node_modules/@grpc/grpc-js": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.9.tgz", + "integrity": "sha512-vQ1qwi/Kiyprt+uhb1+rHMpyk4CVRMTGNUGGPRGS7pLNfWkdCHrGEnT6T3/JyC2VZgoOX/X1KwdoU0WYQAeYcQ==", "dependencies": { - "@types/express": "*" + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" } }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", "dependencies": { - "@types/node": "*" + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/@types/cookie-parser": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.3.tgz", - "integrity": "sha512-CqSKwFwefj4PzZ5n/iwad/bow2hTCh0FlNAeWLtQM3JA/NX/iYagIpWG2cf1bQKQ2c9gU2log5VUCrn7LDOs0w==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, "dependencies": { - "@types/express": "*" + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" } }, - "node_modules/@types/cookie-session": { - "version": "2.0.44", - "resolved": "https://registry.npmjs.org/@types/cookie-session/-/cookie-session-2.0.44.tgz", - "integrity": "sha512-3DheOZ41pql6raSIkqEPphJdhA2dX2bkS+s2Qacv8YMKkoCbAIEXbsDil7351ARzMqvfyDUGNeHGiRZveIzhqQ==", - "dependencies": { - "@types/express": "*", - "@types/keygrip": "*" + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@types/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, - "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/deep-freeze": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/deep-freeze/-/deep-freeze-0.1.2.tgz", - "integrity": "sha512-M6x29Vk4681dght4IMnPIcF1SNmeEm0c4uatlTFhp+++H1oDK1THEIzuCC2WeCBVhX+gU0NndsseDS3zaCtlcQ==" - }, - "node_modules/@types/escape-html": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.2.tgz", - "integrity": "sha512-gaBLT8pdcexFztLSPRtriHeXY/Kn4907uOCZ4Q3lncFBkheAWOuNt53ypsF8szgxbEJ513UeBzcf4utN0EzEwA==" + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@types/express-session": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.6.tgz", - "integrity": "sha512-L6sB04HVA4HEZo1hDL65JXdZdBJtzZnCiw/P7MnO4w6746tJCNtXlHtzEASyI9ccn9zyOw6IbqQuhVa03VpO4w==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { - "@types/express": "*" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@types/google-protobuf": { - "version": "3.15.6", - "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz", - "integrity": "sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==" + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/@types/ioredis": { - "version": "4.28.10", - "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", - "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", - "dependencies": { - "@types/node": "*" + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, "dependencies": { - "@types/node": "*" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@types/keygrip": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", - "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" - }, - "node_modules/@types/lodash": { - "version": "4.14.194", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", - "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==" - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "node_modules/@types/memoizee": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@types/memoizee/-/memoizee-0.4.8.tgz", - "integrity": "sha512-qDpXKGgwKywnQt/64fH1O0LiPA++QGIYeykEUiZ51HymKVRLnUSGcRuF60IfpPeeXiuRwiR/W4y7S5VzbrgLCA==" - }, - "node_modules/@types/method-override": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/method-override/-/method-override-0.0.32.tgz", - "integrity": "sha512-Vf9AohOlANmhNswCbkdRG3p+tYcq1+63O+ex1UoNIVYWW3tO8Mx6Z+5G1R8DENeC6/t1SiDJS+ph6ACKpryokg==", + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "optional": true, "dependencies": { - "@types/express": "*" + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true - }, - "node_modules/@types/mockery": { - "version": "1.4.30", - "resolved": "https://registry.npmjs.org/@types/mockery/-/mockery-1.4.30.tgz", - "integrity": "sha512-uv53RrNdhbkV/3VmVCtfImfYCWC3GTTRn3R11Whni3EJ+gb178tkZBVNj2edLY5CMrB749dQi+SJkg87jsN8UQ==", - "dev": true - }, - "node_modules/@types/morgan": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.4.tgz", - "integrity": "sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==", + "node_modules/@mapbox/node-pre-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "optional": true, "dependencies": { - "@types/node": "*" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" - }, - "node_modules/@types/multer": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", - "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "optional": true, "dependencies": { - "@types/express": "*" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/mysql": { - "version": "2.15.21", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.21.tgz", - "integrity": "sha512-NPotx5CVful7yB+qZbWtXL2fA4e7aEHkihHLjklc6ID8aq7bhguHgeIoC1EmSNTAuCgI6ZXrjt2ZSaXnYX0EUg==", - "dependencies": { - "@types/node": "*" + "node_modules/@napi-rs/snappy-android-arm-eabi": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm-eabi/-/snappy-android-arm-eabi-7.2.2.tgz", + "integrity": "sha512-H7DuVkPCK5BlAr1NfSU8bDEN7gYs+R78pSHhDng83QxRnCLmVIZk33ymmIwurmoA1HrdTxbkbuNl+lMvNqnytw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-android-arm64": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm64/-/snappy-android-arm64-7.2.2.tgz", + "integrity": "sha512-2R/A3qok+nGtpVK8oUMcrIi5OMDckGYNoBLFyli3zp8w6IArPRfg1yOfVUcHvpUDTo9T7LOS1fXgMOoC796eQw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-darwin-arm64": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-arm64/-/snappy-darwin-arm64-7.2.2.tgz", + "integrity": "sha512-USgArHbfrmdbuq33bD5ssbkPIoT7YCXCRLmZpDS6dMDrx+iM7eD2BecNbOOo7/v1eu6TRmQ0xOzeQ6I/9FIi5g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-darwin-x64": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-x64/-/snappy-darwin-x64-7.2.2.tgz", + "integrity": "sha512-0APDu8iO5iT0IJKblk2lH0VpWSl9zOZndZKnBYIc+ei1npw2L5QvuErFOTeTdHBtzvUHASB+9bvgaWnQo4PvTQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-freebsd-x64": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-freebsd-x64/-/snappy-freebsd-x64-7.2.2.tgz", + "integrity": "sha512-mRTCJsuzy0o/B0Hnp9CwNB5V6cOJ4wedDTWEthsdKHSsQlO7WU9W1yP7H3Qv3Ccp/ZfMyrmG98Ad7u7lG58WXA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-linux-arm-gnueabihf": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm-gnueabihf/-/snappy-linux-arm-gnueabihf-7.2.2.tgz", + "integrity": "sha512-v1uzm8+6uYjasBPcFkv90VLZ+WhLzr/tnfkZ/iD9mHYiULqkqpRuC8zvc3FZaJy5wLQE9zTDkTJN1IvUcZ+Vcg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-linux-arm64-gnu": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm64-gnu/-/snappy-linux-arm64-gnu-7.2.2.tgz", + "integrity": "sha512-LrEMa5pBScs4GXWOn6ZYXfQ72IzoolZw5txqUHVGs8eK4g1HR9HTHhb2oY5ySNaKakG5sOgMsb1rwaEnjhChmQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-linux-arm64-musl": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm64-musl/-/snappy-linux-arm64-musl-7.2.2.tgz", + "integrity": "sha512-3orWZo9hUpGQcB+3aTLW7UFDqNCQfbr0+MvV67x8nMNYj5eAeUtMmUE/HxLznHO4eZ1qSqiTwLbVx05/Socdlw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-linux-x64-gnu": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-gnu/-/snappy-linux-x64-gnu-7.2.2.tgz", + "integrity": "sha512-jZt8Jit/HHDcavt80zxEkDpH+R1Ic0ssiVCoueASzMXa7vwPJeF4ZxZyqUw4qeSy7n8UUExomu8G8ZbP6VKhgw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-linux-x64-musl": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-musl/-/snappy-linux-x64-musl-7.2.2.tgz", + "integrity": "sha512-Dh96IXgcZrV39a+Tej/owcd9vr5ihiZ3KRix11rr1v0MWtVb61+H1GXXlz6+Zcx9y8jM1NmOuiIuJwkV4vZ4WA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-win32-arm64-msvc": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-arm64-msvc/-/snappy-win32-arm64-msvc-7.2.2.tgz", + "integrity": "sha512-9No0b3xGbHSWv2wtLEn3MO76Yopn1U2TdemZpCaEgOGccz1V+a/1d16Piz3ofSmnA13HGFz3h9NwZH9EOaIgYA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-win32-ia32-msvc": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-ia32-msvc/-/snappy-win32-ia32-msvc-7.2.2.tgz", + "integrity": "sha512-QiGe+0G86J74Qz1JcHtBwM3OYdTni1hX1PFyLRo3HhQUSpmi13Bzc1En7APn+6Pvo7gkrcy81dObGLDSxFAkQQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-win32-x64-msvc": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-x64-msvc/-/snappy-win32-x64-msvc-7.2.2.tgz", + "integrity": "sha512-a43cyx1nK0daw6BZxVcvDEXxKMFLSBSDTAhsFD0VqSKcC7MGUBMaqyoWUcMiI7LBSz4bxUmxDWKfCYzpEmeb3w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@sentry-internal/tracing": { + "version": "7.80.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.80.0.tgz", + "integrity": "sha512-P1Ab9gamHLsbH9D82i1HY8xfq9dP8runvc4g50AAd6OXRKaJ45f2KGRZUmnMEVqBQ7YoPYp2LFMkrhNYbcZEoQ==", + "dependencies": { + "@sentry/core": "7.80.0", + "@sentry/types": "7.80.0", + "@sentry/utils": "7.80.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/core": { + "version": "7.80.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.80.0.tgz", + "integrity": "sha512-nJiiymdTSEyI035/rdD3VOq6FlOZ2wWLR5bit9LK8a3rzHU3UXkwScvEo6zYgs0Xp1sC0yu1S9+0BEiYkmi29A==", + "dependencies": { + "@sentry/types": "7.80.0", + "@sentry/utils": "7.80.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node": { + "version": "7.80.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.80.0.tgz", + "integrity": "sha512-J35fqe8J5ac/17ZXT0ML3opYGTOclqYNE9Sybs1y9n6BqacHyzH8By72YrdI03F7JJDHwrcGw+/H8hGpkCwi0Q==", + "dependencies": { + "@sentry-internal/tracing": "7.80.0", + "@sentry/core": "7.80.0", + "@sentry/types": "7.80.0", + "@sentry/utils": "7.80.0", + "https-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/types": { + "version": "7.80.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.80.0.tgz", + "integrity": "sha512-4bpMO+2jWiWLDa8zbTASWWNLWe6yhjfPsa7/6VH5y9x1NGtL8oRbqUsTgsvjF3nmeHEMkHQsC8NHPaQ/ibFmZQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.80.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.80.0.tgz", + "integrity": "sha512-XbBCEl6uLvE50ftKwrEo6XWdDaZXHXu+kkHXTPWQEcnbvfZKLuG9V0Hxtxxq3xQgyWmuF05OH1GcqYqiO+v5Yg==", + "dependencies": { + "@sentry/types": "7.80.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@smithy/abort-controller": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", + "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz", + "integrity": "sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.1.tgz", + "integrity": "sha512-N2oCZRglhWKm7iMBu7S6wDzXirjAofi7tAd26cxmgibRYOBS4D3hGfmkwCpHdASZzwZDD8rluh0Rcqw1JeZDRw==", + "optional": true, + "dependencies": { + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.17.tgz", + "integrity": "sha512-iQ8Q8ojqiPqRKdybDI1g7HvG8EcnekRnH3DYeNTrT26vDuPq2nomyMCc0DZnPW+uAUcLCGZpAmGTAvEOYX55wA==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.0.tgz", + "integrity": "sha512-amqeueHM3i02S6z35WlXp7gejBnRloT5ctR/mQLlg/6LWGd70Avc2epzuuWtCptNg2ak5/yODD1fAVs9NPCyqg==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/property-provider": "^2.0.13", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", + "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", + "optional": true, + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.12.tgz", + "integrity": "sha512-0pi8QlU/pwutNshoeJcbKR1p7Ie5STd8UFAMX5xhSoSJjNlxIv/OsHbF023jscMRN2Prrqd6ToGgdCnsZVQjvg==", + "optional": true, + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.12.tgz", + "integrity": "sha512-I0XfwQkIX3gAnbrU5rLMkBSjTM9DHttdbLwf12CXmj7SSI5dT87PxtKLRrZGanaCMbdf2yCep+MW5/4M7IbvQA==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.12.tgz", + "integrity": "sha512-vf1vMHGOkG3uqN9x1zKOhnvW/XgvhJXWqjV6zZiT2FMjlEayugQ1mzpSqr7uf89+BzjTzuZKERmOsEAmewLbxw==", + "optional": true, + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.12.tgz", + "integrity": "sha512-xZ3ZNpCxIND+q+UCy7y1n1/5VQEYicgSTNCcPqsKawX+Vd+6OcFX7gUHMyPzL8cZr+GdmJuxNleqHlH4giK2tw==", + "optional": true, + "dependencies": { + "@smithy/eventstream-codec": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.5.tgz", + "integrity": "sha512-m9yoTx+64XRSpCzWArOpvHeAuVfI2LFz2hDzgzjzCLlN8IIwzkFaCav5ShsYxx4iu9sXp09+on0a5VROY9+MFQ==", + "optional": true, + "dependencies": { + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.13.tgz", + "integrity": "sha512-vZeV2dAzNrAet50eIHjKH9kh8fDZTX8ia6eMD9juzMVNd/a/VyEFvguQ2Uawp3Oj9+IUMSCcmkBaQMmc5RFIHg==", + "optional": true, + "dependencies": { + "@smithy/chunked-blob-reader": "^2.0.0", + "@smithy/chunked-blob-reader-native": "^2.0.1", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.14.tgz", + "integrity": "sha512-eS2Q4IE2AZDfrfpXma49M2H1NVcs7VFg2KZ5hndQZibCmFJehS9CjjwIu0aWC61p4sEB7jWXw70bzOllyQU6GQ==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.14.tgz", + "integrity": "sha512-8ZVKfeC8II5dThWWMZ7S8dSstzmzMTEMePXHDoq+Vxsrm0epU2XnUzwriRFTsWmxrD8Q9/GvfHoy2sm6YTc26A==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", + "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.14.tgz", + "integrity": "sha512-rwEMAfqFGwVO4WOiu5+g/GzOh9mTkpFr8nX9Xv7pK6CxskxHXjDX5f64OA+v5j9WpyzyCPZC2JfASUFAFy29jQ==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", + "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", + "optional": true, + "dependencies": { + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.5.tgz", + "integrity": "sha512-eRhI0mI9tnkpmLwJbprV+MdlPyOMe8tFtVrNFMUlgOQrJeYv5AD5UFRn/KhgNX1vO1pVgpPtD9R+cRuFhj/lIQ==", + "optional": true, + "dependencies": { + "@smithy/middleware-serde": "^2.0.12", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/shared-ini-file-loader": "^2.2.3", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.19.tgz", + "integrity": "sha512-VMS1GHxLpRnuLHrPTj/nb9aD99jJsNzWX07F00fIuV9lkz3lWP7RUM7P1aitm0+4YfhShPn+Wri8/CuoqPOziA==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/protocol-http": "^3.0.8", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-retry": "^2.0.5", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", + "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", + "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.4.tgz", + "integrity": "sha512-kROLnHFatpimtmZ8YefsRRb5OJ8LVIVNhUWp67KHL4D2Vjd+WpIHMzWtkLLV4p0qXpY+IxmwcL2d2XMPn8ppsQ==", + "optional": true, + "dependencies": { + "@smithy/property-provider": "^2.0.13", + "@smithy/shared-ini-file-loader": "^2.2.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", + "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", + "optional": true, + "dependencies": { + "@smithy/abort-controller": "^2.0.12", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", + "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", + "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", + "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", + "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.3.tgz", + "integrity": "sha512-VDyhCNycPbNkPidMnBgYQeSwJkoATRFm5VrveVqIPAjsdGutf7yZpPycuDWW9bRFnuuwaBhCC0pA7KCH0+2wrg==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.14.tgz", + "integrity": "sha512-ZUU8gGlDVFyU3tM9tCEbq2FxHtyfX2qYBUKoIGH23GSxbC4+Ld/HeFL2EZYIFrYwoOuPBO30+g3fAohOP9Ax3Q==", + "optional": true, + "dependencies": { + "@smithy/eventstream-codec": "^2.0.12", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.14.tgz", + "integrity": "sha512-SMiflchpKadmyvjWPTVwBKjDcEigRHkiUjtzLBlTp9dEp2FmbCjpyc95BNvUdOGOMcPCIkoQQGeabo6avIZNiw==", + "optional": true, + "dependencies": { + "@smithy/middleware-stack": "^2.0.6", + "@smithy/types": "^2.4.0", + "@smithy/util-stream": "^2.0.19", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", + "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", + "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "optional": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.18.tgz", + "integrity": "sha512-Dok3alNbkKI3MGTiW9zYGY/1gmU0MgrUMk0aRuNOeypY1TuKJ4NuNAbq5dv1GnWvYeFzWk4j0FMIwpJLF8DVmg==", + "optional": true, + "dependencies": { + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.14", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.24.tgz", + "integrity": "sha512-f5wM/SbjvDTCXxk//od43hhnEPItdZB3ByAqbpz5dkum/vLQe2hFRvMNbpt7UA4htQTrbUmLWJatUmvGQEFypg==", + "optional": true, + "dependencies": { + "@smithy/config-resolver": "^2.0.17", + "@smithy/credential-provider-imds": "^2.1.0", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.14", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.3.tgz", + "integrity": "sha512-rMYXLMdAMVbJAEHhNlCSJsAxo3NG3lcPja7WmesjAbNrMSyYZ6FnHHTy8kzRhddn4eAtLvPBSO6LiBB21gCoHQ==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", + "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", + "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", + "optional": true, + "dependencies": { + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.19.tgz", + "integrity": "sha512-2kwTRyOKJcRFeO1LX4Qn1vniEyU1urMG1DfomTpiOLTFS0iV3dsqNvYNltvTbmzZd9u0f15H96l38QP8dsKF1w==", + "optional": true, + "dependencies": { + "@smithy/fetch-http-handler": "^2.2.5", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/types": "^2.4.0", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", + "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.12.tgz", + "integrity": "sha512-3sENmyVa1NnOPoiT2NCApPmu7ukP7S/v7kL9IxNmnygkDldn7/yK0TP42oPJLwB2k3mospNsSePIlqdXEUyPHA==", + "optional": true, + "dependencies": { + "@smithy/abort-controller": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/basic-auth": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@types/basic-auth/-/basic-auth-1.1.6.tgz", + "integrity": "sha512-RGqL8Eh/pHAt9REIlIbw8w1YbYs3s7syfPScYgq3qDiY7oaMUxGVA/YobE6hq4vL1kLRdE4g6CIvEnYdY64dPg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/bluebird": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.42.tgz", + "integrity": "sha512-Jhy+MWRlro6UjVi578V/4ZGNfeCOcNCp0YaFNIUGFKlImowqwb1O/22wDVk3FDGMLqxdpOV3qQHD5fPEH4hK6A==" + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cache-manager": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/cache-manager/-/cache-manager-4.0.5.tgz", + "integrity": "sha512-DWzxGv0Kt7NKM2uFoHOHblobJJepgoC56sAEkyFJhqRG36nxvfkrr4Gb/1TXza32GC2A+Z8+bgxFT5FEMGdkyg==" + }, + "node_modules/@types/cache-manager-ioredis": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/cache-manager-ioredis/-/cache-manager-ioredis-2.0.6.tgz", + "integrity": "sha512-MNJLj/I8hqXQEv+erzrJE2vnZIMbkgbZspaJDwWKk8b4smFkxSLnvienBrILxw7O/xZKtPcIW0Ml7RBXTseJGQ==", + "dependencies": { + "@types/cache-manager": "*", + "@types/ioredis": "^4.28.10" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==" + }, + "node_modules/@types/chai": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-of+ICnbqjmFCiixUnqRulbylyXQrPqIGf/B3Jax1wIF3DvSheysQxAWvqHhZiW3IQrycvokcLcFQlveGp+vyNg==", + "dev": true + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", + "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/common-tags": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.4.tgz", + "integrity": "sha512-S+1hLDJPjWNDhcGxsxEbepzaxWqURP/o+3cP4aa2w7yBXgdcmKGQtZzP8JbyfOd0m+33nh+8+kvxYE2UJtBDkg==" + }, + "node_modules/@types/compressible": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/compressible/-/compressible-2.0.2.tgz", + "integrity": "sha512-PUrWVQMqNGuDA8Jm2mNrEGJ2C1NrXD8wNMj0e90gCXZ3D862ICArVJc2TrgaAWMD7722H9TfSqEy4u3N7Q5x4A==" + }, + "node_modules/@types/compression": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/compression-next": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/compression-next/-/compression-next-1.0.3.tgz", + "integrity": "sha512-OpoMqxxMv5tgTV8vVlqhxRUKuNKUEAZcgyjpC6qyXWKKzNkCJA6qqetjszDXwhyXrwYSqPphRb3bCfmfAOx1PQ==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-KoooCrD56qlLskXPLGUiJxOMnv5l/8m7cQD2OxJ73NPMhuSz9PmvwRD6EpjDyKBVrdJDdQ4bQK7JFNHnNmax0w==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/cookie-session": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/@types/cookie-session/-/cookie-session-2.0.47.tgz", + "integrity": "sha512-Xw+NG/nKgEcnHmecFd4X81BfzZr8+Dj+mNigYLbZ8ZNhCSowsJCzpH47EiyabGnx/lDgPNWuq1r8LUIr8yt4lg==", + "dependencies": { + "@types/express": "*", + "@types/keygrip": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-b698BLJ6kPVd6uhHsY7wlebZdrWPXYied883PDSzpJZYOP97EOn/oGdLCH3jJf157srkFReIZY5v0H1s8Dozrg==", + "dev": true + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/deep-freeze": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/deep-freeze/-/deep-freeze-0.1.5.tgz", + "integrity": "sha512-KZtR+jtmgkCpgE0f+We/QEI2Fi0towBV/tTkvHVhMzx+qhUVGXMx7pWvAtDp6vEWIjdKLTKpqbI/sORRCo8TKg==" + }, + "node_modules/@types/escape-html": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.4.tgz", + "integrity": "sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express-session": { + "version": "1.17.10", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.10.tgz", + "integrity": "sha512-U32bC/s0ejXijw5MAzyaV4tuZopCh/K7fPoUDyNbsRXHvPSeymygYD1RFL99YOLhF5PNOkzswvOTRaVHdL1zMw==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/google-protobuf": { + "version": "3.15.10", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.10.tgz", + "integrity": "sha512-uiyKJCa8hbmPE4yxwjbkMOALaBAiOVcatW/yEGbjTqwAh4kzNgQPWRlJMNPXpB5CPUM66xsYufiSX9WKHZCE9g==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/ioredis": { + "version": "4.28.10", + "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", + "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", + "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/keygrip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.5.tgz", + "integrity": "sha512-M+BUYYOXgiYoab5L98VpOY1PzmDwWcTkqqu4mdluez5qOTDV0MVPChxhRIPeIFxQgSi3+6qjg1PnGFaGlW373g==" + }, + "node_modules/@types/lodash": { + "version": "4.14.201", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz", + "integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==" + }, + "node_modules/@types/memoizee": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/@types/memoizee/-/memoizee-0.4.11.tgz", + "integrity": "sha512-2gyorIBZu8GoDr9pYjROkxWWcFtHCquF7TVbN2I+/OvgZhnIGQS0vX5KJz4lXNKb8XOSfxFOSG5OLru1ESqLUg==" + }, + "node_modules/@types/method-override": { + "version": "0.0.35", + "resolved": "https://registry.npmjs.org/@types/method-override/-/method-override-0.0.35.tgz", + "integrity": "sha512-HdhM5xiIV8fwsZ3B8e9IKWJOqEgmXXBJ/qQzhs5Z8idjsszqEX4j/7/QAcso27ArZ1tSBXg2XMlI1cIHAsCTXA==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.4.tgz", + "integrity": "sha512-xKU7bUjiFTIttpWaIZ9qvgg+22O1nmbA+HRxdlR+u6TWsGfmFdXrheJoK4fFxrHNVIOBDvDNKZG+LYBpMHpX3w==", + "dev": true + }, + "node_modules/@types/mockery": { + "version": "1.4.33", + "resolved": "https://registry.npmjs.org/@types/mockery/-/mockery-1.4.33.tgz", + "integrity": "sha512-vpuuVxCnCEM0OakYNoyFs40mjJFJFJahBHyx0Z0Piysof+YwlDJzNO4V1weRvYySAmtAvlb0UHtxVO2IfTcykw==", + "dev": true + }, + "node_modules/@types/morgan": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.9.tgz", + "integrity": "sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/multer": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.10.tgz", + "integrity": "sha512-6l9mYMhUe8wbnz/67YIjc7ZJyQNZoKq7fRXVf7nMdgWgalD0KyzJ2ywI7hoATUSXSbTu9q2HBiEwzy0tNN1v2w==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/mysql": { + "version": "2.15.24", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.24.tgz", + "integrity": "sha512-I0qULi8JBEg0oso69Fe4H4QPR+IdE0yRhZLu3uRhGwQ92m2Epz1cSD5jnXY0nMeZQKd61U8EvnOVMbNE74o3Kw==", + "dependencies": { + "@types/node": "*" } }, "node_modules/@types/ndjson": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/ndjson/-/ndjson-2.0.1.tgz", - "integrity": "sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/ndjson/-/ndjson-2.0.4.tgz", + "integrity": "sha512-ajAl7AjhFstF6waORYNSS49GL5iBKisqJlgvXuprXFKCX9fto4ordlNU3+XMgkMddgeR0WoQQBmKUk0v0dJ4pw==", + "dependencies": { + "@types/node": "*", + "@types/through": "*" + } + }, + "node_modules/@types/node": { + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-schedule": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@types/node-schedule/-/node-schedule-2.1.3.tgz", + "integrity": "sha512-sTWHBCD+17XjHRuxkLwoC0VdxAx/TVNny+1DUxv8RTPJNZGuokEKiSiGag+v9XdrnJ/c36ObWi4HA3JiokvOQw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/on-finished": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/on-finished/-/on-finished-2.3.4.tgz", + "integrity": "sha512-Ld4UQD3udYcKPaAWlI1EYXKhefkZcTlpqOLkQRmN3u5Ml/tUypMivUHbNH8LweP4H4FlhGGO+uBjJI1Y1dkE1g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true + }, + "node_modules/@types/passport": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.15.tgz", + "integrity": "sha512-oHOgzPBp5eLI1U/7421qYV/ZySQXMYCBSfRkDe1tQ0YrIbLY/M/76qIXE7Bs7lFyvw1x5QqiNQ9imvh0fQHe9Q==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/passport-jwt": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.13.tgz", + "integrity": "sha512-fjHaC6Bv8EpMMqzTnHP32SXlZGaNfBPC/Po5dmRGYi2Ky7ljXPbGnOy+SxZqa6iZvFgVhoJ1915Re3m93zmcfA==", + "dependencies": { + "@types/express": "*", + "@types/jsonwebtoken": "*", + "@types/passport-strategy": "*" + } + }, + "node_modules/@types/passport-local": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.38.tgz", + "integrity": "sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==", + "dependencies": { + "@types/express": "*", + "@types/passport": "*", + "@types/passport-strategy": "*" + } + }, + "node_modules/@types/passport-strategy": { + "version": "0.2.38", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", + "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", + "dependencies": { + "@types/express": "*", + "@types/passport": "*" + } + }, + "node_modules/@types/pg": { + "version": "8.10.9", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.9.tgz", + "integrity": "sha512-UksbANNE/f8w0wOMxVKKIrLCbEMV+oM1uKejmwXr39olg4xqcfBDbXxObJAt6XxHbDa4XTKOlUEcEltXDX+XLQ==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^4.0.1" + } + }, + "node_modules/@types/proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-TgAHHO4tNG3HgLTUhB+hM4iwW6JUNeQHCLnF1DjaDA9c69PN+IasoFu2MYDhubFc+ZIw5c5t9DMtjvrD6R3Egg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" + }, + "node_modules/@types/randomstring": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@types/randomstring/-/randomstring-1.1.11.tgz", + "integrity": "sha512-j3y9mKzGyYN5PHWjRv8Ah/ieZlApRbfSb0rBWVrW9Z+z5N1xjZpbBxgVKbO7WAGfnMpvLG2Gg8gRPxo+f0JWmg==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/redis": { + "version": "2.8.32", + "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.32.tgz", + "integrity": "sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/redlock": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/redlock/-/redlock-4.0.7.tgz", + "integrity": "sha512-5D6egBv0fCfdbmnCETjEynVuiwFMEFFc3YFjh9EwhaaVTAi0YmB6UI1swq1S1rjIu+n27ppmlTFDK3D3cadJqg==", + "dependencies": { + "@types/bluebird": "*", + "@types/ioredis": "^4.28.10", + "@types/redis": "^2.8.0" + } + }, + "node_modules/@types/request": { + "version": "2.48.12", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", + "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/semver": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sinon": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.1.tgz", + "integrity": "sha512-Q2Go6TJetYn5Za1+RJA1Aik61Oa2FS8SuJ0juIqUuJ5dZR4wvhKfmSdIqWtQ3P6gljKWjW0/R7FZkA4oXVL6OA==", + "dev": true, + "dependencies": { + "@types/sinonjs__fake-timers": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", + "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", + "dev": true + }, + "node_modules/@types/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-p6skq756fJWiA59g2Uss+cMl6tpoDGuCBuxG0SI1t0NwJmYOU66LAMS6QiCgu7cUh3/hYCaMl5phcCW1JP5wOA==" + }, + "node_modules/@types/superagent": { + "version": "4.1.21", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.21.tgz", + "integrity": "sha512-yrbAccEEY9+BSa1wji3ry8R3/BdW9kyWnjkRKctrtw5ebn/k2a2CsMeaQ7dD4iLfomgHkomBVIVgOFRMV4XYHA==", + "dev": true, + "dependencies": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "node_modules/@types/supertest": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.16.tgz", + "integrity": "sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==", + "dev": true, + "dependencies": { + "@types/superagent": "*" + } + }, + "node_modules/@types/tar": { + "version": "6.1.9", + "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.9.tgz", + "integrity": "sha512-T3+O+OQd9cdGmOXuKQY9+B0ceZHRlGVPQ7M5QZqkaPyP/vWnxPXM2aCegq8GP/n1n9dBfq2EBUqCSKKjQAVOPA==", + "dependencies": { + "@types/node": "*", + "minipass": "^4.0.0" + } + }, + "node_modules/@types/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@types/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-+VfWIwrlept2VBTj7Y2wQnI/Xfscy1u8Pyj/puYwss6V1IblXn1x7S0S9eFh6KyBolgLCm+rUFzhFAbdkR691g==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/through": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" + }, + "node_modules/@types/uuid": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.7.tgz", + "integrity": "sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==" + }, + "node_modules/@types/validator": { + "version": "13.11.6", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.6.tgz", + "integrity": "sha512-HUgHujPhKuNzgNXBRZKYexwoG+gHKU+tnfPqjWXFghZAnn73JElicMkuSKJyLGr9JgyA8IgK7fj88IyA9rwYeQ==" + }, + "node_modules/@types/websql": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/websql/-/websql-0.0.30.tgz", + "integrity": "sha512-YGh8wE/p3ZJBH/cx0S/xk5Bv2VJmT5Z9iMipjbRSXX9Mi1QWscPugmaHepBACNKX5DQC/S8wtuc0YCo/+SxrOw==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", + "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/type-utils": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", + "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", + "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", + "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", + "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.8.tgz", + "integrity": "sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.0", + "@vue/shared": "3.3.8", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.8.tgz", + "integrity": "sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.3.8", + "@vue/shared": "3.3.8" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.8.tgz", + "integrity": "sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.0", + "@vue/compiler-core": "3.3.8", + "@vue/compiler-dom": "3.3.8", + "@vue/compiler-ssr": "3.3.8", + "@vue/reactivity-transform": "3.3.8", + "@vue/shared": "3.3.8", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5", + "postcss": "^8.4.31", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.8.tgz", + "integrity": "sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.3.8", + "@vue/shared": "3.3.8" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.8.tgz", + "integrity": "sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.0", + "@vue/compiler-core": "3.3.8", + "@vue/shared": "3.3.8", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.8.tgz", + "integrity": "sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/align-text/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true + }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "optional": true, "dependencies": { - "@types/node": "*", - "@types/through": "*" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/@types/node": { - "version": "18.16.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.1.tgz", - "integrity": "sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA==" + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" }, - "node_modules/@types/node-schedule": { + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/node-schedule/-/node-schedule-2.1.0.tgz", - "integrity": "sha512-NiTwl8YN3v/1YCKrDFSmCTkVxFDylueEqsOFdgF+vPsm+AlyJKGAo5yzX1FiOxPsZiN6/r8gJitYx2EaSuBmmg==", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, "dependencies": { - "@types/node": "*" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/on-finished": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@types/on-finished/-/on-finished-2.3.1.tgz", - "integrity": "sha512-mzVYaYcFs5Jd2n/O6uYIRUsFRR1cHyZLRvkLCU0E7+G5WhY0qBDAR5fUCeZbvecYOSh9ikhlesyi2UfI8B9ckQ==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, "dependencies": { - "@types/node": "*" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "node_modules/array.prototype.tosorted": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, - "node_modules/@types/passport": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.12.tgz", - "integrity": "sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw==", + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { - "@types/express": "*" + "safer-buffer": "~2.1.0" } }, - "node_modules/@types/passport-jwt": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.8.tgz", - "integrity": "sha512-VKJZDJUAHFhPHHYvxdqFcc5vlDht8Q2pL1/ePvKAgqRThDaCc84lSYOTQmnx3+JIkDlN+2KfhFhXIzlcVT+Pcw==", + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, "dependencies": { - "@types/express": "*", - "@types/jsonwebtoken": "*", - "@types/passport-strategy": "*" + "has-symbols": "^1.0.3" } }, - "node_modules/@types/passport-local": { - "version": "1.0.35", - "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.35.tgz", - "integrity": "sha512-K4eLTJ8R0yYW8TvCqkjB0pTKoqfUSdl5PfZdidTjV2ETV3604fQxtY6BHKjQWAx50WUS0lqzBvKv3LoI1ZBPeA==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/avsc": { + "version": "5.7.7", + "resolved": "https://registry.npmjs.org/avsc/-/avsc-5.7.7.tgz", + "integrity": "sha512-9cYNccliXZDByFsFliVwk5GvTq058Fj513CiR4E60ndDwmuXzTJEp/Bp8FyuRmGyYupLjHLs+JA9/CBoVS4/NQ==", + "engines": { + "node": ">=0.11" + } + }, + "node_modules/aws-sdk": { + "version": "2.1494.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1494.0.tgz", + "integrity": "sha512-i7wIEBUzhIOuCeE8moB4rXUr7y+5rviiGJ6hsdQJdqwDxzStkmV7+cvKllNVx3+kuv0jdNbkVZ+wHBANi91Wxw==", "dependencies": { - "@types/express": "*", - "@types/passport": "*", - "@types/passport-strategy": "*" + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.5.0" + }, + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/@types/passport-strategy": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz", - "integrity": "sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==", + "node_modules/aws-sdk/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dependencies": { - "@types/express": "*", - "@types/passport": "*" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/aws-sdk/node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/aws-sdk/node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@types/pg": { - "version": "8.6.6", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.6.tgz", - "integrity": "sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==", + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "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==", + "devOptional": true + }, + "node_modules/balena-device-config": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/balena-device-config/-/balena-device-config-6.3.0.tgz", + "integrity": "sha512-mUJhyw9xnfXOehk5QXF891NGgb98I8Ial8JPZPFYRAOsGu+Vm1lL/pewbjWKVMghaa6L7GlUXdF956fIZsJgxw==", "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" + "lodash": "^4.17.15", + "revalidator": "^0.3.1" } }, - "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true - }, - "node_modules/@types/proxy-addr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/proxy-addr/-/proxy-addr-2.0.0.tgz", - "integrity": "sha512-JEm0kSrO3CjbFSLpYeYhCscS0vpW1mIWedhWuurJnYbMzY1vcm9fzJ6TL6SWq3m/m3g4KUV5JBT69mQSwUHZHg==", + "node_modules/balena-semver": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/balena-semver/-/balena-semver-2.3.5.tgz", + "integrity": "sha512-nsLg3TH9/mzjeCmUHdrx7jqcfRN3WD0QE5AcanxhcZ69equkU9eX6EDh860CkJHaGpsaO6fA5H650YHxsg6F4A==", "dependencies": { - "@types/node": "*" + "@types/lodash": "^4.14.149", + "@types/semver": "^7.1.0", + "lodash": "^4.17.15", + "semver": "^7.1.3" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/randomstring": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@types/randomstring/-/randomstring-1.1.8.tgz", - "integrity": "sha512-NPOJcW+TTjT9Qiog0UjSoG3Sj24c7EfzZO39BU9E61D7fQtwNmBNblyQhSsK9+5s9Fm0o31rvX+ZyZkpE/c7jA==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/@types/redis": { - "version": "2.8.32", - "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.32.tgz", - "integrity": "sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w==", + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dependencies": { - "@types/node": "*" + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/@types/redlock": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/redlock/-/redlock-4.0.4.tgz", - "integrity": "sha512-1Q2cbSmuGQzqowWDVXkSDsj96muMSs1RiDBDHqSCiycyrpvNcMkmGZRaVrDgnbiL/YWXh3DAlKplAtIO4rzV7g==", + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "optional": true, "dependencies": { - "@types/bluebird": "*", - "@types/ioredis": "^4.28.10", - "@types/redis": "^2.8.0" + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/@types/request": { - "version": "2.48.8", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", - "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" + "tweetnacl": "^0.14.3" } }, - "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==" + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", + "optional": true }, - "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "dependencies": { - "@types/mime": "*", - "@types/node": "*" + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "optional": true, + "engines": { + "node": "*" } }, - "node_modules/@types/sinon": { - "version": "10.0.14", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.14.tgz", - "integrity": "sha512-mn72up6cjaMyMuaPaa/AwKf6WtsSRysQC7wxFkCm1XcOKXPM1z+5Y4H5wjIVBz4gdAkjvZxVVfjA6ba1nHr5WQ==", + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, - "dependencies": { - "@types/sinonjs__fake-timers": "*" + "engines": { + "node": ">=8" } }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", - "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", - "dev": true + "node_modules/bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" }, - "node_modules/@types/string-hash": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/string-hash/-/string-hash-1.1.1.tgz", - "integrity": "sha512-ijt3zdHi2DmZxQpQTmozXszzDo78V4R3EdvX0jFMfnMH2ZzQSmCbaWOMPGXFUYSzSIdStv78HDjg32m5dxc+tA==" + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "node_modules/@types/superagent": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.16.tgz", - "integrity": "sha512-tLfnlJf6A5mB6ddqF159GqcDizfzbMUB1/DeT59/wBNqzRTNNKsaw79A/1TZ84X+f/EwWH8FeuSkjlCLyqS/zQ==", - "dev": true, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { - "@types/cookiejar": "*", - "@types/node": "*" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/@types/supertest": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", - "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", - "dev": true, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "@types/superagent": "*" + "ms": "2.0.0" } }, - "node_modules/@types/tar": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.4.tgz", - "integrity": "sha512-Cp4oxpfIzWt7mr2pbhHT2OTXGMAL0szYCzuf8lRWyIMCgsx6/Hfc3ubztuhvzXHXgraTQxyOCmmg7TDGIMIJJQ==", - "dependencies": { - "@types/node": "*", - "minipass": "^4.0.0" - } + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/@types/temp": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@types/temp/-/temp-0.9.1.tgz", - "integrity": "sha512-yDQ8Y+oQi9V7VkexwE6NBSVyNuyNFeGI275yWXASc2DjmxNicMi9O50KxDpNlST1kBbV9jKYBHGXhgNYFMPqtA==", - "dev": true, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, "dependencies": { - "@types/node": "*" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@types/through": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", - "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { - "@types/node": "*" + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, - "node_modules/@types/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==" + "node_modules/buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "optional": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } }, - "node_modules/@types/validator": { - "version": "13.7.15", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.15.tgz", - "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==" + "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", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" }, - "node_modules/@types/websql": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/@types/websql/-/websql-0.0.27.tgz", - "integrity": "sha512-bmJkLrp/S1G1m/MEcCFuRYjSpgFIWt1KoglSw4D9i3veQBR6v0BYFmp7snK1u3ri53AFdLaRR8qwIsOzw1h8LA==" + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "optional": true, + "engines": { + "node": ">=4" + } }, - "node_modules/@vue/compiler-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", - "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, - "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "source-map": "^0.6.1" + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@vue/compiler-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", - "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", - "dev": true, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47" + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" } }, - "node_modules/@vue/compiler-sfc": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", - "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-ssr": "3.2.47", - "@vue/reactivity-transform": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", - "postcss": "^8.1.10", - "source-map": "^0.6.1" + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" } }, - "node_modules/@vue/compiler-ssr": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", - "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", - "dev": true, + "node_modules/cache-manager": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-4.1.0.tgz", + "integrity": "sha512-ZGM6dLxrP65bfOZmcviWMadUOCICqpLs92+P/S5tj8onz+k+tB7Gr+SAgOUHCQtfm2gYEQDHiKeul4+tYPOJ8A==", "dependencies": { - "@vue/compiler-dom": "3.2.47", - "@vue/shared": "3.2.47" + "async": "3.2.3", + "lodash.clonedeep": "^4.5.0", + "lru-cache": "^7.10.1" } }, - "node_modules/@vue/reactivity-transform": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", - "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", - "dev": true, + "node_modules/cache-manager-ioredis": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cache-manager-ioredis/-/cache-manager-ioredis-2.1.0.tgz", + "integrity": "sha512-TCxbp9ceuFveTKWuNaCX8QjoC41rAlHen4s63u9Yd+iXlw3efYmimc/u935PKPxSdhkXpnMes4mxtK3/yb0L4g==", "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" + "ioredis": "^4.14.1" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@vue/shared": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", - "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "devOptional": true + "node_modules/cache-manager-ioredis/node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "engines": { + "node": ">=0.10" + } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/cache-manager-ioredis/node_modules/ioredis": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz", + "integrity": "sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.1", + "denque": "^1.1.0", + "lodash.defaults": "^4.2.0", + "lodash.flatten": "^4.4.0", + "lodash.isarguments": "^3.1.0", + "p-map": "^2.1.0", + "redis-commands": "1.7.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" }, "engines": { - "node": ">= 0.6" + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" } }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "bin": { - "acorn": "bin/acorn" + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "node_modules/callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "dev": true, "engines": { - "node": ">=0.4.0" + "node": "*" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { - "node": ">= 6.0.0" + "node": ">=6" } }, - "node_modules/agentkeepalive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", - "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" }, "engines": { - "node": ">= 8.0.0" + "node": ">=0.10.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==", + "node_modules/chai": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dev": true, "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "check-error": "^1.0.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "peerDependencies": { + "chai": ">= 2.1.2 < 5" } }, - "node_modules/align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/align-text/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "get-func-name": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, "engines": { - "node": ">=6" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "type-fest": "^0.21.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" }, "engines": { - "node": ">= 8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", - "optional": true - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "devOptional": true - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "devOptional": true, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "devOptional": true, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "sprintf-js": "~1.0.2" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/array-differ": { + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", - "dev": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { "node": ">=8" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", "engines": { "node": ">=0.10.0" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, + "node_modules/coa": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/coa/-/coa-0.3.9.tgz", + "integrity": "sha512-8TgPAMVP++o+HkSdgygRKyaEcBXJSi3Q14/tlxkHcStzZB6PnNL87vFJQMKot8Jl1piXYdQv5LShNtWG6NQtBw==", + "dependencies": { + "q": "~0.8.10" + }, "engines": { - "node": ">=8" + "node": ">= 0.6.0" } }, - "node_modules/array-uniq": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", - "integrity": "sha512-GVYjmpL05al4dNlKJm53mKE4w9OOLiuVHWorsIA3YVz+Hu0hcn6PtE3Ydl0EqU7v+7ABC4mjjWsnLUxbpno+CA==", + "node_modules/coa/node_modules/q": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/q/-/q-0.8.12.tgz", + "integrity": "sha512-mvLmeFP7lwVSFzDhpVhkI9Jw3u9goGQ2IY9nbSNMA4OZyviFjs2XILKMesUz8nBz4deKS9eWibvEuBNlRxZHBg==", "engines": { - "node": ">=0.10.0" + "node": ">=0.6.0", + "teleport": ">=0.2.0" } }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true, + "bin": { + "color-support": "bin.js" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "engines": { - "node": ">=0.8" + "node": ">=0.1.90" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, "engines": { - "node": "*" + "node": ">= 0.8" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 12.0.0" } }, - "node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "engines": { + "node": ">=4.0.0" + } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, "engines": { - "node": ">= 0.4" + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/avsc": { - "version": "5.7.7", - "resolved": "https://registry.npmjs.org/avsc/-/avsc-5.7.7.tgz", - "integrity": "sha512-9cYNccliXZDByFsFliVwk5GvTq058Fj513CiR4E60ndDwmuXzTJEp/Bp8FyuRmGyYupLjHLs+JA9/CBoVS4/NQ==", + "node_modules/compression-next": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/compression-next/-/compression-next-1.0.3.tgz", + "integrity": "sha512-b4YHmHAaOZnCLeLufQ+N1mIuxaMYAOvkpH8BzSsQwvF5Barrd7vw/ui1X1dx3zY7xiqh8IJnVr+At86w0bJSYA==", + "dependencies": { + "bytes": "3.0.0", + "compressible": "~2.0.17", + "debug": "2.6.9", + "object-assign": "4.1.1", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.0", + "vary": "~1.1.2" + }, "engines": { - "node": ">=0.11" + "node": ">= 11" } }, - "node_modules/aws-sdk": { - "version": "2.1365.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1365.0.tgz", - "integrity": "sha512-GRwHfzYufi7BhBtgyzeHvqS5yCMRC5ZCqmDU/TBMnr8IaH6sabSG2iAhVn1Kkpjv3tDnWHwDr5s8wNMTzJLPmg==", - "dependencies": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.16.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "util": "^0.12.4", - "uuid": "8.0.0", - "xml2js": "0.5.0" - }, + "node_modules/compression-next/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "engines": { - "node": ">= 10.0.0" + "node": ">= 0.8" } }, - "node_modules/aws-sdk/node_modules/uuid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/compression-next/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "node_modules/compression-next/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression-next/node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "engines": { - "node": "*" + "node": ">= 0.8" } }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } }, - "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==", + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "devOptional": true }, - "node_modules/balena-device-config": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/balena-device-config/-/balena-device-config-6.3.0.tgz", - "integrity": "sha512-mUJhyw9xnfXOehk5QXF891NGgb98I8Ial8JPZPFYRAOsGu+Vm1lL/pewbjWKVMghaa6L7GlUXdF956fIZsJgxw==", - "dependencies": { - "lodash": "^4.17.15", - "revalidator": "^0.3.1" - } + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true }, - "node_modules/balena-semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/balena-semver/-/balena-semver-2.3.2.tgz", - "integrity": "sha512-/Jjf6emcDRds1zqr40cP90JDKai5AHNn5CRLwOrs9ix7Lk4P+aU9GBeIbSvtORAkILE8R75v7y6y9017jy+4jg==", + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { - "@types/lodash": "^4.14.149", - "@types/semver": "^7.1.0", - "lodash": "^4.17.15", - "semver": "^7.1.3" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -1934,350 +4955,337 @@ } ] }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dependencies": { - "safe-buffer": "5.1.2" - }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, - "node_modules/bcrypt": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", - "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.10", - "node-addon-api": "^5.0.0" - }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "engines": { - "node": ">= 10.0.0" + "node": ">= 0.6" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", - "optional": true - }, - "node_modules/bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/bintrees": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", - "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "node_modules/cookie-session": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cookie-session/-/cookie-session-2.0.0.tgz", + "integrity": "sha512-hKvgoThbw00zQOleSlUr2qpvuNweoqBtxrmx0UFosx6AGi9lYtLoA+RbsvknrEX8Pr6MDbdWAb2j6SnMn+lPsg==", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "cookies": "0.8.0", + "debug": "3.2.7", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 0.10" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/cookie-session/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/cookie-session/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", "dependencies": { - "fill-range": "^7.0.1" + "depd": "~2.0.0", + "keygrip": "~1.1.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" } }, - "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", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "optional": true - }, - "node_modules/buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "optional": true, + "node_modules/copyfiles/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "node_modules/copyfiles/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "optional": true, + "node_modules/copyfiles/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "streamsearch": "^1.1.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10.16.0" + "node": ">=7.0.0" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } + "node_modules/copyfiles/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/copyfiles/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, - "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "node_modules/copyfiles/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "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" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 10" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/copyfiles/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/cacache/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/copyfiles/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/cacache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/copyfiles/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/cache-manager": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-4.1.0.tgz", - "integrity": "sha512-ZGM6dLxrP65bfOZmcviWMadUOCICqpLs92+P/S5tj8onz+k+tB7Gr+SAgOUHCQtfm2gYEQDHiKeul4+tYPOJ8A==", + "node_modules/copyfiles/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, "dependencies": { - "async": "3.2.3", - "lodash.clonedeep": "^4.5.0", - "lru-cache": "^7.10.1" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "node_modules/cache-manager-ioredis": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cache-manager-ioredis/-/cache-manager-ioredis-2.1.0.tgz", - "integrity": "sha512-TCxbp9ceuFveTKWuNaCX8QjoC41rAlHen4s63u9Yd+iXlw3efYmimc/u935PKPxSdhkXpnMes4mxtK3/yb0L4g==", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "devOptional": true + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, "dependencies": { - "ioredis": "^4.14.1" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" } }, - "node_modules/cache-manager-ioredis/node_modules/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cron-parser": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", + "dependencies": { + "luxon": "^3.2.1" + }, "engines": { - "node": ">=0.10" + "node": ">=12.0.0" } }, - "node_modules/cache-manager-ioredis/node_modules/ioredis": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz", - "integrity": "sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==", + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.1", - "denque": "^1.1.0", - "lodash.defaults": "^4.2.0", - "lodash.flatten": "^4.4.0", - "lodash.isarguments": "^3.1.0", - "p-map": "^2.1.0", - "redis-commands": "1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" + "node": ">= 8" } }, - "node_modules/cache-manager-ioredis/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "engines": { - "node": ">=6" + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "assert-plus": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": ">=6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, "engines": { "node": ">=10" @@ -2286,642 +5294,683 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", - "dependencies": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" - } + "node_modules/deep-freeze": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", + "integrity": "sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==" }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "kind-of": "^5.0.2" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, "engines": { - "node": "*" + "node": ">= 0.4" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 0.4" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { - "node": ">=10" + "node": ">=0.4.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "optional": true + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "engines": { - "node": ">=6" + "node": ">=0.10" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/depcheck": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/depcheck/-/depcheck-1.4.7.tgz", + "integrity": "sha512-1lklS/bV5chOxwNKA/2XUUk/hPORp8zihZsXflr8x0kLwmcZ9Y9BsS6Hs3ssvA+2wUVbG0U2Ciqvm1SokNjPkA==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "@babel/parser": "^7.23.0", + "@babel/traverse": "^7.23.2", + "@vue/compiler-sfc": "^3.3.4", + "callsite": "^1.0.0", + "camelcase": "^6.3.0", + "cosmiconfig": "^7.1.0", + "debug": "^4.3.4", + "deps-regex": "^0.2.0", + "findup-sync": "^5.0.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.0", + "js-yaml": "^3.14.1", + "json5": "^2.2.3", + "lodash": "^4.17.21", + "minimatch": "^7.4.6", + "multimatch": "^5.0.0", + "please-upgrade-node": "^3.2.0", + "readdirp": "^3.6.0", + "require-package-name": "^2.0.1", + "resolve": "^1.22.3", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "yargs": "^16.2.0" + }, + "bin": { + "depcheck": "bin/depcheck.js" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "node_modules/depcheck/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/cliui": { + "node_modules/depcheck/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/depcheck/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/coa": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/coa/-/coa-0.3.9.tgz", - "integrity": "sha512-8TgPAMVP++o+HkSdgygRKyaEcBXJSi3Q14/tlxkHcStzZB6PnNL87vFJQMKot8Jl1piXYdQv5LShNtWG6NQtBw==", - "dependencies": { - "q": "~0.8.10" - }, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/coa/node_modules/q": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/q/-/q-0.8.12.tgz", - "integrity": "sha512-mvLmeFP7lwVSFzDhpVhkI9Jw3u9goGQ2IY9nbSNMA4OZyviFjs2XILKMesUz8nBz4deKS9eWibvEuBNlRxZHBg==", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/depcheck/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "node_modules/depcheck/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "devOptional": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "node_modules/depcheck/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "node_modules/depcheck/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { - "node": ">=0.1.90" + "node": ">=8" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/depcheck/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "engines": { - "node": ">=14" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "engines": { - "node": ">=4.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/depcheck/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { - "mime-db": ">= 1.43.0 < 2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "node_modules/depcheck/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/compression-next": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/compression-next/-/compression-next-1.0.3.tgz", - "integrity": "sha512-b4YHmHAaOZnCLeLufQ+N1mIuxaMYAOvkpH8BzSsQwvF5Barrd7vw/ui1X1dx3zY7xiqh8IJnVr+At86w0bJSYA==", + "node_modules/depcheck/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, "dependencies": { - "bytes": "3.0.0", - "compressible": "~2.0.17", - "debug": "2.6.9", - "object-assign": "4.1.1", - "on-headers": "~1.0.2", - "safe-buffer": "5.2.0", - "vary": "~1.1.2" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">= 11" + "node": ">=10" } }, - "node_modules/compression-next/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { "node": ">= 0.8" } }, - "node_modules/compression-next/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression-next/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compression-next/node_modules/safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + "node_modules/deps-regex": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/deps-regex/-/deps-regex-0.2.0.tgz", + "integrity": "sha512-PwuBojGMQAYbWkMXOY9Pd/NWCDNHVH12pnS7WHqZkTSeMESe4hwnKKRp0yR87g37113x4JPbo/oIvXY+s/f56Q==", + "dev": true }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "optional": true, - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "devOptional": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" } }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=0.3.1" } }, - "node_modules/cookie-parser": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", - "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "dependencies": { - "cookie": "0.4.1", - "cookie-signature": "1.0.6" + "path-type": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/cookie-parser/node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/cookie-session": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cookie-session/-/cookie-session-2.0.0.tgz", - "integrity": "sha512-hKvgoThbw00zQOleSlUr2qpvuNweoqBtxrmx0UFosx6AGi9lYtLoA+RbsvknrEX8Pr6MDbdWAb2j6SnMn+lPsg==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "dependencies": { - "cookies": "0.8.0", - "debug": "3.2.7", - "on-headers": "~1.0.2", - "safe-buffer": "5.2.1" + "esutils": "^2.0.2" }, "engines": { - "node": ">= 0.10" + "node": ">=6.0.0" } }, - "node_modules/cookie-session/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dependencies": { - "ms": "^2.1.1" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/cookie-session/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "node_modules/cookies": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", - "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } }, - "node_modules/copyfiles": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", - "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "dependencies": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^1.0.4", - "noms": "0.0.0", - "through2": "^2.0.1", - "untildify": "^4.0.0", - "yargs": "^16.1.0" + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" }, - "bin": { - "copyfiles": "copyfiles", - "copyup": "copyfiles" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } }, - "node_modules/cron-parser": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.7.1.tgz", - "integrity": "sha512-WguFaoQ0hQ61SgsCZLHUcNbAvlK0lypKXu62ARguefYmjzaOXIVRNrAmyXzabTwUn4sQvQLkk6bjH+ipGfw8bA==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "dependencies": { - "luxon": "^3.2.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">=12.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" }, "engines": { - "node": ">= 8" + "node": ">=0.10" } }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, + "node_modules/eslint-plugin-chai-friendly": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.7.2.tgz", + "integrity": "sha512-LOIfGx5sZZ5FwM1shr2GlYAWV9Omdi+1/3byuVagvQNoGUuU0iHhp7AfjA1uR+4dJ4Isfb4+FwBJgQajIw9iAg==", + "dev": true, "engines": { - "node": ">=0.10" + "node": ">=0.10.0" + }, + "peerDependencies": { + "eslint": ">=3.0.0" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/eslint-plugin-jsdoc": { + "version": "46.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.9.0.tgz", + "integrity": "sha512-UQuEtbqLNkPf5Nr/6PPRCtr9xypXY+g8y/Q7gPa0YK7eDhh0y2lWprXRnaYbW7ACgIUvpDKy9X2bZqxtGzBG9Q==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "@es-joy/jsdoccomment": "~0.41.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.5.0", + "is-builtin-module": "^3.2.1", + "semver": "^7.5.4", + "spdx-expression-parse": "^3.0.1" }, "engines": { - "node": ">=6.0" + "node": ">=16" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/decamelize": { + "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { "node": ">=10" @@ -2930,297 +5979,253 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "node_modules/eslint-plugin-no-only-tests": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", + "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, "engines": { - "node": ">=6" + "node": ">=5.0.0" } }, - "node_modules/deep-freeze": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", - "integrity": "sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==" - }, - "node_modules/default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dev": true, "dependencies": { - "kind-of": "^5.0.2" + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "devOptional": true - }, - "node_modules/denque": { + "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, - "node_modules/depcheck": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/depcheck/-/depcheck-1.4.3.tgz", - "integrity": "sha512-vy8xe1tlLFu7t4jFyoirMmOR7x7N601ubU9Gkifyr9z8rjBFtEdWHDBMqXyk6OkK+94NXutzddVXJuo0JlUQKQ==", - "dev": true, - "dependencies": { - "@babel/parser": "7.16.4", - "@babel/traverse": "^7.12.5", - "@vue/compiler-sfc": "^3.0.5", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.2.0", - "deps-regex": "^0.1.4", - "ignore": "^5.1.8", - "is-core-module": "^2.4.0", - "js-yaml": "^3.14.0", - "json5": "^2.1.3", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", - "multimatch": "^5.0.0", - "please-upgrade-node": "^3.2.0", - "query-ast": "^1.0.3", - "readdirp": "^3.5.0", - "require-package-name": "^2.0.1", - "resolve": "^1.18.1", - "sass": "^1.29.0", - "scss-parser": "^1.0.4", - "semver": "^7.3.2", - "yargs": "^16.1.0" + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { - "depcheck": "bin/depcheck.js" + "resolve": "bin/resolve" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/deps-regex": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deps-regex/-/deps-regex-0.1.4.tgz", - "integrity": "sha512-3tzwGYogSJi8HoG93R5x9NrdefZQOXgHgGih/7eivloOq6yC6O+yoFxZnkgP661twvfILONfoKRdF9GQOGx2RA==", - "dev": true - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "devOptional": true, - "engines": { - "node": ">=8" + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "safe-buffer": "^5.0.1" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "optional": true, "dependencies": { - "iconv-lite": "^0.6.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/eslint/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { - "is-arrayish": "^0.2.1" + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "node": ">=8" } }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, "engines": { - "node": ">=0.8.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -3236,12 +6241,54 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -3260,41 +6307,54 @@ } }, "node_modules/eventemitter3": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.0.tgz", - "integrity": "sha512-riuVbElZZNXLeLEoprfNYoDSwTBRR44X3mnhdI1YcnENpWTCsTTVZ2zFuqQcpoyqPQIUXdiPEU0ECAq0KQRaHg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "optional": true, "engines": { - "node": ">=0.4.x" + "node": ">=0.8.x" } }, "node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "node": ">=16.17" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -3354,6 +6414,14 @@ "node": ">= 0.8.0" } }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/express-session/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3503,9 +6571,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3517,17 +6585,56 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "optional": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -3536,6 +6643,18 @@ "reusify": "^1.0.4" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -3593,6 +6712,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -3602,6 +6736,61 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -3626,18 +6815,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", - "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -3719,9 +6896,9 @@ "devOptional": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -3733,15 +6910,45 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "devOptional": true, + "optional": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -3761,22 +6968,28 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "devOptional": true + "optional": true }, "node_modules/gauge/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "devOptional": true, + "optional": true, "engines": { "node": ">=8" } }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "optional": true + }, "node_modules/gauge/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "devOptional": true, + "optional": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3795,37 +7008,54 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-value": { @@ -3845,34 +7075,112 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "devOptional": true, + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, "node_modules/globals": { @@ -3884,6 +7192,41 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/google-protobuf": { "version": "3.21.2", "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", @@ -3900,10 +7243,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/har-schema": { @@ -3927,15 +7270,13 @@ "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { @@ -3947,6 +7288,28 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -3976,7 +7339,18 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "devOptional": true + "optional": true + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/he": { "version": "1.2.0", @@ -3996,11 +7370,17 @@ "node": ">=8" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/http-errors": { "version": "2.0.0", @@ -4017,20 +7397,6 @@ "node": ">= 0.8" } }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -4058,21 +7424,12 @@ } }, "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" + "node": ">=16.17.0" } }, "node_modules/husky": { @@ -4115,12 +7472,6 @@ "node": ">= 4" } }, - "node_modules/immutable": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", - "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", - "dev": true - }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -4137,6 +7488,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -4146,21 +7506,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "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", @@ -4176,13 +7521,24 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "loose-envify": "^1.0.0" + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/ioredis": { @@ -4208,16 +7564,10 @@ "url": "https://opencollective.com/ioredis" } }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "engines": { "node": ">= 10" } @@ -4237,12 +7587,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -4255,11 +7646,42 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -4272,12 +7694,27 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "dependencies": { - "has": "^1.0.3" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4291,6 +7728,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", @@ -4328,11 +7777,26 @@ "node": ">=0.10.0" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-number": { "version": "7.0.0", @@ -4342,6 +7806,30 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -4356,6 +7844,43 @@ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -4368,15 +7893,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" }, "engines": { @@ -4386,6 +7908,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -4403,6 +7954,49 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -4419,13 +8013,26 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "node_modules/jackspeak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.1.0.tgz", - "integrity": "sha512-DiEwVPqsieUzZBNxQ2cxznmFzfg/AMgJUjYw5xl6rSmCxAQXECcbSdwcLM6Ds6T09+SBfSNCGPhYUoQ96P4h7A==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, "dependencies": { - "cliui": "^7.0.4" + "@isaacs/cliui": "^8.0.2" }, "engines": { "node": ">=14" @@ -4469,6 +8076,15 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -4481,6 +8097,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -4497,6 +8119,12 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -4515,14 +8143,20 @@ } }, "node_modules/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "dependencies": { "jws": "^3.2.2", - "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">=12", @@ -4543,6 +8177,21 @@ "node": ">=0.6.0" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -4579,6 +8228,15 @@ "node": ">= 0.6" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", @@ -4595,24 +8253,19 @@ "node": ">=0.10.0" } }, - "node_modules/libpg-query": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/libpg-query/-/libpg-query-15.0.2.tgz", - "integrity": "sha512-Nj+gQJPbvthDCfLb+NEcnhfUUW76N1otzD8xBxmr6kY4292GWJwhANse3SwGFGn5xl76WWAVW+IM7Wk5uyb9hg==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "hasInstallScript": true, "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.8", - "node-addon-api": "^1.6.3", - "node-gyp": "^8.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/libpg-query/node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true - }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -4629,39 +8282,36 @@ "dev": true }, "node_modules/lint-staged": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.1.tgz", - "integrity": "sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz", + "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==", "dev": true, "dependencies": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", + "chalk": "5.3.0", + "commander": "11.1.0", + "debug": "4.3.4", + "execa": "8.0.1", "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.1" + "listr2": "7.0.2", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.4" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": ">=18.12.0" }, "funding": { "url": "https://opencollective.com/lint-staged" } }, "node_modules/lint-staged/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -4671,131 +8321,29 @@ } }, "node_modules/lint-staged/node_modules/yaml": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", - "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true, "engines": { "node": ">= 14" } }, - "node_modules/listr2": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.7.tgz", - "integrity": "sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/listr2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/listr2/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/listr2/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/listr2": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", + "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", + "rfdc": "^1.3.0", + "wrap-ansi": "^8.1.0" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, "node_modules/locate-path": { @@ -4844,11 +8392,52 @@ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, "node_modules/lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -4936,114 +8525,49 @@ } }, "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-update/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/loki-grpc-client": { @@ -5057,9 +8581,9 @@ } }, "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/long-timeout": { "version": "0.1.1", @@ -5087,19 +8611,14 @@ } }, "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" - }, "node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -5117,27 +8636,30 @@ } }, "node_modules/luxon": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz", - "integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", "engines": { "node": ">=12" } }, "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", "dev": true, "dependencies": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" } }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "devOptional": true, + "optional": true, "dependencies": { "semver": "^6.0.0" }, @@ -5149,10 +8671,10 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "devOptional": true, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "optional": true, "bin": { "semver": "bin/semver.js" } @@ -5162,57 +8684,6 @@ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-fetch-happen/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/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -5363,136 +8834,11 @@ "funding": { "url": "https://github.com/sponsors/ljharb" } - }, - "node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "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-collect/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-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "dev": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/minipass-fetch/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-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-flush/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-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": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/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-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/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" - }, + }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "engines": { "node": ">=8" } @@ -5571,21 +8917,62 @@ "url": "https://opencollective.com/mochajs" } }, + "node_modules/mocha/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/mocha/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/mocha/node_modules/brace-expansion": { + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, + "node_modules/mocha/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/mocha/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/mocha/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -5598,6 +8985,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "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" + }, + "engines": { + "node": "*" + } + }, "node_modules/mocha/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5607,6 +9026,15 @@ "node": ">=8" } }, + "node_modules/mocha/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/mocha/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -5631,12 +9059,35 @@ "node": ">=10" } }, + "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/mocha/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -5652,6 +9103,41 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/mocha/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mockery": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", @@ -5702,36 +9188,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "optional": true, - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/multer/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "optional": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/multimatch": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", @@ -5778,6 +9234,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/ndjson": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", @@ -5831,9 +9293,9 @@ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, "node_modules/nise": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", - "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", + "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", "dev": true, "dependencies": { "@sinonjs/commons": "^2.0.0", @@ -5843,189 +9305,86 @@ "path-to-regexp": "^1.7.0" } }, - "node_modules/nise/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/nock": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.0.tgz", - "integrity": "sha512-HHqYQ6mBeiMc+N038w8LkMpDCRquCHWeNmN3v6645P3NhN2+qXOBqvPqo7Rt1VyCMzKhJ733wZqw5B7cQVFNPg==", + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "dependencies": { - "debug": "^4.1.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.21", - "propagate": "^2.0.0" - }, - "engines": { - "node": ">= 10.13" - } - }, - "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", - "optional": true - }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "devOptional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "type-detect": "4.0.8" } }, - "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "type-detect": "4.0.8" } }, - "node_modules/node-gyp/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/nise/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, - "node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "node_modules/nise/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "isarray": "0.0.1" } }, - "node_modules/node-gyp/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/nock": { + "version": "13.3.8", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.8.tgz", + "integrity": "sha512-96yVFal0c/W1lG7mmfRe7eO+hovrhJYd2obzzOZ90f6fjpeU/XNvd9cYHZKZAQJumDfhXgoTpkpJ9pvMj+hqHw==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 10.13" } }, - "node_modules/node-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "optional": true }, - "node_modules/node-gyp/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "optional": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/node-schedule": { @@ -6079,7 +9438,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "devOptional": true, + "optional": true, "dependencies": { "abbrev": "1" }, @@ -6130,7 +9489,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "devOptional": true, + "optional": true, "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -6155,13 +9514,106 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, "node_modules/ometa-js": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/ometa-js/-/ometa-js-1.5.4.tgz", @@ -6222,6 +9674,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6253,18 +9722,11 @@ } }, "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" - }, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/packet-reader": { @@ -6303,6 +9765,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -6391,13 +9862,13 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", - "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "dependencies": { - "lru-cache": "^9.0.0", - "minipass": "^5.0.0" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -6407,21 +9878,24 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.2.tgz", + "integrity": "sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==", "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, "engines": { "node": "14 || >=16.14" } }, "node_modules/path-scurry/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/path-to-regexp": { @@ -6458,15 +9932,15 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/pg": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.9.0.tgz", - "integrity": "sha512-ZJM+qkEbtOHRuXjmvBtOgNOXOtLSbxiMiUVMgE4rV6Zwocy03RicCVvDXgx8l4Biwo8/qORUnEqn2fdQzV7KCg==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", "optional": true, "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-connection-string": "^2.5.0", - "pg-pool": "^3.5.2", + "pg-connection-string": "^2.6.2", + "pg-pool": "^3.6.1", "pg-protocol": "^1.6.0", "pg-types": "^2.1.0", "pgpass": "1.x" @@ -6474,6 +9948,9 @@ "engines": { "node": ">= 8.0.0" }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, "peerDependencies": { "pg-native": ">=3.0.1" }, @@ -6483,10 +9960,16 @@ } } }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, "node_modules/pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", "optional": true }, "node_modules/pg-int8": { @@ -6497,10 +9980,18 @@ "node": ">=4.0.0" } }, + "node_modules/pg-numeric": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", + "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", + "engines": { + "node": ">=4" + } + }, "node_modules/pg-pool": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", - "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", "optional": true, "peerDependencies": { "pg": ">=8.0" @@ -6512,9 +10003,27 @@ "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" }, "node_modules/pg-types": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.1.tgz", + "integrity": "sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g==", + "dependencies": { + "pg-int8": "1.0.1", + "pg-numeric": "1.0.2", + "postgres-array": "~3.0.1", + "postgres-bytea": "~3.0.0", + "postgres-date": "~2.0.1", + "postgres-interval": "^3.0.0", + "postgres-range": "^1.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pg/node_modules/pg-types": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "optional": true, "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", @@ -6526,6 +10035,45 @@ "node": ">=4" } }, + "node_modules/pg/node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg/node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pg/node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pg/node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "optional": true, + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pgpass": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", @@ -6564,99 +10112,45 @@ "node_modules/pidtree": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pinejs-client-core": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/pinejs-client-core/-/pinejs-client-core-6.12.3.tgz", - "integrity": "sha512-Qg9TbiaUlKDqcWCE6ARFFzOvNnJnBmovPifeyhV7ybYVDDpd8WAGrItQSJkOjuk4ZSwcaYMcHJ+FNatBUAnGWw==", - "dependencies": { - "@balena/es-version": "^1.0.1" - }, - "engines": { - "node": ">=10.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/pinejs-client-supertest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pinejs-client-supertest/-/pinejs-client-supertest-1.4.0.tgz", - "integrity": "sha512-mTJ2DIjLOb1Z+/R9gnPmZ1grclweVb53fTOxur6SaYI0YG9vfSK3divOL8lSna7YNeYbSXLPoiXK0d747HPvYw==", - "dev": true, - "dependencies": { - "@types/chai": "^4.2.14", - "@types/chai-as-promised": "^7.1.3", - "@types/express": "^4.17.11", - "@types/supertest": "^2.0.10", - "chai": "^4.2.0", - "chai-as-promised": "^7.1.1", - "pinejs-client-core": "^6.10.1", - "supertest": "^4.0.2" - }, - "engines": { - "node": ">=10.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/pinejs-client-supertest/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/pinejs-client-supertest/node_modules/formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/pinejs-client-supertest/node_modules/superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", - "dev": true, + "node_modules/pinejs-client-core": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/pinejs-client-core/-/pinejs-client-core-6.13.0.tgz", + "integrity": "sha512-U2Eg8lBlxCjTZ2K5cHdxIO4SixzX+ZIJzQpYqUOwqN4SxDqtDYY+ChiLF6xC86sqkjogJ2AFOr+jo2zUrlFc8A==", "dependencies": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" + "@balena/es-version": "^1.0.1" }, "engines": { - "node": ">= 4.0" + "node": ">=10.0.0", + "npm": ">=6.0.0" } }, - "node_modules/pinejs-client-supertest/node_modules/supertest": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz", - "integrity": "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", + "node_modules/pinejs-client-supertest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinejs-client-supertest/-/pinejs-client-supertest-2.0.1.tgz", + "integrity": "sha512-KdDSwKhA+UuyPg0Trosl12OrkqG97cErEX7zZjaWLtPH0Q5G4eLHB/Tx5H1+4YWtlz2Go5QACFx3tZPeV9TDoQ==", "dev": true, "dependencies": { - "methods": "^1.1.2", - "superagent": "^3.8.3" + "@types/chai": "^4.2.14", + "@types/chai-as-promised": "^7.1.3", + "@types/express": "^4.17.11", + "@types/supertest": "^2.0.10", + "chai": "^4.2.0", + "chai-as-promised": "^7.1.1", + "pinejs-client-core": "^6.10.1", + "supertest": "^6.3.3" }, "engines": { - "node": ">=6.0.0" + "node": ">=16.13.0", + "npm": ">=8.0.0" } }, "node_modules/please-upgrade-node": { @@ -6669,9 +10163,9 @@ } }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -6681,10 +10175,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6693,9 +10191,9 @@ } }, "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -6711,50 +10209,64 @@ } }, "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", + "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", "engines": { - "node": ">=4" + "node": ">=12" } }, "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", + "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", + "dependencies": { + "obuf": "~1.1.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.0.1.tgz", + "integrity": "sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw==", "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dependencies": { - "xtend": "^4.0.0" - }, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", + "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", "engines": { - "node": ">=0.10.0" + "node": ">=12" + } + }, + "node_modules/postgres-range": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.3.tgz", + "integrity": "sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -6767,9 +10279,9 @@ "devOptional": true }, "node_modules/prom-client": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.1.1.tgz", - "integrity": "sha512-hFU32q7UZQ59bVJQGUtm3I2PrJ3gWvoCkilX9sF165ks1qflhugVCeK+S1JjJYHvyt3o5kj68+q3bchormjnzw==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.2.0.tgz", + "integrity": "sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==", "dependencies": { "tdigest": "^0.1.1" }, @@ -6777,23 +10289,15 @@ "node": ">=10" } }, - "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/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, "node_modules/propagate": { @@ -6806,9 +10310,9 @@ } }, "node_modules/protobufjs": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.2.tgz", - "integrity": "sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -6828,11 +10332,6 @@ "node": ">=12.0.0" } }, - "node_modules/protobufjs/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -6859,9 +10358,9 @@ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -6889,16 +10388,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/query-ast": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/query-ast/-/query-ast-1.0.5.tgz", - "integrity": "sha512-JK+1ma4YDuLjvKKcz9JZ70G+CM9qEOs/l1cZzstMMfwKUabTJ9sud5jvDGrUNuv03yKUgs82bLkHXJkDyhRmBw==", - "dev": true, - "dependencies": { - "invariant": "2.2.4", - "lodash": "^4.17.21" - } - }, "node_modules/querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -6941,11 +10430,10 @@ "integrity": "sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==" }, "node_modules/randomstring": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.3.tgz", - "integrity": "sha512-3dEFySepTzp2CvH6W/ASYGguPPveBuz5MpZ7MuoUkoVehmyNl9+F9c9GFVrz2QPbM9NXTIHGcmJDY/3j4677kQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.3.0.tgz", + "integrity": "sha512-gY7aQ4i1BgwZ8I1Op4YseITAyiDiajeZOPQUbIq9TPGPhUm5FX59izIaOpmKbME1nmnEiABf28d9K2VSii6BBg==", "dependencies": { - "array-uniq": "1.0.2", "randombytes": "2.0.3" }, "bin": { @@ -6964,9 +10452,9 @@ } }, "node_modules/rate-limiter-flexible": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.4.1.tgz", - "integrity": "sha512-dgH4T44TzKVO9CLArNto62hJOwlWJMLUjVVr/ii0uUzZXEXthDNr7/yefW5z/1vvHAfycc1tnuiYyNJ8CTRB3g==" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-3.0.4.tgz", + "integrity": "sha512-LFrdT9Pl/TRxG143frHBPyESXHvS2tstLfAUM6shBbJ3M6YssT2cIUWFwAWVAU9Vl4Z2gUN7ZE7tSdQh/0aqcA==" }, "node_modules/raw-body": { "version": "2.5.2", @@ -6982,6 +10470,12 @@ "node": ">= 0.8" } }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -7070,6 +10564,43 @@ "node": ">=8.0.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", @@ -7154,12 +10685,12 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -7170,26 +10701,42 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/restore-cursor/node_modules/mimic-fn": { @@ -7216,14 +10763,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/reusify": { "version": "1.0.4", @@ -7260,15 +10804,15 @@ } }, "node_modules/rimraf": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.0.tgz", - "integrity": "sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", "dev": true, "dependencies": { - "glob": "^10.0.0" + "glob": "^10.3.7" }, "bin": { - "rimraf": "dist/cjs/src/bin.js" + "rimraf": "dist/esm/bin.mjs" }, "engines": { "node": ">=14" @@ -7277,61 +10821,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.2.tgz", - "integrity": "sha512-Xsa0BcxIC6th9UwNjZkhrMtNo/MnyRL8jGCP+uEwhA5oFOCY1f2s1/oNKY47xQ0Bg5nkjsfAEIej1VeH62bDDQ==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.0", - "minipass": "^5.0.0", - "path-scurry": "^1.7.0" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/rsmq": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/rsmq/-/rsmq-0.12.4.tgz", @@ -7366,19 +10855,28 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "dependencies": { - "tslib": "^2.1.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, "node_modules/safe-buffer": { @@ -7386,50 +10884,34 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sass": { - "version": "1.58.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", - "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" }, - "engines": { - "node": ">=12.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" }, - "node_modules/scss-parser": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/scss-parser/-/scss-parser-1.0.6.tgz", - "integrity": "sha512-SH3TaoaJFzfAtqs3eG1j5IuHJkeEW5rKUPIjIN+ZorLAyJLHItQGnsgwHk76v25GtLtpT9IqfAcqK4vFWdiw+w==", - "dev": true, - "dependencies": { - "invariant": "2.2.4", - "lodash": "4.17.21" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -7534,7 +11016,35 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "devOptional": true + "optional": true + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -7589,22 +11099,28 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "devOptional": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/sinon": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.4.tgz", - "integrity": "sha512-uzmfN6zx3GQaria1kwgWGeKiXSSbShBbue6Dcj0SI8fiCNFbiUDqKl57WFlY5lyhxZVUKmXvzgG2pilRQCBwWg==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", + "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/fake-timers": "^11.2.2", "@sinonjs/samsam": "^8.0.0", "diff": "^5.1.0", - "nise": "^5.1.4", + "nise": "^5.1.5", "supports-color": "^7.2.0" }, "funding": { @@ -7612,15 +11128,6 @@ "url": "https://opencollective.com/sinon" } }, - "node_modules/sinon/node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, "node_modules/sinon/node_modules/diff": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", @@ -7651,6 +11158,15 @@ "node": ">=8" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", @@ -7679,42 +11195,31 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, + "node_modules/snappy": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/snappy/-/snappy-7.2.2.tgz", + "integrity": "sha512-iADMq1kY0v3vJmGTuKcFWSXt15qYUz7wFkArOrsSg0IFfI3nJqIJvK2/ZbEIndg7erIJLtAVX2nSOqPz7DcwbA==", "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "node": ">= 10" }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" }, - "engines": { - "node": ">= 10" + "optionalDependencies": { + "@napi-rs/snappy-android-arm-eabi": "7.2.2", + "@napi-rs/snappy-android-arm64": "7.2.2", + "@napi-rs/snappy-darwin-arm64": "7.2.2", + "@napi-rs/snappy-darwin-x64": "7.2.2", + "@napi-rs/snappy-freebsd-x64": "7.2.2", + "@napi-rs/snappy-linux-arm-gnueabihf": "7.2.2", + "@napi-rs/snappy-linux-arm64-gnu": "7.2.2", + "@napi-rs/snappy-linux-arm64-musl": "7.2.2", + "@napi-rs/snappy-linux-x64-gnu": "7.2.2", + "@napi-rs/snappy-linux-x64-musl": "7.2.2", + "@napi-rs/snappy-win32-arm64-msvc": "7.2.2", + "@napi-rs/snappy-win32-ia32-msvc": "7.2.2", + "@napi-rs/snappy-win32-x64-msvc": "7.2.2" } }, "node_modules/sorted-array-functions": { @@ -7723,10 +11228,9 @@ "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==" }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { "node": ">=0.10.0" } @@ -7740,11 +11244,26 @@ "node": ">=0.10.0" } }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, "node_modules/split2": { @@ -7784,9 +11303,9 @@ } }, "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -7807,30 +11326,6 @@ "node": ">=0.10.0" } }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/ssri/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/standard-as-callback": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", @@ -7844,11 +11339,34 @@ "node": ">= 0.8" } }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "optional": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "optional": true, "engines": { "node": ">=10.0.0" } @@ -7867,9 +11385,9 @@ } }, "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "engines": { "node": ">=0.6.19" @@ -7897,6 +11415,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -7910,9 +11458,9 @@ } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -7924,6 +11472,71 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -7935,6 +11548,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -7959,10 +11585,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, "node_modules/superagent": { - "version": "8.0.9", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz", - "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", "dev": true, "dependencies": { "component-emitter": "^1.3.0", @@ -8056,13 +11688,13 @@ } }, "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -8071,6 +11703,14 @@ "node": ">=10" } }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/tdigest": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", @@ -8079,6 +11719,12 @@ "bintrees": "1.0.2" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/thirty-two": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz", @@ -8087,12 +11733,6 @@ "node": ">=0.2.6" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -8156,7 +11796,19 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "devOptional": true + "optional": true + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } }, "node_modules/ts-node": { "version": "10.9.1", @@ -8177,150 +11829,41 @@ "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "node_modules/tslint-config-prettier": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", - "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", - "dev": true, - "bin": { - "tslint-config-prettier-check": "bin/check.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/tslint-no-unused-expression-chai": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/tslint-no-unused-expression-chai/-/tslint-no-unused-expression-chai-0.1.4.tgz", - "integrity": "sha512-frEWKNTcq7VsaWKgUxMDOB2N/cmQadVkUtUGIut+2K4nv/uFXPfgJyPjuNC/cHyfUVqIkHMAvHOCL+d/McU3nQ==", - "dev": true, - "dependencies": { - "tsutils": "^3.0.0" - }, - "engines": { - "node": ">=4" + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, "peerDependencies": { - "tslint": ">=5.1.0" - } - }, - "node_modules/tslint-no-unused-expression-chai/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/tslint/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/tslint/node_modules/diff": { + "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, "engines": { "node": ">=0.3.1" } }, - "node_modules/tslint/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsscmp": { "version": "1.0.6", @@ -8330,18 +11873,6 @@ "node": ">=0.6.x" } }, - "node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -8363,6 +11894,18 @@ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -8373,9 +11916,9 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, "engines": { "node": ">=10" @@ -8396,6 +11939,71 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-error": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/typed-error/-/typed-error-3.2.2.tgz", @@ -8405,22 +12013,16 @@ "npm": ">=3.0.0" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "optional": true - }, "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/uglify-js": { @@ -8467,14 +12069,6 @@ "node": ">=0.10.0" } }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/uglify-js/node_modules/yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", @@ -8503,23 +12097,25 @@ "node": ">= 0.8" } }, - "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==", + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "dependencies": { - "unique-slug": "^2.0.0" + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unpipe": { "version": "1.0.0", @@ -8586,9 +12182,13 @@ } }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -8599,9 +12199,9 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, "node_modules/validator": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", - "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", "engines": { "node": ">= 0.10" } @@ -8627,17 +12227,22 @@ "extsprintf": "^1.2.0" } }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "devOptional": true + "optional": true }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "devOptional": true, + "optional": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -8658,17 +12263,79 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8681,7 +12348,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "devOptional": true, + "optional": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -8690,13 +12357,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "devOptional": true + "optional": true }, "node_modules/wide-align/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "devOptional": true, + "optional": true, "engines": { "node": ">=8" } @@ -8705,7 +12372,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "devOptional": true, + "optional": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8738,9 +12405,28 @@ "dev": true }, "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8753,10 +12439,11 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8767,10 +12454,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -8778,28 +12466,32 @@ "node": ">=7.0.0" } }, - "node_modules/wrap-ansi/node_modules/color-name": { + "node_modules/wrap-ansi-cjs/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/string-width": { + "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8809,6 +12501,45 @@ "node": ">=8" } }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -8839,6 +12570,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "devOptional": true, "engines": { "node": ">=0.4" } @@ -8866,26 +12598,27 @@ } }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, "engines": { "node": ">=10" } @@ -8931,6 +12664,14 @@ "node": ">=8" } }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 141b85bc4..74dfa18b4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@balena/open-balena-api", "description": "Internet of things, Made Simple", - "version": "11.8.3", + "version": "14.15.5", "license": "AGPL-3.0", "repository": { "type": "git", @@ -33,11 +33,12 @@ "prepare": "node -e \"try { require('husky').install() } catch (e) {if (e.code !== 'MODULE_NOT_FOUND') throw e}\"" }, "dependencies": { - "@balena/abstract-sql-compiler": "^8.4.1", + "@balena/abstract-sql-compiler": "^9.0.3", "@balena/env-parsing": "^1.1.5", "@balena/es-version": "^1.0.2", "@balena/node-metrics-gatherer": "^6.0.3", - "@balena/pinejs": "^14.62.9", + "@balena/pinejs": "^15.3.28", + "@balena/pinejs-webresource-cloudfront": "^0.0.5", "@sentry/node": "^7.49.0", "@types/basic-auth": "^1.1.3", "@types/bluebird": "^3.5.38", @@ -56,7 +57,7 @@ "@types/memoizee": "^0.4.8", "@types/morgan": "^1.9.4", "@types/ndjson": "^2.0.1", - "@types/node": "^18.16.1", + "@types/node": "^20.6.0", "@types/node-schedule": "^2.1.0", "@types/on-finished": "^2.3.1", "@types/passport-jwt": "^3.0.8", @@ -104,45 +105,45 @@ "passport-jwt": "^4.0.1", "proxy-addr": "^2.0.7", "randomstring": "^1.2.3", - "rate-limiter-flexible": "^2.4.1", + "rate-limiter-flexible": "^3.0.0", "redlock": "^4.2.0", "request": "^2.88.2", "rsmq": "^0.12.4", "semver": "^7.5.0", + "snappy": "^7.2.2", "strict-event-emitter-types": "^2.0.0", "supervisor": "^0.12.0", "tar": "^6.1.13", "thirty-two": "^1.0.2", "ts-node": "^10.9.1", "typed-error": "^3.2.2", - "typescript": "^5.0.4", + "typescript": "^5.3.2", "uuid": "^9.0.0", "validator": "^13.9.0" }, "devDependencies": { - "@balena/lint": "^6.2.2", + "@balena/lint": "^7.1.1", "@types/chai": "^4.3.4", "@types/mocha": "^10.0.1", "@types/mockery": "^1.4.30", - "@types/sinon": "^10.0.14", + "@types/sinon": "^17.0.0", "@types/supertest": "^2.0.12", "@types/temp": "^0.9.1", "chai": "^4.3.7", "copyfiles": "^2.4.1", "husky": "^8.0.3", - "libpg-query": "^15.0.2", - "lint-staged": "^13.2.1", + "lint-staged": "^15.0.0", "mocha": "^10.2.0", "mockery": "^2.1.0", "nock": "^13.3.0", - "pinejs-client-supertest": "^1.4.0", + "pinejs-client-supertest": "^2.0.1", "rimraf": "^5.0.0", - "sinon": "^15.0.4", + "sinon": "^17.0.0", "supertest": "^6.3.3" }, "engines": { - "node": "^18.14.0", - "npm": "^9.4.1" + "node": "^20.6.1", + "npm": "^10.1.0" }, "mocha": { "reporter": "spec", @@ -153,6 +154,6 @@ "_": "index.js" }, "versionist": { - "publishedAt": "2023-05-12T13:03:23.670Z" + "publishedAt": "2023-12-11T20:05:16.487Z" } } diff --git a/src/balena-init.sql b/src/balena-init.sql index d0224c4bc..9a1b34258 100644 --- a/src/balena-init.sql +++ b/src/balena-init.sql @@ -16,7 +16,7 @@ ALTER TABLE "device" ALTER COLUMN "api heartbeat state" SET DEFAULT 'unknown'; ALTER TABLE "release" -ALTER COLUMN "is passing tests" SET DEFAULT 1, +ALTER COLUMN "is passing tests" SET DEFAULT TRUE, ALTER COLUMN "semver major" SET DEFAULT 0, ALTER COLUMN "semver minor" SET DEFAULT 0, ALTER COLUMN "semver patch" SET DEFAULT 0, diff --git a/src/balena-model.ts b/src/balena-model.ts index 3d3c316c5..88c7cb84f 100644 --- a/src/balena-model.ts +++ b/src/balena-model.ts @@ -11,6 +11,13 @@ export type Deferred = Exclude; export type PickDeferred = { [P in K]: Deferred; }; +export interface WebResource { + filename: string; + href: string; + content_type?: string; + content_disposition?: string; + size?: number; +} export interface Actor { created_at: DateString; @@ -58,7 +65,7 @@ export interface User { created_at: DateString; modified_at: DateString; id: number; - actor: number; + actor: { __id: number } | [Actor]; username: string; password: string | null; jwt_secret: string | null; @@ -187,7 +194,7 @@ export interface DeviceType { name: string; is_of__cpu_architecture: { __id: number } | [CpuArchitecture]; logo: string | null; - contract: {} | null; + contract: object | null; belongs_to__device_family: { __id: number } | [DeviceFamily?] | null; is_default_for__application?: Application[]; describes__device?: Device[]; @@ -212,7 +219,7 @@ export interface Image { push_timestamp: DateString | null; status: string; content_hash: string | null; - contract: {} | null; + contract: object | null; device__installs__image?: ImageInstall[]; image_install?: ImageInstall[]; is_installed_on__device?: ImageInstall[]; @@ -257,7 +264,7 @@ export interface Application { created_at: DateString; modified_at: DateString; id: number; - actor: number; + actor: { __id: number } | [Actor]; should_track_latest_release: boolean; is_of__class: 'fleet' | 'block' | 'app'; organization: { __id: number } | [Organization]; @@ -348,7 +355,7 @@ export interface Device { created_at: DateString; modified_at: DateString; id: number; - actor: number; + actor: { __id: number } | [Actor]; api_heartbeat_state: 'online' | 'offline' | 'timeout' | 'unknown'; uuid: string; local_id: string | null; @@ -362,7 +369,6 @@ export interface Device { last_vpn_event: DateString | null; is_locked_until__date: DateString | null; public_address: string | null; - vpn_address: string | null; ip_address: string | null; mac_address: string | null; memory_usage: number | null; @@ -470,7 +476,7 @@ export interface Release { id: number; belongs_to__application: { __id: number } | [Application]; commit: string; - composition: {}; + composition: object; status: string; source: string; build_log: string | null; @@ -479,7 +485,7 @@ export interface Release { end_timestamp: DateString | null; update_timestamp: DateString; release_version: string | null; - contract: {} | null; + contract: object | null; is_passing_tests: boolean; is_finalized_at__date: DateString | null; phase: 'next' | 'current' | 'sunset' | 'end-of-life' | null; @@ -496,9 +502,11 @@ export interface Release { is_final: boolean; semver: string; raw_version: string; - version: {}; + version: object; release__has__tag_key?: ReleaseTag[]; release_tag?: ReleaseTag[]; + release__has__asset_key?: ReleaseAsset[]; + release_asset?: ReleaseAsset[]; image__is_part_of__release?: ImageIsPartOfRelease[]; release_image?: ImageIsPartOfRelease[]; contains__image?: ImageIsPartOfRelease[]; @@ -574,11 +582,20 @@ export interface DeviceTypeAlias { id: number; } +export interface ReleaseAsset { + created_at: DateString; + modified_at: DateString; + release: { __id: number } | [Release]; + asset_key: string; + id: number; + asset: WebResource; +} + export interface MyApplication { created_at: DateString; modified_at: DateString; id: number; - actor: number; + actor: { __id: number } | [Actor]; should_track_latest_release: boolean; is_of__class: 'fleet' | 'block' | 'app'; organization: { __id: number } | [Organization]; diff --git a/src/balena.sbvr b/src/balena.sbvr index d95b045ed..9508c5271 100644 --- a/src/balena.sbvr +++ b/src/balena.sbvr @@ -91,6 +91,12 @@ Term: api secret Term: app name Concept Type: Text (Type) +Term: asset + Concept Type: WebResource (Type) + +Term: asset key + Concept Type: Short Text (Type) + Term: build log Concept Type: Text (Type) @@ -307,9 +313,6 @@ Term: variant Term: version Concept Type: Integer (Type) -Term: vpn address - Concept Type: Short Text (Type) - -- Complex terms @@ -527,8 +530,6 @@ Fact type: device is locked until date Necessity: each device is locked until at most one date. Fact type: device has public address Necessity: each device has at most one public address -Fact type: device has vpn address - Necessity: each device has at most one vpn address Fact type: device has ip address Necessity: each device has at most one ip address Fact type: device has mac address @@ -708,6 +709,14 @@ Fact type: release has note Fact type: release has invalidation reason Necessity: each release has at most one invalidation reason. Necessity: each release that has an invalidation reason, is invalidated. +Fact type: release has asset key + Term Form: release asset + Database Table Name: release asset + Necessity: each release asset has an asset key that has a Length (Type) that is greater than 0. + +-- release asset +Fact type: release asset has asset + Necessity: each release asset has exactly one asset. -- service environment variable @@ -846,7 +855,7 @@ Fact Type: scheduled job run has status -- Rules -Rule: It is necessary that each release that has a release version1 and has a status that is equal to "success" and is not invalidated, belongs to an application that owns exactly one release that has a release version2 that is equal to the release version1 and has a status that is equal to "success" and is not invalidated. +Rule: It is necessary that each application that owns a release1 that has a status that is equal to "success" and is not invalidated and has a release version, owns at most one release2 that has a status that is equal to "success" and is not invalidated and has a release version that is of the release1. Rule: It is necessary that each image that has a status that is equal to "success", has a push timestamp. Rule: It is necessary that each application that owns a release1 that has a status that is equal to "success" and has a commit1, owns at most one release2 that has a status that is equal to "success" and has a commit2 that is equal to the commit1. Rule: It is necessary that each application that owns a release1 that has a revision, owns at most one release2 that has a semver major that is of the release1 and has a semver minor that is of the release1 and has a semver patch that is of the release1 and has a semver prerelease that is of the release1 and has a variant that is of the release1 and has a revision that is of the release1. @@ -857,6 +866,5 @@ Rule: It is necessary that each release that should operate a device, has a stat Rule: It is necessary that each release that should operate a device that is of a device type, belongs to an application that is host and is for the device type. -- native supervisor release rules, separated for legibility Rule: It is necessary that each release that should manage a device, has a status that is equal to "success" and has a semver major that is greater than 0 or has a semver minor that is greater than 0 or has a semver patch that is greater than 0. --- this rule is meant to prevent accidentally setting a host extension as a supervisor (i.e., another public + non-host app) -Rule: It is necessary that each release that should manage a device, belongs to an application that is public and is not host and has a slug that is equal to "balena_os/aarch64-supervisor" or "balena_os/amd64-supervisor" or "balena_os/armv7hf-supervisor" or "balena_os/i386-supervisor" or "balena_os/i386-nlp-supervisor" or "balena_os/rpi-supervisor". -Rule: It is necessary that each release that should manage a device that is of a device type1, belongs to an application that is for a device type2 that is of a cpu architecture that is supported by the device type1. +-- The first part of this rule is meant to prevent accidentally setting a host extension as a supervisor (i.e., another public + non-host app) +Rule: It is necessary that each release that should manage a device that is of a device type1, belongs to an application that is public and is not host and has a slug that is equal to "balena_os/aarch64-supervisor" or "balena_os/amd64-supervisor" or "balena_os/armv7hf-supervisor" or "balena_os/i386-supervisor" or "balena_os/i386-nlp-supervisor" or "balena_os/rpi-supervisor" and is for a device type2 that is of a cpu architecture that is supported by the device type1. diff --git a/src/features/api-keys/lib.ts b/src/features/api-keys/lib.ts index c90c710bf..27d2f0262 100644 --- a/src/features/api-keys/lib.ts +++ b/src/features/api-keys/lib.ts @@ -43,7 +43,7 @@ const $createApiKey = async ( } | undefined; - const actorID = actorable?.actor; + const actorID = actorable?.actor.__id; if (actorID == null) { throw new Error(`No ${actorType} found to associate with the api key`); } @@ -335,10 +335,27 @@ export const augmentReqApiKeyPermissions = < T extends permissions.PermissionReq, >( req: T, - ...extraPermissions: string[] + extraPermissions: string[], + /** + * When mutateRequestObject is + * false: A new request object with augmented permissions is returned to be used for specific tasks, + * while the rest of the code (eg: middleware & hooks) still runs with permissions the original request. + * true: The permissions are augmented for the whole lifetime of the request. + */ + mutateRequestObject = false, ): T => { - const augmentedReq = _.clone(req); - augmentedReq.apiKey = _.cloneDeep(augmentedReq.apiKey); + let augmentedReq = req; + + if (!mutateRequestObject) { + augmentedReq = _.clone(req); + augmentedReq.apiKey = _.cloneDeep(augmentedReq.apiKey); + } else if (augmentedReq.apiKey?.permissions) { + // When mutateRequestObject === true we still need to clone + // the permissions array rather than modifying it directly + // so that we do not pollute pine's apiKeyPermissions cache. + augmentedReq.apiKey.permissions = [...augmentedReq.apiKey.permissions]; + } + augmentedReq.apiKey?.permissions?.push(...extraPermissions); return augmentedReq; }; diff --git a/src/features/application-types/application-types.ts b/src/features/application-types/application-types.ts index af23aed13..4930f1590 100644 --- a/src/features/application-types/application-types.ts +++ b/src/features/application-types/application-types.ts @@ -1,5 +1,3 @@ -import _ from 'lodash'; - import { sbvrUtils, errors, permissions } from '@balena/pinejs'; import * as semver from 'balena-semver'; diff --git a/src/features/auth/index.ts b/src/features/auth/index.ts index b5fa2f28e..71197e95c 100644 --- a/src/features/auth/index.ts +++ b/src/features/auth/index.ts @@ -10,7 +10,7 @@ import { middleware } from '../../infra/auth'; import { login } from './login'; import { getUserPublicKeys } from './public-keys'; import { refreshToken } from './refresh-token'; -import { whoami } from './whoami'; +import { whoami, actorWhoami } from './whoami'; export * from './handles'; export { refreshToken }; @@ -28,6 +28,7 @@ export const setup = (app: Application, onLogin: SetupOptions['onLogin']) => { app.post('/login_', loginRateLimiter('body.username'), login(onLogin)); app.get('/user/v1/whoami', middleware.fullyAuthenticatedUser, whoami); + app.get('/actor/v1/whoami', middleware.authenticated, actorWhoami); app.get( '/auth/v1/public-keys/:username', diff --git a/src/features/auth/public-keys.ts b/src/features/auth/public-keys.ts index 2b7b6c15d..73941e296 100644 --- a/src/features/auth/public-keys.ts +++ b/src/features/auth/public-keys.ts @@ -16,7 +16,7 @@ export const getUserPublicKeys: RequestHandler = async (req, res) => { // Augment with the ability to resolve the user's username for this request only, there's no need // for device keys to have the ability by default. Access to the public key will still be restricted // by `user__has__public_key` so this only affects the ability to resolve the username they apply to - req = augmentReqApiKeyPermissions(req, 'resin.user.read'); + req = augmentReqApiKeyPermissions(req, ['resin.user.read']); const data = (await sbvrUtils.api.resin.get({ resource: 'user__has__public_key', options: { diff --git a/src/features/auth/whoami.ts b/src/features/auth/whoami.ts index a4b3169ad..d638dc8f9 100644 --- a/src/features/auth/whoami.ts +++ b/src/features/auth/whoami.ts @@ -1,14 +1,59 @@ import type { RequestHandler } from 'express'; -import { sbvrUtils, permissions } from '@balena/pinejs'; +import { sbvrUtils, permissions, errors } from '@balena/pinejs'; import { getUser } from '../../infra/auth/auth'; -import { captureException, handleHttpErrors } from '../../infra/error-handling'; +import { + captureException, + handleHttpErrors, + ThisShouldNeverHappenError, +} from '../../infra/error-handling'; -import type { User } from '../../balena-model'; +import type { User, Application, Device } from '../../balena-model'; const { api } = sbvrUtils; +type ExpandedActor = + | { + id: number; + is_of__user: [Pick]; + is_of__application: []; + is_of__device: []; + } + | { + id: number; + is_of__user: []; + is_of__application: [Pick]; + is_of__device: []; + } + | { + id: number; + is_of__user: []; + is_of__application: []; + is_of__device: [Pick]; + }; + +type ActorResponse = + | { + id: number; + actorType: 'user'; + actorTypeId: number; + username: string; + email: string | null; + } + | { + id: number; + actorType: 'application'; + actorTypeId: number; + slug: string; + } + | { + id: number; + actorType: 'device'; + actorTypeId: number; + uuid: string; + }; + export const whoami: RequestHandler = async (req, res) => { try { const userInfo = await sbvrUtils.db.readTransaction(async (tx) => { @@ -62,3 +107,118 @@ export const whoami: RequestHandler = async (req, res) => { res.status(500).end(); } }; + +export const actorWhoami: RequestHandler = async (req, res) => { + try { + const actorInfo = await sbvrUtils.db.readTransaction(async (tx) => { + // If this is a user key/token we must validate this is a key that + // has permissions for reading username/email + if (req.user?.actor) { + const [userWithId] = (await api.resin.get({ + resource: 'user', + passthrough: { req, tx }, + options: { + $top: 1, + $select: 'id', + $filter: { + actor: req.user?.actor, + }, + }, + })) as Array>; + + if (userWithId == null) { + throw new errors.UnauthorizedError(); + } + } + + const actorId = req.apiKey?.actor ?? req.user?.actor; + + if (actorId == null) { + throw new errors.UnauthorizedError( + 'Request API Key or Token has no associated actor', + ); + } + + return (await api.resin.get({ + resource: 'actor', + passthrough: { req: permissions.root, tx }, + id: actorId, + options: { + $expand: { + is_of__user: { + $select: ['id', 'username', 'email'], + }, + is_of__application: { + $select: ['id', 'slug'], + }, + is_of__device: { + $select: ['id', 'uuid'], + }, + }, + }, + })) as ExpandedActor; + }); + res.json(formatActorInfo(actorInfo)); + } catch (err) { + if (handleHttpErrors(req, res, err)) { + return; + } + captureException(err, 'Error while getting actor info', { req }); + res.status(500).end(); + } +}; + +const formatActorInfo = (rawActorInfo: ExpandedActor): ActorResponse => { + validateRawActorInfo(rawActorInfo); + + if (rawActorInfo.is_of__user.length === 1) { + return { + id: rawActorInfo.id, + actorType: 'user', + actorTypeId: rawActorInfo.is_of__user[0].id, + username: rawActorInfo.is_of__user[0].username, + email: rawActorInfo.is_of__user[0].email, + }; + } + + if (rawActorInfo.is_of__application.length === 1) { + return { + id: rawActorInfo.id, + actorType: 'application', + actorTypeId: rawActorInfo.is_of__application[0].id, + slug: rawActorInfo.is_of__application[0].slug, + }; + } + + if (rawActorInfo.is_of__device.length === 1) { + return { + id: rawActorInfo.id, + actorType: 'device', + actorTypeId: rawActorInfo.is_of__device[0].id, + uuid: rawActorInfo.is_of__device[0].uuid, + }; + } + + throw ThisShouldNeverHappenError( + `Found ${rawActorInfo.id} associated with none or more than one resource`, + ); +}; + +const validateRawActorInfo = (rawActorInfo: ExpandedActor) => { + const amountAssociatedResources = + rawActorInfo.is_of__user.length + + rawActorInfo.is_of__application.length + + rawActorInfo.is_of__device.length; + + if (amountAssociatedResources > 1) { + throw ThisShouldNeverHappenError( + `Found ${rawActorInfo.id} associated with more than one resource`, + ); + } + + if (amountAssociatedResources < 1) { + throw new errors.UnauthorizedError( + `Actor ${rawActorInfo.id} is not associated to any resource`, + ); + } +}; diff --git a/src/features/cascade-delete/hooks.ts b/src/features/cascade-delete/hooks.ts index 494422e59..68e67bade 100644 --- a/src/features/cascade-delete/hooks.ts +++ b/src/features/cascade-delete/hooks.ts @@ -35,6 +35,7 @@ setupDeleteCascade('image__is_part_of__release', { }); setupDeleteCascade('release', { + release_asset: 'release', release_tag: 'release', image__is_part_of__release: 'is_part_of__release', image_install: 'is_provided_by__release', @@ -128,13 +129,13 @@ hooks.addPureHook('DELETE', 'resin', 'user', { if (user == null) { throw new errors.BadRequestError('Invalid user'); } - request.custom.actorId = user.actor; + request.custom.actorId = user.actor.__id; try { await authApiTx.delete({ resource: 'api_key', options: { $filter: { - is_of__actor: user.actor, + is_of__actor: user.actor.__id, }, }, }); diff --git a/src/features/ci-cd/hooks/release-update-timestamp.ts b/src/features/ci-cd/hooks/release-update-timestamp.ts index a5f5a08dd..883d9502f 100644 --- a/src/features/ci-cd/hooks/release-update-timestamp.ts +++ b/src/features/ci-cd/hooks/release-update-timestamp.ts @@ -1,5 +1,3 @@ -import _ from 'lodash'; - import { hooks } from '@balena/pinejs'; const releaseUpdateTimestampHook: hooks.Hooks = { diff --git a/src/features/ci-cd/hooks/release-versioning.ts b/src/features/ci-cd/hooks/release-versioning.ts index efdaa7c7e..d3676159d 100644 --- a/src/features/ci-cd/hooks/release-versioning.ts +++ b/src/features/ci-cd/hooks/release-versioning.ts @@ -7,7 +7,6 @@ import { } from '@balena/pinejs'; import type { FilterObj } from 'pinejs-client-core'; import semverLib from 'semver'; -import _ from 'lodash'; import { ADVISORY_LOCK_NAMESPACES } from '../../../lib/config'; import { groupByMap } from '../../../lib/utils'; import type { PickDeferred, Release } from '../../../balena-model'; @@ -165,6 +164,16 @@ hooks.addPureHook('POST', 'resin', 'release', { const custom = request.custom as CustomObjectBase; // Releases are by final by default custom.is_final ??= true; + // Handle case where contracts provided as stringified object + if (typeof request.values.contract === 'string') { + try { + request.values.contract = JSON.parse(request.values.contract); + } catch (err) { + throw new BadRequestError( + 'Invalid contract format. Must be a valid JSON object.', + ); + } + } }, POSTRUN: async ({ api, request, result: releaseId, tx }) => { const custom = request.custom as CustomObjectBase; diff --git a/src/features/ci-cd/hooks/track-latest-release.ts b/src/features/ci-cd/hooks/track-latest-release.ts index 361004983..75412ab9e 100644 --- a/src/features/ci-cd/hooks/track-latest-release.ts +++ b/src/features/ci-cd/hooks/track-latest-release.ts @@ -1,4 +1,3 @@ -import _ from 'lodash'; import { sbvrUtils, hooks } from '@balena/pinejs'; // We only track releases that are successful, final, not invalid, and passing tests diff --git a/src/features/contracts/contracts-directory.ts b/src/features/contracts/contracts-directory.ts index 02c8fa8e1..2d40e7154 100644 --- a/src/features/contracts/contracts-directory.ts +++ b/src/features/contracts/contracts-directory.ts @@ -11,6 +11,7 @@ import validator from 'validator'; import type { RepositoryInfo, Contract } from './index'; import { getBase64DataUri } from '../../lib/utils'; import { captureException } from '../../infra/error-handling'; +import { CONTRACT_ALLOWLIST } from '../../lib/config'; const pipeline = util.promisify(stream.pipeline); const exists = util.promisify(fs.exists); @@ -177,13 +178,34 @@ export const getContracts = async (type: string): Promise => { return []; } - const contractFiles = await glob( + let contractFiles = await glob( `${CONTRACTS_BASE_DIR}/**/contracts/${type}/**/*.json`, ); if (!contractFiles.length) { return []; } + // If there are explicit includes, then everything else is excluded so we need to + // filter the contractFiles list to include only contracts that are in the CONTRACT_ALLOWLIST map + if (CONTRACT_ALLOWLIST.size > 0) { + const slugRegex = new RegExp(`/contracts/(${_.escapeRegExp(type)}/[^/]+)/`); + const before = contractFiles.length; + contractFiles = contractFiles.filter((file) => { + // Get the contract slug from the file path + const deviceTypeSlug = file.match(slugRegex)?.[1]; + if (!deviceTypeSlug) { + return false; + } + + // Check if this slug is included in the map + return CONTRACT_ALLOWLIST.has(deviceTypeSlug); + }); + + console.log( + `CONTRACT_ALLOWLIST reduced ${type} contract slugs from ${before} to ${contractFiles.length}`, + ); + } + const contracts = await Promise.all( contractFiles.map(async (file) => { let contract; diff --git a/src/features/device-config/device-config.ts b/src/features/device-config/device-config.ts index 13fe698d6..d89467bf4 100644 --- a/src/features/device-config/device-config.ts +++ b/src/features/device-config/device-config.ts @@ -57,9 +57,7 @@ export const generateConfig = async ( // Older ones have to use the old "user api keys" return await createUserApiKey( req, - ( - await userPromise - ).id, + (await userPromise).id, apiKeyOptions, ); } diff --git a/src/features/device-config/download.ts b/src/features/device-config/download.ts index 7391fad67..ffd3d9b00 100644 --- a/src/features/device-config/download.ts +++ b/src/features/device-config/download.ts @@ -71,13 +71,14 @@ export const downloadImageConfig: RequestHandler = async (req, res) => { res.json(config); } catch (err) { - if (err instanceof UnauthorizedError) { - err = new NotFoundError(err); + let errorToReturn = err; + if (errorToReturn instanceof UnauthorizedError) { + errorToReturn = new NotFoundError(errorToReturn); } - if (handleHttpErrors(req, res, err)) { + if (handleHttpErrors(req, res, errorToReturn)) { return; } - captureException(err, 'Error generating config', { req }); - res.status(500).send(translateError(err)); + captureException(errorToReturn, 'Error generating config', { req }); + res.status(500).send(translateError(errorToReturn)); } }; diff --git a/src/features/device-heartbeat/index.ts b/src/features/device-heartbeat/index.ts index c7658f86c..abbd5e7d2 100644 --- a/src/features/device-heartbeat/index.ts +++ b/src/features/device-heartbeat/index.ts @@ -190,11 +190,12 @@ export class DeviceOnlineStateManager extends EventEmitter<{ this.rsmq = new RedisSMQ({ // TODO: RSMQ does not currently support a redis cluster ...REDIS.general.host, + ...REDIS.general.auth, ns: DeviceOnlineStateManager.REDIS_NAMESPACE, }); // create the RedisMQ queue and start consuming messages... - this.rsmq + void this.rsmq .createQueueAsync({ qname: DeviceOnlineStateManager.EXPIRED_QUEUE }) .catch((err) => { if (err.name !== 'queueExists') { @@ -208,8 +209,8 @@ export class DeviceOnlineStateManager extends EventEmitter<{ ); } - private async setupQueueStatsEmitter(interval: number) { - setTimeout(interval, undefined, { ref: false }).then(async () => { + private setupQueueStatsEmitter(interval: number) { + void setTimeout(interval, undefined, { ref: false }).then(async () => { try { const startAt = Date.now(); const queueAttributes = await this.rsmq.getQueueAttributesAsync({ @@ -279,7 +280,7 @@ export class DeviceOnlineStateManager extends EventEmitter<{ private consume() { // pull a message from the queue... - this.rsmq + void this.rsmq .receiveMessageAsync({ qname: DeviceOnlineStateManager.EXPIRED_QUEUE, vt: DeviceOnlineStateManager.RSMQ_READ_TIMEOUT, // prevent other consumers seeing the same message (if any) preventing multiple API agents from processing it... @@ -304,7 +305,7 @@ export class DeviceOnlineStateManager extends EventEmitter<{ deviceId, DeviceOnlineStates.Timeout, ); - this.scheduleChangeOfStateForDevice( + void this.scheduleChangeOfStateForDevice( deviceId, await this.getDeviceOnlineState(deviceId), DeviceOnlineStates.Timeout, diff --git a/src/features/device-logs/lib/backends/loki.ts b/src/features/device-logs/lib/backends/loki.ts index 9c01eb348..c71a487c9 100644 --- a/src/features/device-logs/lib/backends/loki.ts +++ b/src/features/device-logs/lib/backends/loki.ts @@ -20,7 +20,7 @@ import { TailResponse, Timestamp, } from 'loki-grpc-client'; -import { errors, sbvrUtils } from '@balena/pinejs'; +import { errors, sbvrUtils, permissions, types } from '@balena/pinejs'; import { LOKI_HOST, LOKI_PORT } from '../../../../lib/config'; import { DeviceLog, @@ -43,9 +43,7 @@ import { incrementPublishCallTotal, } from './metrics'; import { setTimeout } from 'timers/promises'; -import { root } from '@balena/pinejs/out/sbvr-api/permissions'; import { Device, PickDeferred } from '../../../../balena-model'; -import { RequiredField } from '@balena/pinejs/out/sbvr-api/common-types'; const { BadRequestError } = errors; @@ -107,13 +105,13 @@ async function assertLokiLogContext( ctx: LogContext & Partial, ): Promise { if ('belongs_to__application' in ctx) { - return ctx as RequiredField; + return ctx as types.RequiredField; } const device = (await sbvrUtils.api.resin.get({ resource: 'device', id: ctx.id, - passthrough: { req: root }, + passthrough: { req: permissions.root }, options: { $select: ['belongs_to__application'], }, @@ -123,7 +121,7 @@ async function assertLokiLogContext( (ctx as Writable).belongs_to__application = device?.belongs_to__application!.__id; - return ctx as RequiredField; + return ctx as types.RequiredField; } export class LokiBackend implements DeviceLogsBackend { diff --git a/src/features/device-logs/lib/backends/redis.ts b/src/features/device-logs/lib/backends/redis.ts index 7f4cd72eb..6b5a90dc1 100644 --- a/src/features/device-logs/lib/backends/redis.ts +++ b/src/features/device-logs/lib/backends/redis.ts @@ -1,4 +1,5 @@ import avro from 'avsc'; +import * as snappy from 'snappy'; import { stripIndent } from 'common-tags'; import { EventEmitter } from 'events'; import _ from 'lodash'; @@ -20,7 +21,7 @@ import { newSubscribeInstance, createIsolatedRedis, } from '../../../../infra/redis'; -import { Result } from 'ioredis'; +import type { Result } from 'ioredis'; const SUBSCRIBECMD = REDIS_LOGS_SHARDED_PUBSUB ? 'ssubscribe' : 'subscribe'; const UNSUBSCRIBECMD = REDIS_LOGS_SHARDED_PUBSUB @@ -140,7 +141,8 @@ export class RedisBackend implements DeviceLogsBackend { count === Infinity ? 0 : -count, -1, ); - return _(payloads).map(this.fromRedisLog).compact().value(); + const parsedLogs = await Promise.all(payloads.map(this.fromRedisLog)); + return _.compact(parsedLogs); } public get available(): boolean { @@ -152,7 +154,7 @@ export class RedisBackend implements DeviceLogsBackend { throw new ServiceUnavailableError(); } // Immediately map the logs as they are synchronously cleared - const redisLogs = logs.map(this.toRedisLog, this); + const redisLogs = await Promise.all(logs.map(this.toRedisLog, this)); const limit = ctx.retention_limit; const key = this.getKey(ctx); @@ -181,12 +183,12 @@ export class RedisBackend implements DeviceLogsBackend { const key = this.getKey(ctx); if (!this.subscriptions.listenerCount(key)) { const subscribersKey = this.getKey(ctx, 'subscribers'); - pubSub[SUBSCRIBECMD](key); + void pubSub[SUBSCRIBECMD](key); // Increment the subscribers counter to recognize we've subscribed - redis.incrSubscribers(subscribersKey); + void redis.incrSubscribers(subscribersKey); // Start a heartbeat to ensure the subscribers counter stays alive whilst we're subscribed this.subscriptionHeartbeats[key] = setInterval(() => { - redis.expire(subscribersKey, LOGS_SUBSCRIPTION_EXPIRY_SECONDS); + void redis.expire(subscribersKey, LOGS_SUBSCRIPTION_EXPIRY_SECONDS); }, LOGS_SUBSCRIPTION_EXPIRY_HEARTBEAT_SECONDS); } this.subscriptions.on(key, subscription); @@ -200,7 +202,7 @@ export class RedisBackend implements DeviceLogsBackend { // Clear the heartbeat clearInterval(this.subscriptionHeartbeats[key]); // And decrement the subscribers counter - redis.decrSubscribers(subscribersKey).then((n) => { + void redis.decrSubscribers(subscribersKey).then((n) => { if (n < 0) { captureException( new Error(), @@ -208,7 +210,7 @@ export class RedisBackend implements DeviceLogsBackend { ); } }); - pubSub[UNSUBSCRIBECMD](key); + void pubSub[UNSUBSCRIBECMD](key); } } @@ -224,16 +226,25 @@ export class RedisBackend implements DeviceLogsBackend { return `{device:${ctx.id}}:${suffix}`; } - private handleMessage(key: string, payload: string) { - const log = this.fromRedisLog(payload); + private async handleMessage(key: string, payload: string) { + const log = await this.fromRedisLog(payload); if (log) { this.subscriptions.emit(key, log); } } - private fromRedisLog(payload: string): DeviceLog | undefined { + private async fromRedisLog(payload: string): Promise { try { - const log = schema.fromBuffer(Buffer.from(payload, BUFFER_ENCODING)); + let decompressedBuffer = Buffer.from(payload, BUFFER_ENCODING); + try { + decompressedBuffer = (await snappy.uncompress( + decompressedBuffer, + )) as Buffer; + } catch { + // We ignore ones that fail to decompress as they are likely from before we added compression + // TODO: Stop ignoring these errors once we're sure all logs are compressed + } + const log = schema.fromBuffer(decompressedBuffer); if (log.version !== VERSION) { throw new Error( `Invalid Redis serialization version: ${JSON.stringify(log)}`, @@ -249,9 +260,10 @@ export class RedisBackend implements DeviceLogsBackend { } } - private toRedisLog(log: DeviceLog): string { + private async toRedisLog(log: DeviceLog): Promise { try { - return schema.toBuffer(log).toString(BUFFER_ENCODING); + const compressedLog = await snappy.compress(schema.toBuffer(log)); + return compressedLog.toString(BUFFER_ENCODING); } catch (err) { captureException(err, 'Failed to convert log to redis buffer'); throw new BadRequestError(); diff --git a/src/features/device-logs/lib/config.ts b/src/features/device-logs/lib/config.ts index 311101a51..21bd98a67 100644 --- a/src/features/device-logs/lib/config.ts +++ b/src/features/device-logs/lib/config.ts @@ -23,8 +23,7 @@ export function addRetentionLimit( export const getBackend = _.once((): DeviceLogsBackend => new RedisBackend()); -export const getLokiBackend = _.once((): DeviceLogsBackend => { - const { LokiBackend } = - require('./backends/loki') as typeof import('./backends/loki'); +export const getLokiBackend = _.once(async (): Promise => { + const { LokiBackend } = await import('./backends/loki'); return new LokiBackend(); }); diff --git a/src/features/device-logs/lib/read.ts b/src/features/device-logs/lib/read.ts index 2512c5187..abf5aba39 100644 --- a/src/features/device-logs/lib/read.ts +++ b/src/features/device-logs/lib/read.ts @@ -147,7 +147,7 @@ async function handleStreamingRead( return; } - const afterDate = logs.length && logs[logs.length - 1].createdAt; + const afterDate = logs.at(-1)?.createdAt ?? 0; // Append the subscription logs to the history queue const firstAfterDateIndex = buffer.findIndex( (log) => log.createdAt > afterDate, diff --git a/src/features/device-logs/lib/store.ts b/src/features/device-logs/lib/store.ts index 80bdfee61..12b225df2 100644 --- a/src/features/device-logs/lib/store.ts +++ b/src/features/device-logs/lib/store.ts @@ -105,7 +105,7 @@ export const store: RequestHandler = async (req: Request, res: Response) => { await Promise.all([ getBackend().publish(ctx, logs), shouldPublishToLoki() - ? getLokiBackend() + ? (await getLokiBackend()) .publish(ctx, logs) .catch((err) => captureException(err, 'Failed to publish logs to Loki'), @@ -149,7 +149,7 @@ const publishBackend = LOKI_ENABLED ) => { const publishingToRedis = backend.publish(ctx, buffer); const publishingToLoki = shouldPublishToLoki() - ? getLokiBackend() + ? (await getLokiBackend()) .publish(ctx, buffer) .catch((err) => captureException(err, 'Failed to publish logs to Loki'), diff --git a/src/features/device-logs/lib/supervisor.ts b/src/features/device-logs/lib/supervisor.ts index 7bf74c9aa..5c6a06c45 100644 --- a/src/features/device-logs/lib/supervisor.ts +++ b/src/features/device-logs/lib/supervisor.ts @@ -4,7 +4,6 @@ import { errors } from '@balena/pinejs'; import type { DeviceLog, OldSupervisorLog, SupervisorLog } from './struct'; import { getNanoTimestamp } from '../../../lib/utils'; -import { BadRequestError } from '@balena/pinejs/out/sbvr-api/errors'; const MAX_LOGS_PER_BATCH = 10; @@ -26,7 +25,7 @@ export class Supervisor { private convertAnyLog(log: SupervisorLog): DeviceLog | undefined { if (this.isOldLog(log)) { // Old format supervisor logs are no longer supported - throw new BadRequestError(); + throw new errors.BadRequestError(); } return this.convertLog(log); } diff --git a/src/features/device-provisioning/gracefully-deny-conflicting-registrations.ts b/src/features/device-provisioning/gracefully-deny-conflicting-registrations.ts new file mode 100644 index 000000000..c2189e2b5 --- /dev/null +++ b/src/features/device-provisioning/gracefully-deny-conflicting-registrations.ts @@ -0,0 +1,69 @@ +import _ from 'lodash'; +import { sbvrUtils, errors, permissions } from '@balena/pinejs'; +import { API_KEY_EXISTS_CACHE_TIMEOUT } from '../../lib/config'; +import { createMultiLevelStore } from '../../infra/cache'; +import { checkDeviceExistsIsFrozen } from '../device-state/middleware'; + +const { ConflictError } = errors; +const { api } = sbvrUtils; + +const checkApiKeyExistsQuery = _.once(() => + api.resin.prepare<{ key: string }>({ + resource: 'api_key', + passthrough: { req: permissions.root }, + id: { + key: { '@': 'key' }, + }, + options: { + $select: 'id', + }, + }), +); + +export const checkApiKeyExistsStore = createMultiLevelStore( + 'checkApiKeyExists', + { + default: { + // We only care to cache the api keys that already exist, + // so that we throw a conflict error earlier. + isCacheableValue: (value: any) => value === true, + ttl: API_KEY_EXISTS_CACHE_TIMEOUT, + }, + local: false, + }, + false, +); + +const checkApiKeyExists = async (key: string) => { + return await checkApiKeyExistsStore.wrap(key, async () => { + const apiKey = await checkApiKeyExistsQuery()({ key }); + return apiKey != null; + }); +}; + +/** + * Early reject requests with already existing UUIDs/api keys to avoid + * running the whole registration process and its rules. + * TODO: Consider removing this once pine supports rule narrowing on multiple resources. + */ +export async function gracefullyDenyConflictingRegistrations( + uuid: string, + apiKey: string | undefined, +) { + // Even though requests with conflicting device UUIDs are cheap (since they throw before the rules run), + // we do have to check for the UUID so that a registration with conflicting UUID & Api key still throws + // the same error as if this optimization did not exist. + const device = await checkDeviceExistsIsFrozen(uuid); + if (device != null) { + // Should be matching the conflict error that Pine would throw + // so that the optimization is transparent. + throw new ConflictError('"uuid" must be unique.'); + } + + const existingApiKey = apiKey != null && (await checkApiKeyExists(apiKey)); + if (existingApiKey) { + // Should be matching the conflict error that Pine would throw + // so that the optimization is transparent. + throw new ConflictError('"key" must be unique.'); + } +} diff --git a/src/features/device-provisioning/hooks/cache-invalidation.ts b/src/features/device-provisioning/hooks/cache-invalidation.ts new file mode 100644 index 000000000..59a5d3ea7 --- /dev/null +++ b/src/features/device-provisioning/hooks/cache-invalidation.ts @@ -0,0 +1,52 @@ +import { sbvrUtils, permissions, hooks } from '@balena/pinejs'; +import { checkApiKeyExistsStore } from '../gracefully-deny-conflicting-registrations'; +import { checkDeviceExistsIsFrozen } from '../../device-state/middleware'; +import { captureException } from '../../../infra/error-handling'; + +const setupCacheInvalidation = ( + model: string, + resource: string, + keyProperty: K, + cache: { delete: (key: string) => Promise }, +) => { + hooks.addPureHook('DELETE', model, resource, { + PRERUN: async (args) => { + const { api, tx } = args; + const affectedIds = await sbvrUtils.getAffectedIds(args); + if (affectedIds.length === 0) { + return; + } + const affectedItems = (await api.get({ + resource, + passthrough: { req: permissions.root, tx }, + options: { + $select: keyProperty, + $filter: { + id: { $in: affectedIds }, + }, + }, + })) as Array<{ [key in K]: string }>; + + // Invalidate the caches only when the tx is committed + tx.on('end', () => { + for (const affectedItem of affectedItems) { + // Run in the background as this is not a reason to fail the request + void (async () => { + try { + await cache.delete(affectedItem[keyProperty]); + } catch (err) { + captureException( + err, + `Error while invalidating a(n) ${model} record from the device registration gracefully deny cache: ${affectedIds}`, + ); + } + })(); + } + }); + }, + }); +}; + +setupCacheInvalidation('resin', 'device', 'uuid', checkDeviceExistsIsFrozen); +setupCacheInvalidation('resin', 'api_key', 'key', checkApiKeyExistsStore); +setupCacheInvalidation('Auth', 'api_key', 'key', checkApiKeyExistsStore); diff --git a/src/features/device-provisioning/hooks/index.ts b/src/features/device-provisioning/hooks/index.ts new file mode 100644 index 000000000..14793d426 --- /dev/null +++ b/src/features/device-provisioning/hooks/index.ts @@ -0,0 +1 @@ +import './cache-invalidation'; diff --git a/src/features/device-provisioning/register.ts b/src/features/device-provisioning/register.ts index 0dc07d168..e3234b2b0 100644 --- a/src/features/device-provisioning/register.ts +++ b/src/features/device-provisioning/register.ts @@ -1,7 +1,5 @@ import type { RequestHandler } from 'express'; -import _ from 'lodash'; import randomstring from 'randomstring'; - import { sbvrUtils, errors } from '@balena/pinejs'; import { @@ -17,6 +15,8 @@ import { import { getDeviceTypeBySlug } from '../device-types/device-types'; import { checkInt } from '../../lib/utils'; import { checkDeviceExistsIsFrozen } from '../device-state/middleware'; +import { gracefullyDenyConflictingRegistrations } from './gracefully-deny-conflicting-registrations'; +import onFinished from 'on-finished'; const { BadRequestError, ConflictError } = errors; const { api } = sbvrUtils; @@ -43,6 +43,8 @@ export const register: RequestHandler = async (req, res) => { throw new BadRequestError('UUID must be specified'); } + await gracefullyDenyConflictingRegistrations(uuid, req.body.api_key); + const { supervisor_version: supervisorVersion, os_version: osVersion, @@ -56,16 +58,22 @@ export const register: RequestHandler = async (req, res) => { * - Fetch the device we create & create an api key for it * - Read the hostApp releases that should be operating the device */ - req = augmentReqApiKeyPermissions( - req, + req = augmentReqApiKeyPermissions(req, [ 'resin.device.read', 'resin.device.create-device-api-key', `resin.application.read?is_public eq true and is_host eq true and is_for__device_type/canAccess()`, 'resin.release.read?belongs_to__application/canAccess()', `resin.release_tag.read?release/canAccess()`, - ); + ]); const response = await sbvrUtils.db.transaction(async (tx) => { + // TODO: Replace this manual rollback on request closure with a more generic/automated version + onFinished(res, () => { + if (!tx.isClosed()) { + void tx.rollback(); + } + }); + const resinApiTx = api.resin.clone({ passthrough: { req, tx } }); const deviceType = await getDeviceTypeBySlug(resinApiTx, deviceTypeSlug); const device = await resinApiTx.post({ @@ -94,17 +102,13 @@ export const register: RequestHandler = async (req, res) => { api_key: apiKey, }; }); + // Clear the device existence cache for the just registered device // in case it tried to communicate with the API before registering - checkDeviceExistsIsFrozen.delete(response.uuid); + void checkDeviceExistsIsFrozen.delete(response.uuid); res.status(201).json(response); } catch (err) { - if (err instanceof ConflictError) { - captureException(err, 'Conflict error while registering device', { - req, - }); - } if (err instanceof ConflictError && err.message.includes('uuid')) { // WORKAROUND: balena-supervisor >= v4.2.0 < v11.4.14 rely on the specific error message rather than a 409 // so we convert the error here to ensure they can continue to work, this should be removed once we drop diff --git a/src/features/device-proxy/device-proxy.ts b/src/features/device-proxy/device-proxy.ts index df80aaaf7..f7674625c 100644 --- a/src/features/device-proxy/device-proxy.ts +++ b/src/features/device-proxy/device-proxy.ts @@ -63,7 +63,7 @@ const validateSupervisorResponse = ( } res.status(statusCode).json(jsonBody); } else if (/^text\/(plain|html)/.test(contentType)) { - if (/^([A-Za-z0-9\s:'\.\?!,\/-])*$/g.test(body)) { + if (/^([A-Za-z0-9\s:'.?!,/-])*$/g.test(body)) { res.status(statusCode).set('Content-Type', 'text/plain').send(body); } else { badSupervisorResponse(req, res, filter, 'Invalid TEXT data'); @@ -132,10 +132,8 @@ export const proxy = async (req: Request, res: Response) => { if (handleHttpErrors(req, res, err)) { return; } - if (err?.body != null) { - err = err.body; - } - res.status(502).send(translateError(err)); + const errorToReturn = err?.body ?? err; + res.status(502).send(translateError(errorToReturn)); } }; diff --git a/src/features/device-state/index.ts b/src/features/device-state/index.ts index 54610501c..30d34f0bd 100644 --- a/src/features/device-state/index.ts +++ b/src/features/device-state/index.ts @@ -3,16 +3,22 @@ import type StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { middleware } from '../../infra/auth'; +import type { Device } from '../../balena-model'; import { resolveOrDenyDevicesWithStatus } from './middleware'; import { stateV2 } from './routes/state-get-v2'; import { stateV3 } from './routes/state-get-v3'; import { statePatchV2 } from './routes/state-patch-v2'; -import { statePatchV3 } from './routes/state-patch-v3'; +import { + StatePatchV3Body, + resolveDeviceUuids, + statePatchV3, +} from './routes/state-patch-v3'; import { fleetStateV3 } from './routes/fleet-state-get-v3'; -import { Device } from '../../balena-model'; +import type { GetStateEventStoredDeviceFields } from './state-get-utils'; export { + getStateEventAdditionalFields, getConfig, setReadTransaction, filterDeviceConfig, @@ -49,7 +55,14 @@ export const setup = (app: Application) => { middleware.authenticatedApiKey, statePatchV2, ); - app.patch('/device/v3/state', middleware.authenticatedApiKey, statePatchV3); + app.patch( + '/device/v3/state', + resolveOrDenyDevicesWithStatus(401, (req) => + resolveDeviceUuids(req.body as StatePatchV3Body), + ), + middleware.authenticatedApiKey, + statePatchV3, + ); app.get( '/device/v3/fleet/:fleetUuid/state', middleware.authenticated, @@ -63,7 +76,10 @@ export interface Events { info: Pick & { config?: Dictionary; ipAddress: string | undefined; + // TODO: Drop in the next major + /** @deprecated use the storedDeviceFields */ storedPublicAddress: Device['public_address']; + storedDeviceFields: GetStateEventStoredDeviceFields; }, ) => void; } diff --git a/src/features/device-state/middleware.ts b/src/features/device-state/middleware.ts index e95c82e49..49c79fa85 100644 --- a/src/features/device-state/middleware.ts +++ b/src/features/device-state/middleware.ts @@ -5,6 +5,7 @@ import type { Device } from '../../balena-model'; import { sbvrUtils, permissions } from '@balena/pinejs'; import { DEVICE_EXISTS_CACHE_TIMEOUT } from '../../lib/config'; +import type { Request } from 'express-serve-static-core'; const { api } = sbvrUtils; @@ -39,14 +40,17 @@ export const checkDeviceExistsIsFrozen = multiCacheMemoizee( ); export interface ResolveDeviceInfoCustomObject { - resolvedDevice: Device['id']; + resolvedDeviceIds: Array; } +const requestParamsUuidResolver = (req: Request) => [req.params.uuid]; + /** * This checks if a device is deleted or frozen and responds according to the passed statusCode(s) */ export const resolveOrDenyDevicesWithStatus = ( statusCode: number | { deleted: number; frozen: number }, + uuidResolver: (req: Request) => string[] = requestParamsUuidResolver, ): RequestHandler => { const deletedStatusCode = typeof statusCode === 'number' ? statusCode : statusCode.deleted; @@ -54,20 +58,32 @@ export const resolveOrDenyDevicesWithStatus = ( typeof statusCode === 'number' ? statusCode : statusCode.frozen; return async (req, res, next) => { - const device = await checkDeviceExistsIsFrozen(req.params.uuid); - if (device == null) { - // Gracefully deny deleted devices + const uuids = uuidResolver(req); + if (!uuids.length) { res.status(deletedStatusCode).end(); return; } - if (device.is_frozen) { - // Gracefully deny frozen devices - res.status(frozenStatusCode).end(); - return; + const deviceIds: number[] = []; + for (const uuid of uuids) { + const device = await checkDeviceExistsIsFrozen(uuid); + // Heads-up: if any of the provided devices is deleted/frozen + // then the whole request is rejected! We should revisit this + // if we later add again support for handling multiple devices + // per request. + if (device == null) { + // Gracefully deny deleted devices + res.status(deletedStatusCode).end(); + return; + } + if (device.is_frozen) { + // Gracefully deny frozen devices + res.status(frozenStatusCode).end(); + return; + } + deviceIds.push(device.id); } - req.custom ??= {}; - (req.custom as ResolveDeviceInfoCustomObject).resolvedDevice = device.id; + (req.custom as ResolveDeviceInfoCustomObject).resolvedDeviceIds = deviceIds; next(); }; }; diff --git a/src/features/device-state/routes/state-get-v2.ts b/src/features/device-state/routes/state-get-v2.ts index e47d407e2..5fe1ec5f8 100644 --- a/src/features/device-state/routes/state-get-v2.ts +++ b/src/features/device-state/routes/state-get-v2.ts @@ -15,6 +15,7 @@ import { ConfigurationVarsToLabels, getStateDelayingEmpty, getConfig, + getStateEventAdditionalFields, } from '../state-get-utils'; import { sbvrUtils } from '@balena/pinejs'; import { events } from '..'; @@ -58,8 +59,9 @@ export type StateV2 = { }; }; dependent: { - apps: {}; - devices: {}; + // Empty objects since we dropped support for dependent devices + apps: Record; + devices: Record; }; }; @@ -193,7 +195,7 @@ const stateQuery = _.once(() => resource: 'device', id: { uuid: { '@': 'uuid' } }, options: { - $select: ['device_name', 'public_address'], + $select: ['device_name', ...getStateEventAdditionalFields], $expand: { device_config_variable: { $select: ['name', 'value'], @@ -239,7 +241,8 @@ const stateQuery = _.once(() => ); const getStateV2 = async (req: Request, uuid: string): Promise => { - const deviceId = (req.custom as ResolveDeviceInfoCustomObject).resolvedDevice; + const [deviceId] = (req.custom as ResolveDeviceInfoCustomObject) + .resolvedDeviceIds; const device = await getDevice(req, uuid); const config = getConfig(device); @@ -248,7 +251,9 @@ const getStateV2 = async (req: Request, uuid: string): Promise => { apiKey: req.apiKey, config, ipAddress: getIP(req), + // TODO: Drop in the next major in favor of storedDeviceFields storedPublicAddress: device.public_address as Device['public_address'], + storedDeviceFields: _.pick(device, getStateEventAdditionalFields), }); const userApp = getUserAppForState(device, config); diff --git a/src/features/device-state/routes/state-get-v3.ts b/src/features/device-state/routes/state-get-v3.ts index e42b467c7..ba7eef427 100644 --- a/src/features/device-state/routes/state-get-v3.ts +++ b/src/features/device-state/routes/state-get-v3.ts @@ -12,6 +12,7 @@ import { getConfig, getReleaseForDevice, getStateDelayingEmpty, + getStateEventAdditionalFields, readTransaction, serviceInstallFromImage, varListInsert, @@ -270,14 +271,15 @@ const stateQuery = _.once(() => resource: 'device', id: { uuid: { '@': 'uuid' } }, options: { - $select: ['device_name', 'public_address'], + $select: ['device_name', ...getStateEventAdditionalFields], $expand: deviceExpand, }, }), ); const getStateV3 = async (req: Request, uuid: string): Promise => { - const deviceId = (req.custom as ResolveDeviceInfoCustomObject).resolvedDevice; + const [deviceId] = (req.custom as ResolveDeviceInfoCustomObject) + .resolvedDeviceIds; const device = await getDevice(req, uuid); const config = getConfig(device); @@ -286,7 +288,9 @@ const getStateV3 = async (req: Request, uuid: string): Promise => { apiKey: req.apiKey, config, ipAddress: getIP(req), + // TODO: Drop in the next major in favor of storedDeviceFields storedPublicAddress: device.public_address as Device['public_address'], + storedDeviceFields: _.pick(device, getStateEventAdditionalFields), }); let apps = getUserAppState(device, config); diff --git a/src/features/device-state/routes/state-patch-v2.ts b/src/features/device-state/routes/state-patch-v2.ts index 87c5a55cd..2f14137aa 100644 --- a/src/features/device-state/routes/state-patch-v2.ts +++ b/src/features/device-state/routes/state-patch-v2.ts @@ -116,8 +116,9 @@ export const statePatchV2: RequestHandler = async (req, res) => { if (!uuid) { throw new BadRequestError(); } - const { resolvedDevice: deviceId } = - req.custom as ResolveDeviceInfoCustomObject; + const { + resolvedDeviceIds: [deviceId], + } = req.custom as ResolveDeviceInfoCustomObject; if (deviceId == null) { // We are supposed to have already checked this. throw new UnauthorizedError(); @@ -138,10 +139,9 @@ export const statePatchV2: RequestHandler = async (req, res) => { if (local != null) { const { apps } = local; - let deviceBody: - | Pick & { - is_running__release?: number | null; - } = _.pick(local, v2ValidPatchFields); + let deviceBody: Pick & { + is_running__release?: number | null; + } = _.pick(local, v2ValidPatchFields); let metricsBody: Pick = _.pick(local, metricsPatchFields); if ( @@ -157,6 +157,15 @@ export const statePatchV2: RequestHandler = async (req, res) => { if (local.name != null) { deviceBody.device_name = local.name; } + if (deviceBody.cpu_id != null) { + if (/[^\x20-\x7E]/.test(deviceBody.cpu_id)) { + // if the CPU id is not in the character range of 0x20 (SPACE) to 0x7e (~) we drop the CPU ID + // this cpu id wouldn't be rendered anyway + delete deviceBody.cpu_id; + } else { + deviceBody.cpu_id = deviceBody.cpu_id.toLowerCase(); + } + } if ( local.is_on__commit !== undefined || @@ -191,9 +200,6 @@ export const statePatchV2: RequestHandler = async (req, res) => { deviceBody = truncateShortTextFields(deviceBody); // If we're updating anyway then ensure the metrics data is included deviceBody = { ...deviceBody, ...metricsBody }; - if (deviceBody.cpu_id != null) { - deviceBody.cpu_id = deviceBody.cpu_id.toLowerCase(); - } await resinApiTx.patch({ resource: 'device', id: deviceId, diff --git a/src/features/device-state/routes/state-patch-v3.ts b/src/features/device-state/routes/state-patch-v3.ts index b11c23bd4..a1ba57aba 100644 --- a/src/features/device-state/routes/state-patch-v3.ts +++ b/src/features/device-state/routes/state-patch-v3.ts @@ -23,6 +23,7 @@ import { shouldUpdateMetrics, truncateShortTextFields, } from '../state-patch-utils'; +import { ResolveDeviceInfoCustomObject } from '../middleware'; const { BadRequestError, UnauthorizedError, InternalRequestError } = errors; const { api } = sbvrUtils; @@ -80,7 +81,7 @@ export type StatePatchV3Body = { const fetchData = async ( req: Express.Request, custom: AnyObject, - uuids: string[], + deviceIds: number[], appReleaseUuids: { [appUuid: string]: { releaseUuids: Set; @@ -97,7 +98,7 @@ const fetchData = async ( options: { $select: ['id', 'uuid'], $filter: { - uuid: { $in: uuids }, + id: { $in: deviceIds }, }, $expand: { belongs_to__application: { @@ -110,7 +111,7 @@ const fetchData = async ( belongs_to__application: Array>; } >; - if (devices.length !== uuids.length) { + if (devices.length !== deviceIds.length) { throw new UnauthorizedError(); } @@ -205,6 +206,9 @@ const fetchData = async ( return { devicesByUuid, images, releasesByAppUuid }; }); +export const resolveDeviceUuids = (body: StatePatchV3Body) => + Object.keys(body).filter((uuid) => body[uuid] != null); + export const statePatchV3: RequestHandler = async (req, res) => { try { const body = req.body as StatePatchV3Body; @@ -215,7 +219,7 @@ export const statePatchV3: RequestHandler = async (req, res) => { custom.ipAddress = getIP(req); } - const uuids = Object.keys(body).filter((uuid) => body[uuid] != null); + const uuids = resolveDeviceUuids(body); if (uuids.length === 0) { throw new BadRequestError(); } @@ -266,13 +270,12 @@ export const statePatchV3: RequestHandler = async (req, res) => { const { apps } = state; - let deviceBody: - | Pick< - StatePatchV3Body[string], - (typeof v3ValidPatchFields)[number] - > & { - is_running__release?: number | null; - } = _.pick(state, v3ValidPatchFields); + let deviceBody: Pick< + StatePatchV3Body[string], + (typeof v3ValidPatchFields)[number] + > & { + is_running__release?: number | null; + } = _.pick(state, v3ValidPatchFields); let metricsBody: Pick< StatePatchV3Body[string], (typeof metricsPatchFields)[number] @@ -287,9 +290,26 @@ export const statePatchV3: RequestHandler = async (req, res) => { metricsBody = {}; } + if (deviceBody.cpu_id != null) { + if (/[^\x20-\x7E]/.test(deviceBody.cpu_id)) { + // if the CPU id is not in the character range of 0x20 (SPACE) to 0x7e (~) we drop the CPU ID + // this cpu id wouldn't be rendered anyway + delete deviceBody.cpu_id; + } else { + deviceBody.cpu_id = deviceBody.cpu_id.toLowerCase(); + } + } + if (apps != null || Object.keys(deviceBody).length > 0) { + const { resolvedDeviceIds } = + req.custom as ResolveDeviceInfoCustomObject; // We lazily fetch the necessary data only if we absolutely must to avoid unnecessary work if it turns out we don't need it - data ??= await fetchData(req, custom, uuids, appReleasesCriteria); + data ??= await fetchData( + req, + custom, + resolvedDeviceIds, + appReleasesCriteria, + ); const { images, releasesByAppUuid } = data; const device = data.devicesByUuid[uuid]; @@ -312,9 +332,6 @@ export const statePatchV3: RequestHandler = async (req, res) => { deviceBody = truncateShortTextFields(deviceBody); // If we're updating anyway then ensure the metrics data is included deviceBody = { ...deviceBody, ...metricsBody }; - if (deviceBody.cpu_id != null) { - deviceBody.cpu_id = deviceBody.cpu_id.toLowerCase(); - } updateFns.push(async (resinApiTx) => { await resinApiTx.patch({ resource: 'device', diff --git a/src/features/device-state/state-get-utils.ts b/src/features/device-state/state-get-utils.ts index 0e5b94f89..0f2f274bd 100644 --- a/src/features/device-state/state-get-utils.ts +++ b/src/features/device-state/state-get-utils.ts @@ -8,6 +8,19 @@ import { createMultiLevelStore, reqPermissionNormalizer, } from '../../infra/cache'; +import type { Device } from '../../balena-model'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface -- This needs to be an interface so that downstream projects can extend it. +export interface GetStateEventStoredDeviceFields + extends Pick {} + +// We do not use "satisfies" or "as const" so that downstream projects can augment this list. +export const getStateEventAdditionalFields: Array< + keyof GetStateEventStoredDeviceFields +> = [ + // TODO: Remove the public_address from this list in the next major since it's not used by oB-api and downstream projects can set it if needed. + 'public_address', +]; const defaultConfigVariableFns: Array<(config: Dictionary) => void> = [ function setMinPollInterval(config) { diff --git a/src/features/device-types/device-types-list.ts b/src/features/device-types/device-types-list.ts index 9197c5337..32ef61e59 100644 --- a/src/features/device-types/device-types-list.ts +++ b/src/features/device-types/device-types-list.ts @@ -14,6 +14,7 @@ import { multiCacheMemoizee } from '../../infra/cache'; import { DEVICE_TYPES_CACHE_LOCAL_TIMEOUT, DEVICE_TYPES_CACHE_TIMEOUT, + CONTRACT_ALLOWLIST, } from '../../lib/config'; export interface DeviceTypeInfo { @@ -58,7 +59,20 @@ const getFirstValidBuild = async ( export const getDeviceTypes = multiCacheMemoizee( async (): Promise> => { const result: Dictionary = {}; - const slugs = await listFolders(IMAGE_STORAGE_PREFIX); + let slugs = await listFolders(IMAGE_STORAGE_PREFIX); + + // If there are explicit includes, then everything else is excluded so we need to + // filter the slugs list to include only contracts that are in the CONTRACT_ALLOWLIST map + if (CONTRACT_ALLOWLIST.size > 0) { + const before = slugs.length; + slugs = slugs.filter((slug) => + CONTRACT_ALLOWLIST.has(`hw.device-type/${slug}`), + ); + console.log( + `CONTRACT_ALLOWLIST reduced device type slugs from ${before} to ${slugs.length}`, + ); + } + await Promise.all( slugs.map(async (slug) => { try { diff --git a/src/features/device-types/hooks/device-types-cache-invalidation.ts b/src/features/device-types/hooks/device-types-cache-invalidation.ts index d3ec7672f..f7e169a48 100644 --- a/src/features/device-types/hooks/device-types-cache-invalidation.ts +++ b/src/features/device-types/hooks/device-types-cache-invalidation.ts @@ -4,7 +4,8 @@ import { getDeviceTypes } from '../device-types-list'; hooks.addPureHook('POST', 'resin', 'application', { POSTRUN: async ({ request }) => { if (request.values.is_host) { - getDeviceTypes.delete(); + // no need to wait for the cache invalidation + void getDeviceTypes.delete(); } }, }); @@ -13,7 +14,8 @@ hooks.addPureHook('PATCH', 'resin', 'application', { POSTRUN: async ({ request }) => { const affectedIds = request.affectedIds!; if (request.values.is_host && affectedIds.length !== 0) { - getDeviceTypes.delete(); + // no need to wait for the cache invalidation + void getDeviceTypes.delete(); } }, }); diff --git a/src/features/devices/models/device-additions.ts b/src/features/devices/models/device-additions.ts index dcda1f8bd..a91a6f708 100644 --- a/src/features/devices/models/device-additions.ts +++ b/src/features/devices/models/device-additions.ts @@ -2,6 +2,7 @@ import type { AbstractSqlModel, AbstractSqlQuery, AndNode, + BooleanTypeNodes, EqualsNode, } from '@balena/abstract-sql-compiler'; @@ -43,17 +44,13 @@ export const addToModel = ( // it'll generate a dummy case (the equivalent of 1 == 2, which is always // false), otherwise it'll generate a case that looks into the actual model // field. - const isInactive: EqualsNode = addShims - ? ['Equals', ['Boolean', true], ['Boolean', false]] - : [ - 'Equals', - ['ReferencedField', 'device', 'is active'], - ['Boolean', false], - ]; + const isInactive: BooleanTypeNodes = addShims + ? ['Boolean', false] + : ['Not', ['ReferencedField', 'device', 'is active']]; const isOverallOffline: AndNode = [ 'And', - ['Equals', ['ReferencedField', 'device', 'is online'], ['Boolean', false]], + ['Not', ['ReferencedField', 'device', 'is online']], [ 'In', ['ReferencedField', 'device', 'api heartbeat state'], @@ -66,7 +63,7 @@ export const addToModel = ( // so it's still provisioning. const isPreProvisioning: AndNode = [ 'And', - ['Equals', ['ReferencedField', 'device', 'is online'], ['Boolean', false]], + ['Not', ['ReferencedField', 'device', 'is online']], ['NotExists', ['ReferencedField', 'device', 'last connectivity event']], [ 'Equals', @@ -99,11 +96,7 @@ export const addToModel = ( ], [ 'And', - [ - 'Equals', - ['ReferencedField', 'device', 'is online'], - ['Boolean', false], - ], + ['Not', ['ReferencedField', 'device', 'is online']], [ 'Equals', ['ReferencedField', 'device', 'status'], @@ -188,11 +181,7 @@ export const addToModel = ( ], [ 'And', - [ - 'Equals', - ['ReferencedField', 'device', 'is online'], - ['Boolean', false], - ], + ['Not', ['ReferencedField', 'device', 'is online']], [ 'Equals', ['ReferencedField', 'device', 'status'], diff --git a/src/features/os-config/index.ts b/src/features/os-config/index.ts index 4885a972b..5a4ef9861 100644 --- a/src/features/os-config/index.ts +++ b/src/features/os-config/index.ts @@ -1,27 +1,45 @@ -import type { Application, RequestHandler } from 'express'; +import type { Application } from 'express'; import { DEVICE_CONFIG_OPENVPN_CA, DEVICE_CONFIG_OPENVPN_CONFIG, DEVICE_CONFIG_SSH_AUTHORIZED_KEYS, + LOGS_HOST, } from '../../lib/config'; import { b64decode } from '../../lib/utils'; -const getOsConfiguration: RequestHandler = (_req, res) => { - res.json({ - services: { - openvpn: { - config: DEVICE_CONFIG_OPENVPN_CONFIG, - ca: b64decode(DEVICE_CONFIG_OPENVPN_CA), - }, - ssh: { - authorized_keys: DEVICE_CONFIG_SSH_AUTHORIZED_KEYS, - }, - }, - schema_version: '1.0.0', - }); +// OS service configurations +const services = { + openvpn: { + config: DEVICE_CONFIG_OPENVPN_CONFIG, + ca: b64decode(DEVICE_CONFIG_OPENVPN_CA), + }, + ssh: { + authorized_keys: DEVICE_CONFIG_SSH_AUTHORIZED_KEYS, + }, +}; + +// Config.json migrations: Changes should be evaluated for security risks before applying. +// +// - A field may not be deleted from config.json. +// - A field with a value of non-null tells os-config that the value will be updated +// to the new value if it's different. +// - A field not found in the whitelist of the os-config schema will be ignored. +const config = { + overrides: { + ...(LOGS_HOST != null && { logsEndpoint: `https://${LOGS_HOST}` }), + }, }; export const setup = (app: Application) => { - app.get('/os/v1/config/', getOsConfiguration); + app.get('/os/v1/config/', (_req, res) => { + res.json({ + services, + // Older os-configs don't know how to handle the config field, but + // luckily serde-rs ignores unknown fields by default. + config, + /** @deprecated schema_version is an outdated field kept for compatibility with legacy os-configs */ + schema_version: '1.0.0', + }); + }); }; diff --git a/src/features/registry/middleware.ts b/src/features/registry/middleware.ts index cdd4fe6ed..d85506dbe 100644 --- a/src/features/registry/middleware.ts +++ b/src/features/registry/middleware.ts @@ -23,6 +23,10 @@ export const basicApiKeyAuthenticate: RequestHandler = async ( req.params.subject = creds.name; req.params.apikey = creds.pass; } + if (req.params.apikey === TOKEN_AUTH_BUILDER_TOKEN) { + next(); + return; + } try { await retrieveAPIKey(req, undefined); @@ -40,7 +44,6 @@ export const basicApiKeyAuthenticate: RequestHandler = async ( if ( (req.apiKey?.permissions == null || req.apiKey.permissions.length === 0) && - req.apiKey?.key !== TOKEN_AUTH_BUILDER_TOKEN && req.user == null ) { if ( diff --git a/src/features/registry/registry.ts b/src/features/registry/registry.ts index a0338d9b9..62c44fe79 100644 --- a/src/features/registry/registry.ts +++ b/src/features/registry/registry.ts @@ -34,7 +34,7 @@ const RESINOS_REPOSITORY = 'resin/resinos'; const SUPERVISOR_REPOSITORIES = /^resin\/(?:[a-zA-Z0-9]+-)+supervisor$/; // match v2/randomhash image -const NEW_REGISTRY_REGEX = /(^(\d+)\/[\d\-]+$|^(v2\/[a-z0-9]+)(-[0-9]+)?)/; +const NEW_REGISTRY_REGEX = /(^(\d+)\/[\d-]+$|^(v2\/[a-z0-9]+)(-[0-9]+)?)/; /* * Group 1: application slug (org/app) @@ -45,7 +45,7 @@ const NEW_REGISTRY_REGEX = /(^(\d+)\/[\d\-]+$|^(v2\/[a-z0-9]+)(-[0-9]+)?)/; * - Group 5: service name */ const APP_RELEASE_REGEX = - /^(([a-z0-9_-]+)\/([a-z0-9_-]+))(?:\/([a-z0-9_\.-]+))?(?:\/([a-z0-9_-]+))?$/; + /^(([a-z0-9_-]+)\/([a-z0-9_-]+))(?:\/([a-z0-9_.-]+))?(?:\/([a-z0-9_-]+))?$/; const TARGET_RELEASE_KEYWORDS = [`latest`, `current`, `default`, `pinned`]; @@ -64,7 +64,7 @@ const TARGET_RELEASE_KEYWORDS = [`latest`, `current`, `default`, `pinned`]; // push // push,pull const SCOPE_PARSE_REGEX = - /^([a-z]+):([a-z0-9_-]+\/[a-z0-9_-]+(?:\/[a-z0-9_\.-]+)?(?:\/[a-z0-9_-]+)?|\d+\/[\d\-]+|v2\/[a-z0-9]+-[0-9]+)(?::[a-z0-9]+|@sha256:[a-f0-9]+)?:((?:push|pull|,)+)$/; + /^([a-z]+):([a-z0-9_-]+\/[a-z0-9_-]+(?:\/[a-z0-9_.-]+)?(?:\/[a-z0-9_-]+)?|\d+\/[\d-]+|v2\/[a-z0-9]+-[0-9]+)(?::[a-z0-9]+|@sha256:[a-f0-9]+)?:((?:push|pull|,)+)$/; export interface Access { name: string; diff --git a/src/features/request-logging/index.ts b/src/features/request-logging/index.ts index 837a163f2..c4f28b650 100644 --- a/src/features/request-logging/index.ts +++ b/src/features/request-logging/index.ts @@ -18,14 +18,17 @@ export const skipLogging: RequestHandler = (req, _res, next) => { // - u/ - user ID; used whenever we can extract a user info about the calls (both for API key and JWT auth); // - s/ - service name; used when an internal balena service is making an API request. const getCallerId = (req: Request) => { - if (req.creds?.service || req.apiKey?.permissions?.includes('service')) { + if ( + (req.creds != null && 'service' in req.creds && req.creds.service) || + req.apiKey?.permissions?.includes('service') + ) { return `s/${getServiceFromRequest(req) || 'unknown'}`; } - if (req.creds) { - if (req.creds.actor) { + if (req.creds != null) { + if ('actor' in req.creds && req.creds.actor) { return `a/${req.creds.actor}`; } - if (req.creds.id) { + if ('id' in req.creds && req.creds.id) { return `u/${req.creds.id}`; } } diff --git a/src/features/vars-schema/env-vars.ts b/src/features/vars-schema/env-vars.ts index d6d417bab..fef48c366 100644 --- a/src/features/vars-schema/env-vars.ts +++ b/src/features/vars-schema/env-vars.ts @@ -133,7 +133,7 @@ export const SUPERVISOR_CONFIG_VAR_PROPERTIES: { 'Define the PNG image to be used for the boot splash screen. Only supported by supervisor versions >= v12.3.0.', maxLength: 13400, // ~10KB base64 encoded image will_reboot: true, - pattern: `^data:image\/png;(?:name=(.*);)?base64,(.*)$`, + pattern: `^data:image/png;(?:name=(.*);)?base64,(.*)$`, }, BALENA_SUPERVISOR_HARDWARE_METRICS: { enum: ['false', 'true'], @@ -159,6 +159,9 @@ export const DEVICE_TYPE_SPECIFIC_CONFIG_VAR_PROPERTIES: Array<{ 'raspberrypi4-64', 'raspberrypi400-64', 'raspberrypicm4-ioboard', + 'raspberrypi5', + 'revpi-connect', + 'revpi-connect-s', 'revpi-core-3', ], properties: { @@ -291,6 +294,7 @@ export const DEVICE_TYPE_SPECIFIC_CONFIG_VAR_PROPERTIES: Array<{ '14.0.16': ['imx8mm-var-som'], '14.2.16': ['jetson-agx-orin-devkit'], '14.10.2': ['jetson-orin-nx-xavier-nx-devkit'], + '14.11.11': ['jetson-orin-nano-devkit-nvme'], }, { RESIN_HOST_EXTLINUX_fdt: { diff --git a/src/features/vars-schema/schema.ts b/src/features/vars-schema/schema.ts index 421f3b653..fac58eb4c 100644 --- a/src/features/vars-schema/schema.ts +++ b/src/features/vars-schema/schema.ts @@ -1,6 +1,6 @@ import type { RequestHandler } from 'express'; import type { JSONSchema6 } from 'json-schema'; - +import { sbvrUtils } from '@balena/pinejs'; import { BLOCKED_NAMES, DEVICE_TYPE_SPECIFIC_CONFIG_VAR_PROPERTIES, @@ -13,19 +13,54 @@ import { ALLOWED_NAMESPACES, } from './env-vars'; +const { api } = sbvrUtils; + // Return config variable constants for use by external components. // A query string parameter of 'deviceType' is accepted, which should // be a device type slug. -export const schema: RequestHandler = (req, res) => { +export const schema: RequestHandler = async (req, res) => { + const deviceTypeSlug = await (async () => { + if (typeof req.query.deviceType !== 'string') { + return; + } + + const resinApi = api.resin.clone({ passthrough: { req } }); + // Ensure that the user has access to the provided device type. + const [dt] = (await resinApi.get({ + resource: 'device_type', + options: { + $top: 1, + $select: 'slug', + $filter: { + device_type_alias: { + $any: { + $alias: 'dta', + $expr: { + dta: { + is_referenced_by__alias: req.query.deviceType, + }, + }, + }, + }, + }, + }, + })) as Array<{ slug: string }>; + + // We do not throw when the DT is not found for backwards compatibility reasons. + return dt?.slug; + })(); + const configVarSchema: JSONSchema6 = { type: 'object', $schema: 'http://json-schema.org/draft-06/schema#', properties: Object.assign( {}, SUPERVISOR_CONFIG_VAR_PROPERTIES, - ...DEVICE_TYPE_SPECIFIC_CONFIG_VAR_PROPERTIES.filter((config) => - config.capableDeviceTypes.includes(req.query.deviceType as string), - ).map((config) => config.properties), + ...(deviceTypeSlug != null + ? DEVICE_TYPE_SPECIFIC_CONFIG_VAR_PROPERTIES.filter((config) => + config.capableDeviceTypes.includes(deviceTypeSlug), + ).map((config) => config.properties) + : []), ), }; diff --git a/src/features/vpn/services.ts b/src/features/vpn/services.ts index 3c60215b7..06b98617a 100644 --- a/src/features/vpn/services.ts +++ b/src/features/vpn/services.ts @@ -137,6 +137,7 @@ export const clientDisconnect = async ( }, body: { is_connected_to_vpn: false, + is_managed_by__service_instance: null, }, }); res.status(200).end(); diff --git a/src/fileupload-handler.ts b/src/fileupload-handler.ts new file mode 100644 index 000000000..dda78416e --- /dev/null +++ b/src/fileupload-handler.ts @@ -0,0 +1,102 @@ +import { webResourceHandler } from '@balena/pinejs'; +import { + CloudFrontHandler, + CloudFrontHandlerProps, +} from '@balena/pinejs-webresource-cloudfront'; +import * as fs from 'fs'; + +import { + WEBRESOURCES_S3_ACCESS_KEY, + WEBRESOURCES_S3_SECRET_KEY, + WEBRESOURCES_S3_REGION, + WEBRESOURCES_S3_HOST, + WEBRESOURCES_S3_BUCKET, + WEBRESOURCES_S3_MAX_FILESIZE, + WEBRESOURCES_CLOUDFRONT_PRIVATEKEY_PATH, + WEBRESOURCES_CLOUDFRONT_PUBLICKEY, + WEBRESOURCES_CLOUDFRONT_HOST, +} from './lib/config'; + +const getEndpointFromHost = (host: string): string => { + return host.startsWith('http') ? host : `https://${host}`; +}; + +const getS3Config = (): webResourceHandler.S3HandlerProps | undefined => { + if ( + WEBRESOURCES_S3_ACCESS_KEY != null && + WEBRESOURCES_S3_SECRET_KEY != null && + WEBRESOURCES_S3_REGION != null && + WEBRESOURCES_S3_HOST != null && + WEBRESOURCES_S3_BUCKET != null + ) { + return { + endpoint: getEndpointFromHost(WEBRESOURCES_S3_HOST), + accessKey: WEBRESOURCES_S3_ACCESS_KEY, + secretKey: WEBRESOURCES_S3_SECRET_KEY, + region: WEBRESOURCES_S3_REGION, + bucket: WEBRESOURCES_S3_BUCKET, + maxSize: WEBRESOURCES_S3_MAX_FILESIZE, + }; + } +}; + +const getCloudfrontConfig = (): CloudFrontHandlerProps | undefined => { + const s3Config = getS3Config(); + if ( + s3Config != null && + WEBRESOURCES_CLOUDFRONT_PRIVATEKEY_PATH != null && + WEBRESOURCES_CLOUDFRONT_PUBLICKEY != null && + WEBRESOURCES_CLOUDFRONT_HOST != null + ) { + let cfSecretKey: string; + try { + cfSecretKey = fs.readFileSync( + WEBRESOURCES_CLOUDFRONT_PRIVATEKEY_PATH, + 'utf-8', + ); + } catch (e) { + console.error('Failed to start cloudfront with error', e); + return; + } + + return { + cfDistributionDomain: getEndpointFromHost(WEBRESOURCES_CLOUDFRONT_HOST), + cfPublicKeyId: WEBRESOURCES_CLOUDFRONT_PUBLICKEY, + cfSecretKey, + ...s3Config, + }; + } +}; + +let handler: webResourceHandler.WebResourceHandler | undefined; +export const getFileUploadHandler = () => { + if (handler == null) { + const cfConfig = getCloudfrontConfig(); + if (cfConfig != null) { + handler = new CloudFrontHandler(cfConfig); + console.log('Successfully initialised webresource CloudFront handler.'); + console.log({ + region: cfConfig.region, + endpoint: cfConfig.endpoint, + bucket: cfConfig.bucket, + cfHost: cfConfig.cfDistributionDomain, + }); + return handler; + } + + const s3Config = getS3Config(); + if (s3Config != null) { + handler = new webResourceHandler.S3Handler(s3Config); + console.log('Successfully initialised webresource S3 handler.'); + console.log({ + region: s3Config.region, + endpoint: s3Config.endpoint, + bucket: s3Config.bucket, + }); + return handler; + } + + console.log('No webresource handler loaded.'); + } + return handler; +}; diff --git a/src/hooks.ts b/src/hooks.ts index ef2012121..2d2c90481 100644 --- a/src/hooks.ts +++ b/src/hooks.ts @@ -4,6 +4,7 @@ import './features/application-types/hooks'; import './features/ci-cd/hooks'; import './features/cascade-delete/hooks'; import './features/devices/hooks'; +import './features/device-provisioning/hooks'; import './features/device-types/hooks'; import './features/device-urls/hooks'; import './features/hostapp/hooks'; diff --git a/src/index.ts b/src/index.ts index b54281331..f11a7c680 100644 --- a/src/index.ts +++ b/src/index.ts @@ -92,7 +92,10 @@ import { import { createScopedAccessToken, createJwt } from './infra/auth/jwt'; import { resolveOrDenyDevicesWithStatus } from './features/device-state/middleware'; import { middleware as authMiddleware } from './infra/auth'; -import { isApiKeyWithRole } from './features/api-keys/lib'; +import { + augmentReqApiKeyPermissions, + isApiKeyWithRole, +} from './features/api-keys/lib'; import { setupDeleteCascade as addDeleteHookForDependents } from './features/cascade-delete/setup-delete-cascade'; import { updateOrInsertModel, @@ -161,6 +164,7 @@ export * as scheduler from './infra/scheduler'; export * as cache from './infra/cache'; export * as config from './lib/config'; export * as abstractSql from './abstract-sql-utils'; +export { getFileUploadHandler } from './fileupload-handler'; export * as deviceState from './features/device-state'; export const errors = { @@ -225,6 +229,7 @@ export const utils = { throttledForEach, }; export const apiKeys = { + augmentReqApiKeyPermissions, isApiKeyWithRole, }; export const application = { @@ -334,6 +339,9 @@ export async function setup(app: Application, options: SetupOptions) { const origin = req.get('Origin') || '*'; res.header('Access-Control-Allow-Origin', origin); res.header('Access-Control-Allow-Credentials', 'true'); + // Indicates the response headers that should be made available to js code running in browsers, + // on top of the default CORS-safelisted ones. + res.header('Access-Control-Expose-Headers', 'Retry-After'); if (req.method !== 'OPTIONS') { // If we're not a preflight request then carry on to the real implementation @@ -393,7 +401,9 @@ export async function setup(app: Application, options: SetupOptions) { return { app, startServer: _.partial(startServer, app), + /** @deprecated */ runCommand: _.partial(runCommand, app), + /** @deprecated */ runFromCommandLine: _.partial(runFromCommandLine, app), }; } @@ -440,8 +450,7 @@ function setupMiddleware(app: Application) { ); app.use(AUTH_PATH, cookieParser()); - const JSON_REGEXP = - /^application\/(([\w!//\$%&\*`\-\.\^~]*\+)?json|csp-report)/i; + const JSON_REGEXP = /^application\/(([\w!//$%&*`\-.^~]*\+)?json|csp-report)/i; const isJson: bodyParser.Options['type'] = (req) => { const contentType = req.headers['content-type']; if (contentType == null) { @@ -473,16 +482,19 @@ async function startServer( return server!; } +// TODO: Drop me in the next major since we atm only have a dummy command async function runCommand( app: Application, cmd: string, argv: string[], ): Promise { + // eslint-disable-next-line @typescript-eslint/no-var-requires const script = require(path.join(__dirname, 'commands', cmd)); await script.execute(app, argv); process.exit(0); } +// TODO: Drop me in the next major since we atm only have a dummy command function runFromCommandLine(app: Application): Promise { const cmd = process.argv[2]; const args = process.argv.slice(3); diff --git a/src/infra/auth/api-keys.ts b/src/infra/auth/api-keys.ts index 19e305297..ec55ead4e 100644 --- a/src/infra/auth/api-keys.ts +++ b/src/infra/auth/api-keys.ts @@ -11,9 +11,13 @@ const getAPIKey = async ( req: hooks.HookReq | Request, tx: Tx | undefined, ): Promise => { - const apiKey = await permissions.resolveApiKey(req, 'apikey', tx); - if (apiKey != null) { - return apiKey; + try { + const apiKey = await permissions.resolveApiKey(req, 'apikey', tx); + if (apiKey != null) { + return apiKey; + } + } catch { + // ignore } // Skip for Pine's request objects that don't support headers @@ -24,8 +28,12 @@ const getAPIKey = async ( // While this could be omitted, Pine will go to the DB in vain if not handled const token = (req.get('Authorization') || '').split(' ', 2)[1]; if (token && !isJWT(token)) { - // Add support for API keys on Authorization header if a JWT wasn't provided - return await permissions.resolveAuthHeader(req, 'Bearer', tx); + try { + // Add support for API keys on Authorization header if a JWT wasn't provided + return await permissions.resolveAuthHeader(req, 'Bearer', tx); + } catch { + // ignore + } } }; diff --git a/src/infra/auth/auth.ts b/src/infra/auth/auth.ts index 8815abf1e..747e15f97 100644 --- a/src/infra/auth/auth.ts +++ b/src/infra/auth/auth.ts @@ -229,7 +229,10 @@ export async function getUser( const [user] = await getUserQuery()({ key }, undefined, { tx }); if (user) { // Store it in `req` to be compatible with JWTs and for caching - req.user = req.creds = _.pick(user, userFields); + req.user = req.creds = { + ..._.pick(user, userFields), + actor: user.actor.__id, + }; } else if (required) { throw new UnauthorizedError('User not found for API key'); } diff --git a/src/infra/auth/jwt-passport.ts b/src/infra/auth/jwt-passport.ts index 9c3f89b25..41c19992e 100644 --- a/src/infra/auth/jwt-passport.ts +++ b/src/infra/auth/jwt-passport.ts @@ -1,7 +1,6 @@ import Bluebird from 'bluebird'; import type { RequestHandler } from 'express'; import jsonwebtoken from 'jsonwebtoken'; -import _ from 'lodash'; import passport from 'passport'; import { ExtractJwt, Strategy as JwtStrategy } from 'passport-jwt'; import { TypedError } from 'typed-error'; @@ -65,9 +64,8 @@ export const createStrategy = ( } if ('service' in jwtUser && jwtUser.service) { const { service, apikey } = jwtUser; - const apiKeyPermissions = await permissions.getApiKeyPermissions( - apikey, - ); + const apiKeyPermissions = + await permissions.getApiKeyPermissions(apikey); return { service, apikey, permissions: apiKeyPermissions }; } else if ( 'access' in jwtUser && @@ -90,7 +88,7 @@ export const createStrategy = ( throw new InvalidJwtSecretError(); } - jwtUser.actor = user.actor; + jwtUser.actor = user.actor.__id; const userPermissions = await permissions.getUserPermissions( jwtUser.id, ); diff --git a/src/infra/auth/permissions.ts b/src/infra/auth/permissions.ts index b9e74cc88..07b0ab575 100644 --- a/src/infra/auth/permissions.ts +++ b/src/infra/auth/permissions.ts @@ -19,7 +19,7 @@ export const getGuestActorId = memoize( if (guest?.actor == null) { throw new Error('Cannot find guest user'); } - return guest?.actor; + return guest.actor.__id; }, { promise: true, diff --git a/src/infra/cache/multi-level-memoizee.ts b/src/infra/cache/multi-level-memoizee.ts index 5f483393f..eca35db71 100644 --- a/src/infra/cache/multi-level-memoizee.ts +++ b/src/infra/cache/multi-level-memoizee.ts @@ -16,42 +16,130 @@ type MultiCacheMemoizeeOpts any> = { max?: MemoizeeOptions['max']; } & Pick, 'preFetch' | 'normalizer'>; -const memoizeeSharedOptionsKeys = ['max', 'maxAge', 'preFetch'] as const; +const memoizeeExtraOptionsKeys = ['max', 'maxAge', 'preFetch'] as const; -type MultiCacheMemoizeeSharedOpts any> = Pick< - Exclude, 'max'>, - (typeof memoizeeSharedOptionsKeys)[number] +type AnyFunction = (...args: any[]) => any; + +type SharedMultiCacheMemoizeeExtraOpts = Exclude< + Partial>, + 'max' +>; + +type MultiCacheMemoizeeExtraOpts = Pick< + MultiCacheMemoizeeOpts, + (typeof memoizeeExtraOptionsKeys)[number] >; +const checkUnsupportedExtraCacheKeys = ( + opts: Partial> | undefined, + cacheType: string, +) => { + if (opts == null) { + return; + } + const remainingKeys = _.without( + Object.keys(opts), + ...memoizeeExtraOptionsKeys, + ); + if (remainingKeys != null && remainingKeys.length > 0) { + throw new Error(`Unsupported ${cacheType} cache options: ${remainingKeys}`); + } +}; + export interface MemoizedFn Promise> { (...args: Parameters): Promise>; delete: (...args: Parameters) => Promise; } +// TODO: Move these to common-types.ts once we make them part of the build output. +// This makes TS emit a union of `Record` for each `keyof T`. +type ToSinglePropUnions = { [K in keyof T]: Record }[keyof T]; +// Requires at least one of the properties of T to be defined aka NonEmptyPartial. +type AtLeastOneProp = Partial & ToSinglePropUnions; + +// The AtLeastOneProp makes the empty object only assignable to SharedMultiCacheMemoizeeExtraOpts so that +// we can use use `'local'|'global' in opts` to discriminate which of the two types of the union we have on hand. +type ExtraCacheOptsByType = AtLeastOneProp<{ + local: Partial> | false; + global: SharedMultiCacheMemoizeeExtraOpts; +}>; + +type ExtraCacheOpts = + | ExtraCacheOptsByType + // TODO: Drop SharedMultiCacheMemoizeeExtraOpts from the union in the next major and switch AtLeastOneProp to a plain Partial + /** + * @deprecated + */ + | SharedMultiCacheMemoizeeExtraOpts; + /** * A multi layer cache compatible with a subset of memoizee options * Note: `undefined`/`null` can only be locally cached so avoid if possible + * + * @example + * multiCacheMemoizee('test', { + * maxAge: 24 * HOURS, + * }, { + * local: false, // Disable the local cache + * }); + * + * @example + * multiCacheMemoizee('test', { + * maxAge: 1 * HOURS, + * }, { + * global: { + * maxAge: 24 * HOURS, // override the shared cache (redis) ttl + * } + * }); + * + * @example + * // deprecated extraCacheOpts notation + * multiCacheMemoizee('test', { + * maxAge: 1 * HOURS, + * }, { + * maxAge: 24 * HOURS, // override the shared cache (redis) ttl + * }); + */ +export function multiCacheMemoizee< + T extends (...args: any[]) => Promise, +>( + fn: T, + opts: types.RequiredField, 'undefinedAs'>, + extraCacheOpts?: ExtraCacheOptsByType, +): MemoizedFn; +export function multiCacheMemoizee< + T extends (...args: any[]) => Promise, +>( + fn: T, + opts: MultiCacheMemoizeeOpts, + extraCacheOpts?: ExtraCacheOptsByType, +): MemoizedFn; +/** + * @deprecated */ export function multiCacheMemoizee< T extends (...args: any[]) => Promise, >( fn: T, opts: types.RequiredField, 'undefinedAs'>, - sharedCacheOpts?: Partial>, + extraCacheOpts?: SharedMultiCacheMemoizeeExtraOpts, ): MemoizedFn; +/** + * @deprecated + */ export function multiCacheMemoizee< T extends (...args: any[]) => Promise, >( fn: T, opts: MultiCacheMemoizeeOpts, - sharedCacheOpts?: Partial>, + extraCacheOpts?: SharedMultiCacheMemoizeeExtraOpts, ): MemoizedFn; export function multiCacheMemoizee< T extends (...args: any[]) => Promise, >( fn: T, opts: MultiCacheMemoizeeOpts, - sharedCacheOpts?: Partial>, + extraCacheOpts?: ExtraCacheOpts, ): MemoizedFn { const { cacheKey = fn.name, @@ -68,13 +156,22 @@ export function multiCacheMemoizee< if (remainingKeys.length > 0) { throw new Error(`Unsupported options: ${remainingKeys}`); } - const remainingSharedCacheKeys = - sharedCacheOpts != null - ? _.without(Object.keys(sharedCacheOpts), ...memoizeeSharedOptionsKeys) - : null; - if (remainingSharedCacheKeys != null && remainingSharedCacheKeys.length > 0) { - throw new Error(`Unsupported shared cache options: ${remainingKeys}`); + + if ( + extraCacheOpts != null && + !('local' in extraCacheOpts) && + !('global' in extraCacheOpts) + ) { + extraCacheOpts = { + global: extraCacheOpts, + }; } + + if (extraCacheOpts?.local !== false) { + checkUnsupportedExtraCacheKeys(extraCacheOpts?.local, 'local'); + } + checkUnsupportedExtraCacheKeys(extraCacheOpts?.global, 'shared'); + if (promise !== true) { throw new Error('Only promise mode memoization is supported'); } @@ -105,7 +202,11 @@ export function multiCacheMemoizee< const multiCacheOpts: Parameters[1] = { default: { ...convertToMultiStoreOpts(opts), isCacheableValue: () => true }, - global: convertToMultiStoreOpts({ ...opts, ...sharedCacheOpts }), + local: + extraCacheOpts?.local === false + ? false + : convertToMultiStoreOpts({ ...opts, ...extraCacheOpts?.local }), + global: convertToMultiStoreOpts({ ...opts, ...extraCacheOpts?.global }), }; return multiCache(fn, cacheKey, normalizer, multiCacheOpts, undefinedAs); diff --git a/src/infra/cache/multi-level-store.ts b/src/infra/cache/multi-level-store.ts index b957655b8..4d167c45a 100644 --- a/src/infra/cache/multi-level-store.ts +++ b/src/infra/cache/multi-level-store.ts @@ -1,4 +1,3 @@ -import _ from 'lodash'; import cacheManager from 'cache-manager'; import redisStore from 'cache-manager-ioredis'; import { version } from '../../lib/config'; @@ -34,7 +33,7 @@ export function createMultiLevelStore( get: (key: string) => Promise; set: (key: string, value: T) => Promise; delete: (key: string) => Promise; - wrap: (key: string, fn: () => T) => Promise; + wrap: (key: string, fn: () => T | Promise) => Promise; } { if (usedCacheKeys[cacheKey] === true) { throw new Error(`Cache key '${cacheKey}' has already been taken`); diff --git a/src/infra/haiku-name/index.ts b/src/infra/haiku-name/index.ts index 837ed3f0f..6d091330a 100644 --- a/src/infra/haiku-name/index.ts +++ b/src/infra/haiku-name/index.ts @@ -258,6 +258,5 @@ const bigNumber = Math.pow(2, 12); export const generate = () => { const adjRnd = Math.floor(Math.random() * bigNumber); const nounRnd = Math.floor(Math.random() * bigNumber); - // tslint:disable-next-line:no-bitwise return `${adjs[adjRnd % adjsCount]}-${nouns[nounRnd % nounsCount]}`; }; diff --git a/src/infra/rate-limiting/index.ts b/src/infra/rate-limiting/index.ts index 2f7879e47..0d05924d2 100644 --- a/src/infra/rate-limiting/index.ts +++ b/src/infra/rate-limiting/index.ts @@ -66,7 +66,7 @@ export const createRateLimiter = ( if (e instanceof RateLimiterRes) { const headers: { [header: string]: string } = {}; if (e.msBeforeNext) { - headers['Retry-After'] = `${Math.round(e.msBeforeNext / 1000)}`; + headers['Retry-After'] = `${Math.ceil(e.msBeforeNext / 1000)}`; } throw new TooManyRequestsError( 'Too Many Requests', diff --git a/src/infra/redis/config.ts b/src/infra/redis/config.ts index e35e65a83..1360f7b1e 100644 --- a/src/infra/redis/config.ts +++ b/src/infra/redis/config.ts @@ -1,5 +1,5 @@ import _ from 'lodash'; -import * as Redis from 'ioredis'; +import type * as Redis from 'ioredis'; import { REDIS } from '../../lib/config'; /* @@ -41,11 +41,13 @@ export const getRedisOptions = ({ enableOfflineQueue: false, scaleReads: 'slave', redisOptions, + ...r.auth, }, }; } else { return { ...(readOnly ? r.roHost : r.host), + ...(readOnly ? r.roAuth : r.auth), ...redisOptions, }; } diff --git a/src/infra/scheduler/index.ts b/src/infra/scheduler/index.ts index 8d35e2f2d..ec35b87ad 100644 --- a/src/infra/scheduler/index.ts +++ b/src/infra/scheduler/index.ts @@ -18,7 +18,6 @@ */ import { sbvrUtils, permissions } from '@balena/pinejs'; -import _ from 'lodash'; import schedule from 'node-schedule'; import Redlock from 'redlock'; import type { ScheduledJobRun } from '../../balena-model'; @@ -47,7 +46,7 @@ const JOB_INFO_PREFIX = 'api:jobs:info:'; const JOB_DEFAULT_TTL = 5000; declare module 'ioredis' { - interface RedisCommander { + interface RedisCommander { // This overload exists specifically to retain compatibility to `redlock` eval( args: Array, @@ -171,7 +170,7 @@ export const scheduleJob = ( await updateJobInfoExecute(jobInfoKey, job); } finally { try { - lock.unlock(); + await lock.unlock(); } catch (err) { console.error(`[Scheduler] Failed to unlock job: ${jobId}`, err); captureException(err); diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 89d32fa66..f5970e3c9 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -72,6 +72,7 @@ export const ROLES: { 'resin.service_label.all', 'resin.user.read', `resin.user__has__public_key.all?${matchesUser}`, + 'resin.release_asset.all', ], }; diff --git a/src/lib/config.ts b/src/lib/config.ts index 9f0316126..6359c61a0 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -82,6 +82,23 @@ export const AUTH_RESINOS_REGISTRY_CODE = optionalVar( 'AUTH_RESINOS_REGISTRY_CODE', ); export const COOKIE_SESSION_SECRET = requiredVar('COOKIE_SESSION_SECRET'); + +/** + * null: include all device type and device contract slugs + * "x;y;z": include only the specified device type and contract slugs - note that you MUST list + * all dependent slugs as well so for hw.device-type/asus-tinker-board-s you would need: + * `arch.sw/armv7hf;hw.device-manufacturer/asus;hw.device-family/tinkerboard;hw.device-type/asus-tinker-board-s` + * For something like hw.device-type/iot-gate-imx8 you would need: + * `arch.sw/aarch64;hw.device-type/iot-gate-imx8` + * (the order of the slugs in this variable does not matter) + */ +export const CONTRACT_ALLOWLIST = new Set( + optionalVar('CONTRACT_ALLOWLIST', '') + .split(';') + .map((slug) => slug.trim()) + .filter((slug) => slug.length > 0), +); + export const CONTRACTS_PUBLIC_REPO_OWNER = optionalVar( 'CONTRACTS_PUBLIC_REPO_OWNER', 'balena-io', @@ -148,44 +165,58 @@ export const RATE_LIMIT_MEMORY_BACKEND = optionalVar( 'RATE_LIMIT_MEMORY_BACKEND', ); +type RedisAuth = { + username?: string; + password?: string; +}; + type RedisOpts = | { isCluster: true; hosts: HostPort[]; + auth: RedisAuth; } | { isCluster: false; host: HostPort; + auth: RedisAuth; roHost: HostPort; + roAuth: RedisAuth; }; function redisOpts(prefix: string): RedisOpts; function redisOpts( prefix: string, defaultHosts: HostPort[], + defaultAuth: RedisAuth, defaultIsCluster: boolean, ): RedisOpts; function redisOpts( prefix: string, defaultHosts?: HostPort[], + defaultAuth?: RedisAuth, defaultIsCluster?: boolean, ): RedisOpts { const hostVarName = `${prefix}_HOST`; + const authVarName = `${prefix}_AUTH`; const roHostVarName = `${prefix}_RO_HOST`; + const roAuthVarName = `${prefix}_RO_AUTH`; const isCluster = boolVar(`${prefix}_IS_CLUSTER`, defaultIsCluster); const hosts = hostPortsVar(hostVarName, defaultHosts); + const auth = redisAuthVar(authVarName, defaultAuth); if (isCluster == null) { throw new Error(`Missing env: '${prefix}_IS_CLUSTER'`); } if (isCluster) { - const roHost = process.env[roHostVarName]; - if (roHost != null && roHost !== '') { - throw new Error( - `'${prefix}_RO_HOST' must be empty when in cluster mode `, - ); + const varsIncompatibleWithClusterMode = [roHostVarName, roAuthVarName]; + for (const varName of varsIncompatibleWithClusterMode) { + if (optionalVar(varName) != null) { + throw new Error(`'${varName}' must be empty when in cluster mode `); + } } return { isCluster, hosts, + auth, }; } if (hosts.length > 1) { @@ -197,10 +228,13 @@ function redisOpts( if (roHosts.length > 1) { throw new Error(`'${roHostVarName}' must contain at most one entry`); } + const roAuth = redisAuthVar(roAuthVarName, auth); return { isCluster, host: hosts[0], + auth, roHost: roHosts[0], + roAuth, }; } const generalRedis = redisOpts('REDIS'); @@ -214,7 +248,12 @@ if (generalRedis.isCluster) { export const REDIS = { general: generalRedis, - logs: redisOpts('REDIS_LOGS', [generalRedis.host], generalRedis.isCluster), + logs: redisOpts( + 'REDIS_LOGS', + [generalRedis.host], + generalRedis.auth, + generalRedis.isCluster, + ), }; export const REDIS_LOGS_SHARDED_PUBSUB = boolVar( 'REDIS_LOGS_SHARDED_PUBSUB', @@ -318,6 +357,10 @@ export const BUILD_COMPRESSED_SIZE_CACHE_TIMEOUT = intVar( 'BUILD_COMPRESSED_SIZE_CACHE_TIMEOUT', 20 * MINUTES, ); +export const API_KEY_EXISTS_CACHE_TIMEOUT = intVar( + 'API_KEY_EXISTS_CACHE_TIMEOUT', + 5 * MINUTES, +); export const DEVICE_EXISTS_CACHE_TIMEOUT = intVar( 'DEVICE_EXISTS_CACHE_TIMEOUT', 5 * MINUTES, @@ -372,9 +415,9 @@ if (typeof trustProxy === 'string') { // Support comma-separated IPs const trustProxyIPs = trustProxy.split(/ *, */); - // tslint:disable-next-line:no-var-requires + // eslint-disable-next-line @typescript-eslint/no-var-requires const proxyAddr = require('proxy-addr') as typeof import('proxy-addr'); - // tslint:disable-next-line:no-var-requires + // eslint-disable-next-line @typescript-eslint/no-var-requires const memoizee = require('memoizee') as typeof import('memoizee'); trustProxyValue = memoizee(proxyAddr.compile(trustProxyIPs), { primitive: true, @@ -389,3 +432,62 @@ export const IGNORE_FROZEN_DEVICE_PERMISSIONS = boolVar( 'IGNORE_FROZEN_DEVICE_PERMISSIONS', false, ); + +export const WEBRESOURCES_S3_HOST = optionalVar('WEBRESOURCES_S3_HOST'); +export const WEBRESOURCES_S3_REGION = optionalVar('WEBRESOURCES_S3_REGION'); +export const WEBRESOURCES_S3_ACCESS_KEY = optionalVar( + 'WEBRESOURCES_S3_ACCESS_KEY', +); +export const WEBRESOURCES_S3_SECRET_KEY = optionalVar( + 'WEBRESOURCES_S3_SECRET_KEY', +); +export const WEBRESOURCES_S3_BUCKET = optionalVar('WEBRESOURCES_S3_BUCKET'); +export const WEBRESOURCES_S3_MAX_FILESIZE = intVar( + 'WEBRESOURCES_S3_MAX_FILESIZE', + 500000000, +); +export const WEBRESOURCES_CLOUDFRONT_PRIVATEKEY_PATH = optionalVar( + 'WEBRESOURCES_CLOUDFRONT_PRIVATEKEY_PATH', +); +export const WEBRESOURCES_CLOUDFRONT_PUBLICKEY = optionalVar( + 'WEBRESOURCES_CLOUDFRONT_PUBLICKEY', +); +export const WEBRESOURCES_CLOUDFRONT_HOST = optionalVar( + 'WEBRESOURCES_CLOUDFRONT_HOST', +); + +/** + * Splits an env var in the format of `${username}:${password}` + * into a RedisAuth object. Auth is optional, so this can return + * an empty RedisAuth object. + */ +function redisAuthVar( + varName: string | string[], + defaultAuth?: RedisAuth, +): RedisAuth { + const authPair = optionalVar(varName); + if (authPair == null) { + if (defaultAuth == null) { + return {}; + } + return defaultAuth; + } + + // Valid auth is of the form `${username}:${password}`, `${password}`, `:${password}`, or `${username}:` + const parts = authPair.trim().split(':'); + switch (parts.length) { + case 1: + return { + password: parts[0], + }; + case 2: + return { + username: parts[0], + password: parts[1], + }; + } + + throw new Error( + `'${varName}' must be in one of the following forms 'username:password', 'password', ':password', or 'username:'`, + ); +} diff --git a/src/migrations/00082-pinejs-15.sql b/src/migrations/00082-pinejs-15.sql new file mode 100644 index 000000000..1a6ea8d69 --- /dev/null +++ b/src/migrations/00082-pinejs-15.sql @@ -0,0 +1,69 @@ +-- Boolean type conversions + +ALTER TABLE "application type" +ALTER COLUMN "supports web url" DROP DEFAULT, +ALTER COLUMN "supports multicontainer" DROP DEFAULT, +ALTER COLUMN "supports gateway mode" DROP DEFAULT, +ALTER COLUMN "requires payment" DROP DEFAULT, +ALTER COLUMN "is legacy" DROP DEFAULT, +ALTER COLUMN "supports web url" SET DATA TYPE BOOLEAN USING "supports web url"::BOOLEAN, +ALTER COLUMN "supports multicontainer" SET DATA TYPE BOOLEAN USING "supports multicontainer"::BOOLEAN, +ALTER COLUMN "supports gateway mode" SET DATA TYPE BOOLEAN USING "supports gateway mode"::BOOLEAN, +ALTER COLUMN "requires payment" SET DATA TYPE BOOLEAN USING "requires payment"::BOOLEAN, +ALTER COLUMN "is legacy" SET DATA TYPE BOOLEAN USING "is legacy"::BOOLEAN, +ALTER COLUMN "supports web url" SET DEFAULT FALSE, +ALTER COLUMN "supports multicontainer" SET DEFAULT FALSE, +ALTER COLUMN "supports gateway mode" SET DEFAULT FALSE, +ALTER COLUMN "requires payment" SET DEFAULT FALSE, +ALTER COLUMN "is legacy" SET DEFAULT FALSE; + +ALTER TABLE "application" +ALTER COLUMN "should track latest release" DROP DEFAULT, +ALTER COLUMN "is host" DROP DEFAULT, +ALTER COLUMN "is archived" DROP DEFAULT, +ALTER COLUMN "is public" DROP DEFAULT, +ALTER COLUMN "should track latest release" SET DATA TYPE BOOLEAN USING "should track latest release"::BOOLEAN, +ALTER COLUMN "is host" SET DATA TYPE BOOLEAN USING "is host"::BOOLEAN, +ALTER COLUMN "is archived" SET DATA TYPE BOOLEAN USING "is archived"::BOOLEAN, +ALTER COLUMN "is public" SET DATA TYPE BOOLEAN USING "is public"::BOOLEAN, +ALTER COLUMN "should track latest release" SET DEFAULT FALSE, +ALTER COLUMN "is host" SET DEFAULT FALSE, +ALTER COLUMN "is archived" SET DEFAULT FALSE, +ALTER COLUMN "is public" SET DEFAULT FALSE; + +ALTER TABLE "device" +ALTER COLUMN "is online" DROP DEFAULT, +ALTER COLUMN "is connected to vpn" DROP DEFAULT, +ALTER COLUMN "is undervolted" DROP DEFAULT, +ALTER COLUMN "is online" SET DATA TYPE BOOLEAN USING "is online"::BOOLEAN, +ALTER COLUMN "is connected to vpn" SET DATA TYPE BOOLEAN USING "is connected to vpn"::BOOLEAN, +ALTER COLUMN "is undervolted" SET DATA TYPE BOOLEAN USING "is undervolted"::BOOLEAN, +ALTER COLUMN "is online" SET DEFAULT FALSE, +ALTER COLUMN "is connected to vpn" SET DEFAULT FALSE, +ALTER COLUMN "is undervolted" SET DEFAULT FALSE; + +ALTER TABLE "release" +DROP CONSTRAINT IF EXISTS "release$4VHBqaOH1cZHOsRGD2NvfC+SbBdzlb1ZY/X5Nf4LYrk=", +ALTER COLUMN "is invalidated" DROP DEFAULT, +ALTER COLUMN "is passing tests" DROP DEFAULT, +ALTER COLUMN "is invalidated" SET DATA TYPE BOOLEAN USING "is invalidated"::BOOLEAN, +ALTER COLUMN "is passing tests" SET DATA TYPE BOOLEAN USING "is passing tests"::BOOLEAN, +ALTER COLUMN "is invalidated" SET DEFAULT FALSE, +ALTER COLUMN "is passing tests" SET DEFAULT TRUE, +ADD CONSTRAINT "release$4VHBqaOH1cZHOsRGD2NvfC+SbBdzlb1ZY/X5Nf4LYrk=" CHECK (NOT ( + "invalidation reason" IS NOT NULL + AND "is invalidated" != TRUE +)); + + +-- JSON type conversions + +ALTER TABLE "device type" +ALTER COLUMN "contract" SET DATA TYPE JSONB USING "contract"::JSONB; + +ALTER TABLE "image" +ALTER COLUMN "contract" SET DATA TYPE JSONB USING "contract"::JSONB; + +ALTER TABLE "release" +ALTER COLUMN "composition" SET DATA TYPE JSONB USING "composition"::JSONB, +ALTER COLUMN "contract" SET DATA TYPE JSONB USING "contract"::JSONB; diff --git a/src/migrations/00083-drop-vpn-address.sql b/src/migrations/00083-drop-vpn-address.sql new file mode 100644 index 000000000..5d5a83128 --- /dev/null +++ b/src/migrations/00083-drop-vpn-address.sql @@ -0,0 +1,2 @@ +ALTER TABLE "device" +DROP COLUMN IF EXISTS "vpn address"; diff --git a/src/migrations/00084-create-release-asset.sql b/src/migrations/00084-create-release-asset.sql new file mode 100644 index 000000000..e2f17972a --- /dev/null +++ b/src/migrations/00084-create-release-asset.sql @@ -0,0 +1,32 @@ +CREATE TABLE IF NOT EXISTS "release asset" ( + "created at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL +, "modified at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL +, "release" INTEGER NOT NULL +, "asset key" VARCHAR(255) NOT NULL +, "id" SERIAL NOT NULL PRIMARY KEY +, "asset" JSONB NOT NULL +, FOREIGN KEY ("release") REFERENCES "release" ("id") +, UNIQUE("release", "asset key") +, -- It is necessary that each release asset has an asset key that has a Length (Type) that is greater than 0. +CONSTRAINT "release asset$p9L6VYTv4TOtRNnzupzjcGioRwtUZeiq0c2vYbePKko=" CHECK (0 < LENGTH("asset key") +AND LENGTH("asset key") IS NOT NULL +AND "asset key" = "asset key" +AND "asset key" IS NOT NULL) +); + +DO +$$ +BEGIN +IF NOT EXISTS( + SELECT 1 + FROM "information_schema"."triggers" + WHERE "event_object_table" = 'release asset' + AND "trigger_name" = 'release asset_trigger_update_modified_at' +) THEN + CREATE TRIGGER "release asset_trigger_update_modified_at" + BEFORE UPDATE ON "release asset" + FOR EACH ROW + EXECUTE PROCEDURE "trigger_update_modified_at"(); +END IF; +END; +$$ diff --git a/test/01_basic.ts b/test/01_basic.ts index 789a75f67..bff12e9d9 100644 --- a/test/01_basic.ts +++ b/test/01_basic.ts @@ -109,6 +109,14 @@ describe('Basic', () => { checkBaseVarsResult(vars); }); + it(`should return the base vars when device type is not found`, async () => { + const { body: vars } = await supertest() + .get(`/config/vars?deviceType=wrong-device-type`) + .expect(200); + + checkBaseVarsResult(vars); + }); + [ { deviceType: 'beaglebone-black' }, { diff --git a/test/02_device-types.ts b/test/02_device-types.ts index 5c8105768..de2940878 100644 --- a/test/02_device-types.ts +++ b/test/02_device-types.ts @@ -90,7 +90,7 @@ describe('device type resource', () => { expect(deviceType).to.have.property('name').that.is.a('string'); }); - expect(res.body.d).to.have.property('length', 14); + expect(res.body.d).to.have.property('length', 16); }); }); @@ -217,7 +217,7 @@ describe('device type endpoints', () => { it('should return a proper result', async () => { const res = await supertest().get('/device-types/v1').expect(200); expect(res.body).to.be.an('array'); - expect(res.body).to.have.property('length', 15); + expect(res.body).to.have.property('length', 17); const rpi3config = _.find(res.body, { slug: 'raspberrypi3' }); expect(rpi3config).to.be.an('object'); expect(rpi3config).to.have.property('buildId', '2.19.0+rev1.prod'); diff --git a/test/03_device-state.ts b/test/03_device-state.ts index b2878c7ed..0982ef9da 100644 --- a/test/03_device-state.ts +++ b/test/03_device-state.ts @@ -780,6 +780,49 @@ mockery.registerMock('../src/lib/config', configMock); await expectResourceToMatch(pineUser, 'device', device.id, expectedData); }); + it('should not save an invalid CPU ID', async () => { + const devicePatchBodyCorrect = { + [stateKey]: { + name: 'correctCPUID', + cpu_id: '\x20\x7e', + }, + }; + + await fakeDevice.patchState( + device, + device.uuid, + devicePatchBodyCorrect, + stateVersion, + ); + + const devicePatchBodyInvalid = { + [stateKey]: { + name: 'invalidCPUID', + cpu_id: '\x19\x80', + }, + }; + + await fakeDevice.patchState( + device, + device.uuid, + devicePatchBodyInvalid, + stateVersion, + ); + + devicePatchBodyInvalid[stateKey].cpu_id = '\x20\x7e'; + const expectedData = + stateVersion === 'v2' + ? _.mapKeys(devicePatchBodyInvalid[stateKey], (_v, key) => + key === 'name' ? 'device_name' : key, + ) + : _.pickBy( + devicePatchBodyInvalid[stateKey], + (_v, key) => key !== 'name', + ); + + await expectResourceToMatch(pineUser, 'device', device.id, expectedData); + }); + it('should accept addresses longer than 255 chars and truncate at space delimiters', async () => { const generateValidAddress = ( addr: string, @@ -787,12 +830,11 @@ mockery.registerMock('../src/lib/config', configMock); delimiter: string = '', ): string => { let validAddress = ''; - while (true) { - if (validAddress.length + addr.length + delimiter.length > truncLen) { - break; - } else { - validAddress += addr + delimiter; - } + while ( + validAddress.length + addr.length + delimiter.length <= + truncLen + ) { + validAddress += addr + delimiter; } return validAddress.trim(); }; diff --git a/test/04_session.ts b/test/04_session.ts index 0379a3c7e..b54ddd849 100644 --- a/test/04_session.ts +++ b/test/04_session.ts @@ -5,16 +5,47 @@ import { createScopedAccessToken } from '../src/infra/auth/jwt'; import * as fixtures from './test-lib/fixtures'; import { supertest, UserObjectParam } from './test-lib/supertest'; import { version } from './test-lib/versions'; +import { Device } from './test-lib/fake-device'; +import { Application } from '../src/balena-model'; const atob = (x: string) => Buffer.from(x, 'base64').toString('binary'); const parseJwt = (t: string) => JSON.parse(atob(t.split('.')[1])); describe('session', () => { let admin: UserObjectParam; + let device: Device; + let application: Application; + let deviceApiKey: string; + let provisioningKey: string; + let userApiKey: string; before(async function () { - const fx = await fixtures.load(); + const fx = await fixtures.load('04-session'); + this.loadedFixtures = fx; admin = fx.users.admin; + device = fx.devices.device1; + application = fx.applications.app1; + + const { body: deviceKeyBody } = await supertest(admin).post( + `/api-key/device/${device.id}/device-key`, + ); + deviceApiKey = deviceKeyBody; + + const { body: appKeyBody } = await supertest(admin).post( + `/api-key/application/${application.id}/provisioning`, + ); + provisioningKey = appKeyBody; + + const { body: userKeyBody } = await supertest(admin) + .post('/api-key/user/full') + .send({ name: 'actorwhoamitest' }); + + userApiKey = userKeyBody; + }); + + after(async function () { + await supertest(admin).delete(`/${version}/api_key`).expect(200); + await fixtures.clean(this.loadedFixtures); }); it('/user/v1/whoami returns a user', async function () { @@ -35,7 +66,7 @@ describe('session', () => { // Create a token that only has access to the granting users document const accessToken = createScopedAccessToken({ - actor: record.actor, + actor: record.actor.__id, permissions: ['resin.user.read?actor eq @__ACTOR_ID'], expiresIn: 60 * 10, }); @@ -60,7 +91,7 @@ describe('session', () => { // Create a token that only has access to the granting users applications const accessToken = createScopedAccessToken({ - actor: record.actor, + actor: record.actor.__id, permissions, expiresIn: 60 * 10, }); @@ -91,7 +122,6 @@ describe('session', () => { }); it('should refresh & update the authTime with a POST to /user/v1/refresh-token using a correct password', async function () { - let initialAuthTime: number; const res = await supertest(token) .get('/user/v1/refresh-token') .expect(200); @@ -105,7 +135,7 @@ describe('session', () => { expect(payload).to.have.property('username'); expect(payload).to.have.property('email'); expect(payload).to.have.property('authTime'); - initialAuthTime = payload.authTime; + const initialAuthTime: number = payload.authTime; const res1 = await supertest(token) .post('/user/v1/refresh-token') @@ -126,7 +156,6 @@ describe('session', () => { }); it('should not update the authTime with a POST to /user/v1/refresh-token w/o a password', async function () { - let initialAuthTime: number; const res = await supertest(token) .get('/user/v1/refresh-token') .expect(200); @@ -139,7 +168,7 @@ describe('session', () => { expect(payload).to.have.property('username'); expect(payload).to.have.property('email'); expect(payload).to.have.property('authTime'); - initialAuthTime = payload.authTime; + const initialAuthTime: number = payload.authTime; const res1 = await supertest(token) .post('/user/v1/refresh-token') @@ -164,4 +193,94 @@ describe('session', () => { .expect(401); }); }); + + it('/actor/v1/whoami returns an actor for an user token', async function () { + const userActor = ( + await supertest(admin).get('/actor/v1/whoami').expect(200) + ).body; + + expect(userActor).to.have.property('id').that.is.a('number'); + expect(userActor.actorType).to.equal('user'); + expect(userActor.actorTypeId).to.equal(admin.id); + expect(userActor.username).to.equal('admin'); + expect(userActor.email).to.equal(SUPERUSER_EMAIL); + }); + + it('/actor/v1/whoami returns an actor for an user api key', async function () { + const userActor = ( + await supertest(userApiKey).get('/actor/v1/whoami').expect(200) + ).body; + + expect(userActor).to.have.property('id').that.is.a('number'); + expect(userActor.actorType).to.equal('user'); + expect(userActor.actorTypeId).to.equal(admin.id); + expect(userActor.username).to.equal('admin'); + expect(userActor.email).to.equal(SUPERUSER_EMAIL); + }); + + it('/actor/v1/whoami returns an actor for a device api key', async function () { + const deviceActor = ( + await supertest(deviceApiKey).get('/actor/v1/whoami').expect(200) + ).body; + + expect(deviceActor).to.have.property('id').that.is.a('number'); + expect(deviceActor.actorType).to.equal('device'); + expect(deviceActor.actorTypeId).to.equal(device.id); + expect(deviceActor.uuid).to.equal(device.uuid); + }); + + it('/actor/v1/whoami returns an actor for an application api key', async function () { + const appActor = ( + await supertest(provisioningKey).get('/actor/v1/whoami').expect(200) + ).body; + + expect(appActor).to.have.property('id').that.is.a('number'); + expect(appActor.actorType).to.equal('application'); + expect(appActor.actorTypeId).to.equal(application.id); + expect(appActor.slug).to.equal(application.slug); + }); + + it('/actor/v1/whoami returns a user when using a correctly scoped access token', async function () { + const record = ( + await supertest(admin) + .get(`/${version}/user?$filter=username eq 'admin'`) + .expect(200) + ).body.d[0]; + + // Create a token that only has access to the granting users document + const accessToken = createScopedAccessToken({ + actor: record.actor.__id, + permissions: ['resin.user.read?actor eq @__ACTOR_ID'], + expiresIn: 60 * 10, + }); + + const userActor = ( + await supertest(accessToken).get('/actor/v1/whoami').expect(200) + ).body; + + expect(userActor).to.have.property('id').that.is.a('number'); + expect(userActor.actorType).to.equal('user'); + expect(userActor.actorTypeId).to.equal(admin.id); + expect(userActor.username).to.equal('admin'); + expect(userActor.email).to.equal(SUPERUSER_EMAIL); + }); + + it('/actor/v1/whoami returns a 401 error when using a scoped access token that does not have user permissions', async function () { + const record = ( + await supertest(admin) + .get(`/${version}/user?$filter=username eq 'admin'`) + .expect(200) + ).body.d[0]; + + const permissions = ['resin.application.read?actor eq @__ACTOR_ID']; + + // Create a token that only has access to the granting users applications + const accessToken = createScopedAccessToken({ + actor: record.actor.__id, + permissions, + expiresIn: 60 * 10, + }); + + await supertest(accessToken).get('/actor/v1/whoami').expect(401); + }); }); diff --git a/test/05_device-config.ts b/test/05_device-config.ts index 34c1ef171..fffb1d011 100644 --- a/test/05_device-config.ts +++ b/test/05_device-config.ts @@ -104,7 +104,7 @@ describe('generate device config', function () { .expect('content-type', /^application\/json/); expect(body).to.have.a.property('logsEndpoint'); - expect(body.logsEndpoint).to.match(/^https\:\/\//); + expect(body.logsEndpoint).to.match(/^https:\/\//); }); }); }); diff --git a/test/09_contracts.ts b/test/09_contracts.ts index bca933187..3de24a9e4 100644 --- a/test/09_contracts.ts +++ b/test/09_contracts.ts @@ -1,4 +1,3 @@ -import _ from 'lodash'; import { fetchContractsLocally, getContracts, @@ -79,7 +78,7 @@ describe('contracts', () => { await fetchContractsLocally([contractRepository]); const contracts = await getContracts('hw.device-type'); - expect(contracts).to.have.length(14); + expect(contracts).to.have.length(16); expect(contracts.find((contract) => contract.slug === 'raspberrypi3')).to .not.be.undefined; }); @@ -97,7 +96,7 @@ describe('contracts', () => { ]); const contracts = await getContracts('hw.device-type'); - expect(contracts).to.have.length(15); + expect(contracts).to.have.length(17); expect( contracts.find((contract) => contract.slug === 'other-contract-dt'), ).to.not.be.undefined; @@ -164,7 +163,7 @@ describe('contracts', () => { (dbDeviceType) => dbDeviceType.slug === 'fincm3', ); - expect(contracts).to.have.length(15); + expect(contracts).to.have.length(17); expect(newDt).to.not.be.undefined; expect(finDt).to.have.property('name', 'Fin'); }); @@ -233,7 +232,7 @@ describe('contracts', () => { (dbDeviceType) => dbDeviceType.slug === 'raspberry-pi', ); - expect(dbDeviceTypes).to.have.length(15); + expect(dbDeviceTypes).to.have.length(17); expect(newDt).to.not.be.undefined; expect(finDt).to.have.property('name', 'Fin'); expect(finDt).to.have.deep.property( diff --git a/test/10_migrations.ts b/test/10_migrations.ts index 74760f0cb..fc5f7d34c 100644 --- a/test/10_migrations.ts +++ b/test/10_migrations.ts @@ -1,10 +1,21 @@ import { strict as assert } from 'assert'; import fs from 'fs'; import _ from 'lodash'; +import { execSync } from 'node:child_process'; import path from 'path'; -import parser from 'libpg-query'; import configJson from '../config'; +// Validate SQL files using squawk +function validateSql(file: string): void { + try { + execSync(`pgpp -t ${file}`, { + stdio: ['ignore', 'ignore', 'pipe'], + }); + } catch (e) { + throw new Error(`Invalid SQL in ${file}: ${e.stderr.toString()}`); + } +} + describe('migrations', () => { _(configJson.models) .filter('migrationsPath') @@ -13,10 +24,8 @@ describe('migrations', () => { if (!path.isAbsolute(migrationsPath!)) { migrationsPath = __dirname + '/../src/' + migrationsPath; } - const fileNamesPromise = fs.promises.readdir(migrationsPath!); + const fileNames = fs.readdirSync(migrationsPath!); it('should have unique prefixes', async () => { - const fileNames = await fileNamesPromise; - const duplicates = _(fileNames) .groupBy((v) => v.split('-', 1)[0]) .filter((v) => v.length > 1) @@ -28,30 +37,21 @@ describe('migrations', () => { } }); - it('should have valid sql', async () => { - const fileNames = await fileNamesPromise; - - // Sanity check SQL files - const fullSqlPaths = fileNames - .filter((fileName) => fileName.endsWith('.sql')) - .map((fileName) => path.join(migrationsPath!, fileName)); - for (const fullSqlPath of fullSqlPaths) { - try { - const sql = await fs.promises.readFile(fullSqlPath, 'utf8'); - await parser.parseQuery(sql); - } catch (e) { - const [migrationKey] = path.basename(fullSqlPath).split('-', 1); - throw new Error( - `Invalid sql for migration ${migrationKey}: ${e} `, - ); - } - } + // Sanity check SQL files + for (const fileName of fileNames.filter((f) => { + return f.endsWith('.sql'); + })) { + it(`should have valid sql in ${fileName}`, async () => { + validateSql(path.join(migrationsPath!, fileName)); + }); + } - // Sanity check async migrations - const asyncMigrationPaths = fileNames - .filter((fileName) => fileName.endsWith('.async.ts')) - .map((fileName) => path.join(migrationsPath!, fileName)); - for (const asyncMigrationPath of asyncMigrationPaths) { + // Sanity check async migrations + const asyncMigrationPaths = fileNames + .filter((fileName) => fileName.endsWith('.async.ts')) + .map((fileName) => path.join(migrationsPath!, fileName)); + for (const asyncMigrationPath of asyncMigrationPaths) { + it(`should have valid sql in ${asyncMigrationPath}`, async () => { const migration = (await import(asyncMigrationPath)).default; if (migration.syncSql || migration.asyncSql) { assert( @@ -60,39 +60,33 @@ describe('migrations', () => { migration.asyncBatchSize, 'Missing required async migration options', ); - try { - await parser.parseQuery( - migration.asyncSql.replaceAll( - '%%ASYNC_BATCH_SIZE%%', - migration.asyncBatchSize, - ), - ); - await parser.parseQuery(migration.syncSql); - } catch (e) { - const [migrationKey] = path - .basename(asyncMigrationPath) - .split('-', 1); - throw new Error( - `Invalid sql for migration ${migrationKey}: ${e} `, - ); - } + const asyncPath = `/tmp/async-${path.basename( + asyncMigrationPath, + )}.sql`; + const syncPath = `/tmp/sync-${path.basename( + asyncMigrationPath, + )}.sql`; + fs.writeFileSync( + asyncPath, + migration.asyncSql.replaceAll( + '%%ASYNC_BATCH_SIZE%%', + migration.asyncBatchSize, + ), + ); + fs.writeFileSync(syncPath, migration.syncSql); + validateSql(asyncPath); + validateSql(syncPath); + fs.unlinkSync(asyncPath); + fs.unlinkSync(syncPath); } - } - }); + }); + } }); }); }); describe('balena-init.sql', () => { it('should have valid sql', async () => { - try { - const sql = await fs.promises.readFile( - require.resolve('../src/balena-init.sql'), - 'utf8', - ); - await parser.parseQuery(sql); - } catch (e) { - throw new Error(`Invalid sql: ${e} `); - } + validateSql('src/balena-init.sql'); }); }); diff --git a/test/11_utils.ts b/test/11_utils.ts index daa63218b..c83def26d 100644 --- a/test/11_utils.ts +++ b/test/11_utils.ts @@ -1,4 +1,3 @@ -import _ from 'lodash'; import { withRetries } from '../src/lib/utils'; import { expect } from 'chai'; diff --git a/test/13_loki-backend.ts b/test/13_loki-backend.ts index 3e9250ba2..a39127454 100644 --- a/test/13_loki-backend.ts +++ b/test/13_loki-backend.ts @@ -42,7 +42,7 @@ describe('loki backend', () => { const response = await loki.publish(ctx, [_.clone(log)]); expect(response).to.be.not.null; const history = await loki.history(ctx, 1000); - expect(history[history.length - 1]).to.deep.equal(log); + expect(history.at(-1)).to.deep.equal(log); }); it('should convert multiple logs with different labels to streams and then back to logs', function () { @@ -99,7 +99,7 @@ describe('loki backend', () => { const loki = new LokiBackend(); const log = createLog(); const incomingLog = await new Bluebird(async (resolve) => { - loki.subscribe(ctx, resolve); + void loki.subscribe(ctx, resolve); await setTimeout(100); // wait for the subscription to connect await loki.publish(ctx, [_.clone(log)]); }).timeout(5000, 'Subscription did not receive log'); @@ -111,7 +111,7 @@ describe('loki backend', () => { const loki = new LokiBackend(); await new Bluebird(async (resolve) => { let countLogs = 0; - loki.subscribe(ctx, () => { + void loki.subscribe(ctx, () => { countLogs += 1; if (countLogs === 5) { resolve(); diff --git a/test/15_target-hostapp.ts b/test/15_target-hostapp.ts index faf4a74b9..6bc684e8f 100644 --- a/test/15_target-hostapp.ts +++ b/test/15_target-hostapp.ts @@ -1,4 +1,3 @@ -import _ from 'lodash'; import * as fixtures from './test-lib/fixtures'; import * as fakeDevice from './test-lib/fake-device'; import { expect } from 'chai'; diff --git a/test/18_resource_filtering.ts b/test/18_resource_filtering.ts index 89f8fd32f..24a4b877d 100644 --- a/test/18_resource_filtering.ts +++ b/test/18_resource_filtering.ts @@ -119,7 +119,7 @@ describe('Resource Filtering', () => { resource: 'application', options: { $filter: { - created_at: { $le: testTimes[testTimes.length - 1].created_at }, + created_at: { $le: testTimes.at(-1)!.created_at }, }, }, }); diff --git a/test/21_fleet-target-state.ts b/test/21_fleet-target-state.ts index 58dc4b1ed..ef97ca490 100644 --- a/test/21_fleet-target-state.ts +++ b/test/21_fleet-target-state.ts @@ -20,7 +20,7 @@ mockery.registerMock('../src/lib/config', configMock); // test fleet default state helper const appMatcherFunc = (svc: AnyObject, fxProp: AnyObject) => - svc.hasOwnProperty('environment') && !!fxProp; + Object.prototype.hasOwnProperty.call(svc, 'environment') && !!fxProp; const svcMatcherFunc = (svc: AnyObject, fxProp: AnyObject) => svc.id === fxProp.service.__id; const imgMatcherFunc = (svc: AnyObject, fxProp: AnyObject) => diff --git a/test/22_os-config.ts b/test/22_os-config.ts new file mode 100644 index 000000000..00d36b182 --- /dev/null +++ b/test/22_os-config.ts @@ -0,0 +1,35 @@ +import { expect } from 'chai'; + +import { supertest } from './test-lib/supertest'; +import { LOGS_HOST } from '../src/lib/config'; + +describe('OS configuration endpoints', () => { + describe('/os/v1/config', () => { + it('should return a valid JSON response', async () => { + const { body } = await supertest().get('/os/v1/config').expect(200); + + // Service configurations should be valid for their respective services + expect(body) + .to.have.property('services') + .that.has.all.keys('openvpn', 'ssh'); + expect(body.services.openvpn).to.have.all.keys('config', 'ca'); + expect(body.services.openvpn.config).to.be.a('string'); + expect(body.services.openvpn.ca).to.be.a('string'); + expect(body.services.ssh) + .to.have.property('authorized_keys') + .that.is.a('string'); + + // schema_version is kept for backwards compatibility + expect(body).to.have.property('schema_version').that.equals('1.0.0'); + + // Config should contain config.json overrides + expect(body) + .to.have.property('config') + .that.deep.equals({ + overrides: { + ...(LOGS_HOST != null && { logsEndpoint: `https://${LOGS_HOST}` }), + }, + }); + }); + }); +}); diff --git a/test/23_release_asset.ts b/test/23_release_asset.ts new file mode 100644 index 000000000..48a673f05 --- /dev/null +++ b/test/23_release_asset.ts @@ -0,0 +1,318 @@ +import { expect } from 'chai'; +import * as fixtures from './test-lib/fixtures'; +import { supertest } from './test-lib/supertest'; +import { + checkFileExists, + expectEqualBlobs, +} from './test-lib/fileupload-helper'; +import { version } from './test-lib/versions'; + +describe('release asset', function () { + describe('create release asset', function () { + before(async function () { + const fx = await fixtures.load('23-release-asset/create-release-asset'); + + this.loadedFixtures = fx; + this.user = fx.users.admin; + this.release1 = fx.releases.release1; + this.release2 = fx.releases.release2; + this.release3 = fx.releases.release3; + }); + + after(async function () { + await fixtures.clean(this.loadedFixtures); + }); + + const filePath = `${__dirname}/fixtures/23-release-asset/sample.txt`; + it('should succeed with mandatory properties', async function () { + const res = await supertest(this.user) + .post(`/${version}/release_asset`) + .field('release', this.release1.id) + .field('asset_key', 'unique_key_1') + .attach('asset', filePath, { + filename: 'sample.txt', + contentType: 'text/plain', + }) + .expect(201); + + expect(res.body).to.have.property('id').that.is.a('number'); + expect(res.body) + .to.have.nested.property('asset.href') + .that.is.a('string'); + expect(res.body) + .to.have.nested.property('release.__id') + .that.equals(this.release1.id); + expect(res.body.asset_key).to.be.equal('unique_key_1'); + + const href = res.body.asset.href; + expect(await checkFileExists(href, 450)).to.be.eq(true); + await expectEqualBlobs(href, filePath); + }); + + it('should succeed with same key for a different release', async function () { + const res = await supertest(this.user) + .post(`/${version}/release_asset`) + .field('release', this.release3.id) + .field('asset_key', 'unique_key_1') + .attach('asset', filePath, { + filename: 'sample.txt', + contentType: 'text/plain', + }) + .expect(201); + + expect(res.body).to.have.property('id').that.is.a('number'); + expect(res.body) + .to.have.nested.property('asset.href') + .that.is.a('string'); + expect(res.body) + .to.have.nested.property('release.__id') + .that.equals(this.release3.id); + expect(res.body.asset_key).to.be.equal('unique_key_1'); + + const href = res.body.asset.href; + expect(await checkFileExists(href, 450)).to.be.eq(true); + await expectEqualBlobs(href, filePath); + }); + + it('should fail when using duplicated key for that release', async function () { + await supertest(this.user) + .post(`/${version}/release_asset`) + .field('release', this.release1.id) + .field('asset_key', 'unique_key_1') + .attach('asset', filePath, { + filename: 'sample.txt', + contentType: 'text/plain', + }) + .expect(409, '"\\"release\\" and \\"asset_key\\" must be unique."'); + }); + + it('should fail when not passing release', async function () { + await supertest(this.user) + .post(`/${version}/release_asset`) + .field('release_key', 'unique_key_2') + .attach('asset', filePath, { + filename: 'sample.txt', + contentType: 'text/plain', + }) + .expect(500); // This should ideally be 4xx + }); + + it('should fail when not passing release asset key', async function () { + await supertest(this.user) + .post(`/${version}/release_asset`) + .field('release', this.release1.id) + .attach('asset', filePath, { + filename: 'sample.txt', + contentType: 'text/plain', + }) + .expect(500); // This should ideally be 4xx + }); + }); + + describe('retrieve release assets', function () { + before(async function () { + const fx = await fixtures.load('23-release-asset/retrieve-release-asset'); + this.loadedFixtures = fx; + this.user = fx.users.admin; + this.releaseasset1 = fx.release_asset.releaseasset1; + this.release1 = fx.releases.release1; + }); + + after(async function () { + await fixtures.clean(this.loadedFixtures); + }); + + it('should succeed when retrieving all assets', async function () { + const res = await supertest(this.user) + .get( + `/${version}/release_asset?$select=id,release,asset&$orderby=release asc`, + ) + .expect(200); + + expect(res.body).to.have.property('d').that.is.an('array'); + expect(res.body).to.have.nested.property('d.length', 3); + expect(res.body).to.have.nested.property('d[0].id').that.is.a('number'); + expect(res.body) + .to.have.nested.property('d[0].release.__id') + .that.is.a('number'); + expect(res.body) + .to.have.nested.property('d[0].asset.href') + .that.is.a('string'); + + expect(res.body).to.have.nested.property('d[1].id').that.is.a('number'); + expect(res.body) + .to.have.nested.property('d[1].release.__id') + .that.is.a('number'); + expect(res.body) + .to.have.nested.property('d[1].asset.href') + .that.is.a('string'); + + expect(res.body).to.have.nested.property('d[2].id').that.is.a('number'); + expect(res.body) + .to.have.nested.property('d[2].release.__id') + .that.is.a('number'); + expect(res.body) + .to.have.nested.property('d[2].asset.href') + .that.is.a('string'); + }); + + it('should succeed when requesting a specific release_asset', async function () { + const res = await supertest(this.user) + .get( + `/${version}/release_asset(${this.releaseasset1.id})?$select=id,release,asset`, + ) + .expect(200); + + expect(res.body).to.have.property('d').that.is.an('array'); + expect(res.body).to.have.nested.property('d.length', 1); + expect(res.body) + .to.have.nested.property('d[0].id') + .that.equals(this.releaseasset1.id); + expect(res.body) + .to.have.nested.property('d[0].asset.href') + .that.equals(this.releaseasset1.asset.href); + expect(res.body) + .to.have.nested.property('d[0].release.__id') + .that.equals(this.releaseasset1.release.__id); + }); + + it('should succeed when expanding a release', async function () { + const res = await supertest(this.user) + .get( + `/${version}/release(${this.release1.id})?$select=release_asset&$expand=release_asset($select=id,release,asset)`, + ) + .expect(200); + + expect(res.body).to.have.property('d').that.is.an('array'); + expect(res.body).to.have.nested.property('d.length', 1); + expect(res.body).to.have.nested.property('d[0]').that.is.an('object'); + expect(res.body) + .to.have.nested.property('d[0].release_asset') + .that.is.an('array'); + expect(res.body).to.have.nested.property('d[0].release_asset.length', 2); + expect(res.body) + .to.have.nested.property('d[0].release_asset[0].id') + .that.is.a('number'); + expect(res.body) + .to.have.nested.property('d[0].release_asset[1].id') + .that.is.a('number'); + }); + + it('should succeed when expanding a release_asset', async function () { + const res = await supertest(this.user) + .get( + `/${version}/release_asset(${this.releaseasset1.id})?$select=release&$expand=release($select=id)`, + ) + .expect(200); + + expect(res.body).to.have.property('d').that.is.an('array'); + expect(res.body).to.have.nested.property('d.length', 1); + expect(res.body) + .to.have.nested.property('d[0].release[0].id') + .that.equals(this.releaseasset1.release.__id); + }); + }); + + describe('update release_asset', function () { + before(async function () { + const fx = await fixtures.load('23-release-asset/update-release-asset'); + this.loadedFixtures = fx; + this.user = fx.users.admin; + this.releaseasset1 = fx.release_asset.releaseasset1; + this.releaseasset2 = fx.release_asset.releaseasset2; + }); + + after(async function () { + await fixtures.clean(this.loadedFixtures); + }); + + const filePath = `${__dirname}/fixtures/23-release-asset/sample.txt`; + it('should succeed', async function () { + await supertest(this.user) + .patch(`/${version}/release_asset(${this.releaseasset1.id})`) + .attach('asset', filePath, { + filename: 'sample.txt', + contentType: 'text/plain', + }) + .expect(200); + + const res = await supertest(this.user) + .get( + `/${version}/release_asset(${this.releaseasset1.id})?$select=id,release,asset`, + ) + .expect(200); + + expect(res.body).to.have.property('d').that.is.an('array'); + expect(res.body).to.have.nested.property('d.length', 1); + expect(res.body) + .to.have.nested.property('d[0].id') + .that.equals(this.releaseasset1.id); + expect(res.body) + .to.have.nested.property('d[0].release.__id') + .that.equals(this.releaseasset1.release.__id); + + const href = res.body.d[0].asset.href; + + expect(res.body.d[0].asset.size).to.equals(39); + expect(await checkFileExists(href, 450)).to.be.eq(true); + await expectEqualBlobs(href, filePath); + }); + + it('should fail to update key if another key has the same name', async function () { + await supertest(this.user) + .patch(`/${version}/release_asset(${this.releaseasset1.id})`) + .field('asset_key', this.releaseasset2.asset_key) + .expect(409, '"\\"release\\" and \\"asset_key\\" must be unique."'); + }); + + it('should fail to update key if another key has the same name with application/json body', async function () { + await supertest(this.user) + .patch(`/${version}/release_asset(${this.releaseasset1.id})`) + .send({ + asset_key: this.releaseasset2.asset_key, + }) + .expect(409, '"\\"release\\" and \\"asset_key\\" must be unique."'); + }); + + it('should succeed to update key with a different asset_key name with application/json body', async function () { + await supertest(this.user) + .patch(`/${version}/release_asset(${this.releaseasset1.id})`) + .send({ + asset_key: 'another_asset_key', + }) + .expect(200); + + const res = await supertest(this.user) + .get( + `/${version}/release_asset(${this.releaseasset1.id})?$select=id,asset_key`, + ) + .expect(200); + expect(res.body.d[0].asset_key).to.be.eq('another_asset_key'); + }); + }); + + describe('delete release asset', function () { + before(async function () { + const fx = await fixtures.load('23-release-asset/delete-release-asset'); + this.loadedFixtures = fx; + this.user = fx.users.admin; + this.releaseasset1 = fx.release_asset.releaseasset1; + }); + + after(async function () { + await fixtures.clean(this.loadedFixtures); + }); + + it('should succeed', async function () { + await supertest(this.user) + .del(`/${version}/release_asset(${this.releaseasset1.id})`) + .expect(200); + + const res = await supertest(this.user) + .get(`/${version}/release_asset(${this.releaseasset1.id})`) + .expect(200); + + expect(res.body).to.have.nested.property('d.length', 0); + }); + }); +}); diff --git a/test/fixtures/04-session/applications.json b/test/fixtures/04-session/applications.json new file mode 100644 index 000000000..91e29839f --- /dev/null +++ b/test/fixtures/04-session/applications.json @@ -0,0 +1,7 @@ +{ + "app1": { + "user": "admin", + "app_name": "test_actor_whoami", + "device_type": "raspberry-pi" + } +} diff --git a/test/fixtures/04-session/devices.json b/test/fixtures/04-session/devices.json new file mode 100644 index 000000000..cf7919a8f --- /dev/null +++ b/test/fixtures/04-session/devices.json @@ -0,0 +1,8 @@ +{ + "device1": { + "belongs_to__application": "app1", + "device_type": "raspberry-pi", + "belongs_to__user": "admin", + "uuid": "c47e4dec05f76ee37c4b8e805c35c1eee54335803b3a40458928f8afce618b" + } +} diff --git a/test/fixtures/23-release-asset/create-release-asset/applications.json b/test/fixtures/23-release-asset/create-release-asset/applications.json new file mode 100644 index 000000000..8f3b55f93 --- /dev/null +++ b/test/fixtures/23-release-asset/create-release-asset/applications.json @@ -0,0 +1,12 @@ +{ + "app1": { + "user": "admin", + "app_name": "test_create_release_asset", + "device_type": "raspberry-pi" + }, + "app2": { + "user": "admin", + "app_name": "test_create_release_asset_other", + "device_type": "raspberry-pi" + } +} diff --git a/test/fixtures/23-release-asset/create-release-asset/releases.json b/test/fixtures/23-release-asset/create-release-asset/releases.json new file mode 100644 index 000000000..181635367 --- /dev/null +++ b/test/fixtures/23-release-asset/create-release-asset/releases.json @@ -0,0 +1,56 @@ +{ + "release1": { + "user": "admin", + "application": "app1", + "composition": { + "services": { + "image1": { + "build": "./image1/" + }, + "image2": { + "build": "./image2/" + } + } + }, + "status": "success", + "source": "cloud", + "commit": "00000001", + "is_final": false + }, + "release2": { + "user": "admin", + "application": "app2", + "composition": { + "services": { + "image1": { + "build": "./image1/" + }, + "image2": { + "build": "./image2/" + } + } + }, + "status": "success", + "source": "cloud", + "commit": "00000002", + "is_final": false + }, + "release3": { + "user": "admin", + "application": "app1", + "composition": { + "services": { + "image1": { + "build": "./image1/" + }, + "image2": { + "build": "./image2/" + } + } + }, + "status": "success", + "source": "cloud", + "commit": "00000003", + "is_final": false + } +} diff --git a/test/fixtures/23-release-asset/delete-release-asset/applications.json b/test/fixtures/23-release-asset/delete-release-asset/applications.json new file mode 100644 index 000000000..ca8c37d64 --- /dev/null +++ b/test/fixtures/23-release-asset/delete-release-asset/applications.json @@ -0,0 +1,7 @@ +{ + "app1": { + "user": "admin", + "app_name": "test_delete_release_asset", + "device_type": "raspberry-pi" + } +} diff --git a/test/fixtures/23-release-asset/delete-release-asset/release_asset.json b/test/fixtures/23-release-asset/delete-release-asset/release_asset.json new file mode 100644 index 000000000..0b91139d0 --- /dev/null +++ b/test/fixtures/23-release-asset/delete-release-asset/release_asset.json @@ -0,0 +1,8 @@ +{ + "releaseasset1": { + "user": "admin", + "release": "release1", + "asset_key": "delete_release_asset.txt", + "asset": "delete_release_asset.txt" + } +} diff --git a/test/fixtures/23-release-asset/delete-release-asset/releases.json b/test/fixtures/23-release-asset/delete-release-asset/releases.json new file mode 100644 index 000000000..07361be9e --- /dev/null +++ b/test/fixtures/23-release-asset/delete-release-asset/releases.json @@ -0,0 +1,20 @@ +{ + "release1": { + "user": "admin", + "application": "app1", + "composition": { + "services": { + "image1": { + "build": "./image1/" + }, + "image2": { + "build": "./image2/" + } + } + }, + "status": "success", + "source": "cloud", + "commit": "00000001", + "is_final": false + } +} diff --git a/test/fixtures/23-release-asset/retrieve-release-asset/applications.json b/test/fixtures/23-release-asset/retrieve-release-asset/applications.json new file mode 100644 index 000000000..84e9375dd --- /dev/null +++ b/test/fixtures/23-release-asset/retrieve-release-asset/applications.json @@ -0,0 +1,12 @@ +{ + "app1": { + "user": "admin", + "app_name": "test_retrieve_release_asset", + "device_type": "raspberry-pi" + }, + "app2": { + "user": "admin", + "app_name": "test_retrieve_release_asset_other", + "device_type": "raspberry-pi" + } +} diff --git a/test/fixtures/23-release-asset/retrieve-release-asset/release_asset.json b/test/fixtures/23-release-asset/retrieve-release-asset/release_asset.json new file mode 100644 index 000000000..76ed86346 --- /dev/null +++ b/test/fixtures/23-release-asset/retrieve-release-asset/release_asset.json @@ -0,0 +1,20 @@ +{ + "releaseasset1": { + "user": "admin", + "release": "release1", + "asset_key": "retrievereleaseasset1.txt", + "asset": "retrievereleaseasset1.txt" + }, + "releaseasset2": { + "user": "admin", + "release": "release1", + "asset_key": "retrievereleaseasset2.txt", + "asset": "retrievereleaseasset2.txt" + }, + "releaseasset3": { + "user": "admin", + "release": "release3", + "asset_key": "retrievereleaseasset3.txt", + "asset": "retrievereleaseasset3.txt" + } +} diff --git a/test/fixtures/23-release-asset/retrieve-release-asset/releases.json b/test/fixtures/23-release-asset/retrieve-release-asset/releases.json new file mode 100644 index 000000000..181635367 --- /dev/null +++ b/test/fixtures/23-release-asset/retrieve-release-asset/releases.json @@ -0,0 +1,56 @@ +{ + "release1": { + "user": "admin", + "application": "app1", + "composition": { + "services": { + "image1": { + "build": "./image1/" + }, + "image2": { + "build": "./image2/" + } + } + }, + "status": "success", + "source": "cloud", + "commit": "00000001", + "is_final": false + }, + "release2": { + "user": "admin", + "application": "app2", + "composition": { + "services": { + "image1": { + "build": "./image1/" + }, + "image2": { + "build": "./image2/" + } + } + }, + "status": "success", + "source": "cloud", + "commit": "00000002", + "is_final": false + }, + "release3": { + "user": "admin", + "application": "app1", + "composition": { + "services": { + "image1": { + "build": "./image1/" + }, + "image2": { + "build": "./image2/" + } + } + }, + "status": "success", + "source": "cloud", + "commit": "00000003", + "is_final": false + } +} diff --git a/test/fixtures/23-release-asset/sample.txt b/test/fixtures/23-release-asset/sample.txt new file mode 100644 index 000000000..ba15361a8 --- /dev/null +++ b/test/fixtures/23-release-asset/sample.txt @@ -0,0 +1,2 @@ +sample testing +file for release assets diff --git a/test/fixtures/23-release-asset/update-release-asset/applications.json b/test/fixtures/23-release-asset/update-release-asset/applications.json new file mode 100644 index 000000000..7e3afe79e --- /dev/null +++ b/test/fixtures/23-release-asset/update-release-asset/applications.json @@ -0,0 +1,7 @@ +{ + "app1": { + "user": "admin", + "app_name": "test_update_release_asset", + "device_type": "raspberry-pi" + } +} diff --git a/test/fixtures/23-release-asset/update-release-asset/release_asset.json b/test/fixtures/23-release-asset/update-release-asset/release_asset.json new file mode 100644 index 000000000..bf3676624 --- /dev/null +++ b/test/fixtures/23-release-asset/update-release-asset/release_asset.json @@ -0,0 +1,14 @@ +{ + "releaseasset1": { + "user": "admin", + "release": "release1", + "asset_key": "update_release_asset.txt", + "asset": "update_release_asset.txt" + }, + "releaseasset2": { + "user": "admin", + "release": "release1", + "asset_key": "update_release_asset2.txt", + "asset": "update_release_asset2.txt" + } +} diff --git a/test/fixtures/23-release-asset/update-release-asset/releases.json b/test/fixtures/23-release-asset/update-release-asset/releases.json new file mode 100644 index 000000000..07361be9e --- /dev/null +++ b/test/fixtures/23-release-asset/update-release-asset/releases.json @@ -0,0 +1,20 @@ +{ + "release1": { + "user": "admin", + "application": "app1", + "composition": { + "services": { + "image1": { + "build": "./image1/" + }, + "image2": { + "build": "./image2/" + } + } + }, + "status": "success", + "source": "cloud", + "commit": "00000001", + "is_final": false + } +} diff --git a/test/fixtures/contracts/base-contracts/contracts/hw.device-type/jetson-tx2/contract.json b/test/fixtures/contracts/base-contracts/contracts/hw.device-type/jetson-tx2/contract.json new file mode 100644 index 000000000..a48d1c24d --- /dev/null +++ b/test/fixtures/contracts/base-contracts/contracts/hw.device-type/jetson-tx2/contract.json @@ -0,0 +1,37 @@ +{ + "slug": "jetson-tx2", + "version": "1", + "type": "hw.device-type", + "aliases": [], + "name": "Nvidia Jetson TX2", + "assets": { + "logo": { + "url": "./jetson-tx2.svg", + "name": "logo" + } + }, + "data": { + "arch": "aarch64", + "hdmi": true, + "led": false, + "connectivity": { + "bluetooth": true, + "wifi": true + }, + "storage": { + "internal": true + }, + "media": { + "defaultBoot": "internal", + "altBoot": ["sdcard"] + }, + "is_private": false + }, + "partials": { + "bootDeviceExternal": [ + "Connect power to the {{name}} and press and hold the POWER push button for 1 second" + ], + "flashIndicator": ["all LEDs are off"], + "bootDevice": ["Remove and re-connect power to the {{name}}"] + } +} diff --git a/test/fixtures/contracts/base-contracts/contracts/hw.device-type/jetson-tx2/jetson-tx2.svg b/test/fixtures/contracts/base-contracts/contracts/hw.device-type/jetson-tx2/jetson-tx2.svg new file mode 100644 index 000000000..8b77d60d4 --- /dev/null +++ b/test/fixtures/contracts/base-contracts/contracts/hw.device-type/jetson-tx2/jetson-tx2.svg @@ -0,0 +1,27 @@ + + + + +Nvidia_logo +Created with Sketch. + + + + + + + + + + diff --git a/test/fixtures/contracts/base-contracts/contracts/hw.device-type/up-board/contract.json b/test/fixtures/contracts/base-contracts/contracts/hw.device-type/up-board/contract.json new file mode 100644 index 000000000..b56e6e930 --- /dev/null +++ b/test/fixtures/contracts/base-contracts/contracts/hw.device-type/up-board/contract.json @@ -0,0 +1,40 @@ +{ + "slug": "up-board", + "version": "1", + "type": "hw.device-type", + "aliases": [], + "name": "UP Board", + "assets": { + "logo": { + "url": "./up-board.svg", + "name": "logo" + } + }, + "data": { + "arch": "amd64", + "family": "family-upboard", + "hdmi": true, + "led": true, + "connectivity": { + "bluetooth": false, + "wifi": false + }, + "storage": { + "internal": true + }, + "media": { + "defaultBoot": "internal", + "altBoot": ["usb_mass_storage"] + }, + "is_private": false + }, + "partials": { + "bootDeviceExternal": [ + "Power on the {{name}} with a keyboard connected.", + "Press the F7 key while BIOS is loading to enter the boot menu.", + "Select the \"UEFI:\" option from the boot menu." + ], + "flashIndicator": ["all LEDs are off"], + "bootDevice": ["Power up the {{name}}"] + } +} diff --git a/test/fixtures/contracts/base-contracts/contracts/hw.device-type/up-board/up-board.svg b/test/fixtures/contracts/base-contracts/contracts/hw.device-type/up-board/up-board.svg new file mode 100644 index 000000000..86d814c54 --- /dev/null +++ b/test/fixtures/contracts/base-contracts/contracts/hw.device-type/up-board/up-board.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/test/test-lib/device-type.ts b/test/test-lib/device-type.ts index 0cf0b538d..eb2abdc60 100644 --- a/test/test-lib/device-type.ts +++ b/test/test-lib/device-type.ts @@ -14,7 +14,10 @@ export const loadDefaultFixtures = () => 'deviceTypes', new Proxy({} as Dictionary, { get: async (obj, slug) => { - if (typeof slug === 'string' && !obj.hasOwnProperty(slug)) { + if ( + typeof slug === 'string' && + !Object.prototype.hasOwnProperty.call(obj, slug) + ) { if (slug === 'then') { // Something is checking if we're a thenable return; diff --git a/test/test-lib/fileupload-helper.ts b/test/test-lib/fileupload-helper.ts new file mode 100644 index 000000000..6cdf9a40b --- /dev/null +++ b/test/test-lib/fileupload-helper.ts @@ -0,0 +1,37 @@ +import * as fs from 'fs/promises'; +import { requestAsync } from '../../src/infra/request-promise'; +import { expect } from 'chai'; + +export async function checkFileExists( + url: string, + timeout = 10000, + pollInterval = 500, +) { + const start = Date.now(); + while (Date.now() - start < timeout) { + try { + const [response] = await requestAsync({ url, method: 'GET' }); + if (response.statusCode !== 200) { + return false; + } + } catch (error) { + console.error(error); + } + await new Promise((resolve) => setTimeout(resolve, pollInterval)); + } + return true; +} + +export async function expectEqualBlobs(url: string, localBlobPath: string) { + const [response, fileRes] = await requestAsync({ + url, + method: 'GET', + encoding: null, + }); + + expect(response.statusCode).to.be.eq(200); + + const originalFile = await fs.readFile(localBlobPath); + const diff = originalFile.compare(fileRes); + expect(diff).to.be.eq(0); +} diff --git a/test/test-lib/fixtures.ts b/test/test-lib/fixtures.ts index 95f92cd7d..a3f5136a1 100644 --- a/test/test-lib/fixtures.ts +++ b/test/test-lib/fixtures.ts @@ -9,6 +9,7 @@ import { Headers } from 'request'; import { API_HOST } from '../../src/lib/config'; import { requestAsync } from '../../src/infra/request-promise'; import { version } from './versions'; +import { supertest } from './supertest'; const { api } = sbvrUtils; @@ -181,8 +182,7 @@ const loaders: Dictionary = { belongs_to__user: user.id, start_timestamp: Date.now(), end_timestamp: Date.now(), - commit: - jsonData.commit ?? randomUUID().replace(/\-/g, '').toLowerCase(), + commit: jsonData.commit ?? randomUUID().replace(/-/g, '').toLowerCase(), ..._.pick( jsonData, 'app_name', @@ -207,6 +207,28 @@ const loaders: Dictionary = { } return release; }, + release_asset: async (jsonData, fixtures) => { + const user = await fixtures.users[jsonData.user]; + if (user == null) { + logErrorAndThrow(`Could not find user: ${jsonData.user}`); + } + const release = await fixtures.releases[jsonData.release]; + if (release == null) { + logErrorAndThrow(`Could not find release: ${jsonData.release}`); + } + + let req = supertest(user).post('/v6/release_asset'); + + req = req.field('release', release.id); + req = req.field('asset_key', jsonData.asset_key); + req = req.attach('asset', Buffer.from([1, 2, 3]), { + filename: jsonData.asset, + contentType: 'image/png', + }); + + const res = await req.expect(201); + return res.body; + }, release_tags: async (jsonData, fixtures) => { const user = await fixtures.users[jsonData.user]; if (user == null) { @@ -407,9 +429,8 @@ const loaders: Dictionary = { if (user == null) { logErrorAndThrow(`Could not find user: ${jsonData.user}`); } - const application = await fixtures.applications[ - jsonData.belongs_to__application - ]; + const application = + await fixtures.applications[jsonData.belongs_to__application]; if (application == null) { logErrorAndThrow( `Could not find application: ${jsonData.belongs_to__application}`, @@ -452,6 +473,7 @@ const deleteResource = (resource: string) => async (obj: { id: number }) => { const modelUnloadOrder = [ 'devices', + 'release_asset', 'applications', 'releases', 'image_install', @@ -466,6 +488,7 @@ const unloaders: { applications: deleteResource('application'), releases: deleteResource('release'), image_install: deleteResource('image_install'), + release_asset: deleteResource('release_asset'), }; export const clean = async (fixtures: AnyObject) => { @@ -517,7 +540,10 @@ export const load = async (fixtureName?: string): Promise => { .filter( (file) => file.endsWith('.json') && - loaders.hasOwnProperty(file.slice(0, -'.json'.length)), + Object.prototype.hasOwnProperty.call( + loaders, + file.slice(0, -'.json'.length), + ), ) .map((file) => file.slice(0, -'.json'.length).trim()); diff --git a/test/test-lib/init-tests.ts b/test/test-lib/init-tests.ts index 2a6221aa3..b538e1d20 100644 --- a/test/test-lib/init-tests.ts +++ b/test/test-lib/init-tests.ts @@ -1,6 +1,10 @@ import jsonwebtoken from 'jsonwebtoken'; import * as fixtures from './fixtures'; -import { supertest, UserObjectParam } from './supertest'; +import { + supertest, + augmentStatusAssertionError, + UserObjectParam, +} from './supertest'; import { version } from './versions'; import { getContractRepos, @@ -8,6 +12,7 @@ import { } from '../../src/features/contracts'; export const preInit = async () => { + augmentStatusAssertionError(); await import('./aws-mock'); await import('./contracts-mock'); diff --git a/test/test-lib/pinetest.ts b/test/test-lib/pinetest.ts index 6ab4d59c3..021d98e0a 100644 --- a/test/test-lib/pinetest.ts +++ b/test/test-lib/pinetest.ts @@ -1,4 +1,3 @@ -import _ from 'lodash'; import { PineTest } from 'pinejs-client-supertest'; import { app } from '../../init'; import { version } from './versions'; diff --git a/test/test-lib/supertest.ts b/test/test-lib/supertest.ts index 32a7031d9..821c17174 100644 --- a/test/test-lib/supertest.ts +++ b/test/test-lib/supertest.ts @@ -1,13 +1,49 @@ import { app } from '../../init'; import $supertest from 'supertest'; import { User } from '../../src/infra/auth/jwt-passport'; +import { ThisShouldNeverHappenError } from '../../src/infra/error-handling'; export type UserObjectParam = Partial; +export const augmentStatusAssertionError = () => { + const originalExpect: $supertest.Test['expect'] = + $supertest.Test.prototype.expect; + /** + * This enhances `.expect(statusCode, ...)` to also log the response body when + * the statusCode is different than expected, to make the original error more useful. + */ + $supertest.Test.prototype.expect = function (this: $supertest.Test, ...args) { + const [expectedStatus] = args; + let supertestFluentChain = this; + if (typeof expectedStatus === 'number') { + // TODO: Switch `.bind()` to `.call()` once TS is able to pick the correct overload. + supertestFluentChain = originalExpect.bind(supertestFluentChain)( + (res) => { + const error = this._assertStatus(expectedStatus, res); + if (error) { + error.message += `, with response body:\n${JSON.stringify( + res.body, + null, + 2, + )}`; + throw error; + } + }, + ); + } + return originalExpect.apply(supertestFluentChain, args); + } satisfies typeof originalExpect; +}; + export const supertest = function (user?: string | UserObjectParam) { // Can be an object with `token`, a JWT string or an API key string let token = user; - if (typeof user === 'object' && user.token) { + if (user != null && typeof user === 'object') { + if (user.token == null) { + throw ThisShouldNeverHappenError( + 'Heads-up: You provided an object as a parameter to supertest that does not include a token, making requests that require authentication to always return 401!!!', + ); + } token = user.token; } // We have to cast `as any` because the types are poorly maintained diff --git a/tsconfig.json b/tsconfig.json index af751d46e..6a1c5d6ac 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,7 @@ "include": [ "src/**/*.ts", "typings/**/*.d.ts", + "*.js", "*.ts", "test/**/*.ts" ] diff --git a/typings/express-extension.d.ts b/typings/express-extension.d.ts index 2324217f9..3e407753a 100644 --- a/typings/express-extension.d.ts +++ b/typings/express-extension.d.ts @@ -1,11 +1,14 @@ // Augment express.js with balena-specific attributes via declaration merging. - -// tslint:disable-next-line:no-namespace declare namespace Express { + import type { Creds } from '../src/infra/auth/jwt-passport'; + // For some reason TS doesn't like v so we had to use `import()` + // import type { User as ApiUser } from '../src/infra/auth/jwt-passport'; type ApiUser = import('../src/infra/auth/jwt-passport').User; - // tslint:disable-next-line:no-empty-interface + // Augment Express.User to include the props of our ApiUser. + // eslint-disable-next-line @typescript-eslint/no-empty-interface interface User extends ApiUser {} + export interface Request { prefetchApiKey?: Resolvable; diff --git a/typings/memoizee.d.ts b/typings/memoizee.d.ts index d4d19f2da..42b9e98d1 100644 --- a/typings/memoizee.d.ts +++ b/typings/memoizee.d.ts @@ -1,3 +1,4 @@ declare module 'memoizee/normalizers/primitive' { - export = (args: any[]) => string; + function PrimitiveNormalizer(args: any[]): string; + export = PrimitiveNormalizer; } diff --git a/typings/supertest-extension.d.ts b/typings/supertest-extension.d.ts new file mode 100644 index 000000000..6c32298bc --- /dev/null +++ b/typings/supertest-extension.d.ts @@ -0,0 +1,10 @@ +import 'supertest'; + +// Augment supertest +declare module 'supertest' { + interface Test { + _assertStatus(status: number, res: Response): Error | undefined; + } + + function Test(app: any, method: string, path: string): Test; +}