diff --git a/.github/workflows/mongoose-publish.yaml b/.github/workflows/mongoose-publish.yaml new file mode 100644 index 00000000..74f85d3e --- /dev/null +++ b/.github/workflows/mongoose-publish.yaml @@ -0,0 +1,32 @@ +name: Publish Package + +on: + push: + tags: + - "@cerbos/orm-mongoose@v*" + +defaults: + run: + working-directory: mongoose + +permissions: + id-token: write # Required for OIDC + contents: read + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: "20" + registry-url: "https://registry.npmjs.org" + + # Ensure npm 11.5.1 or later is installed + - name: Update npm + run: npm install -g npm@latest + - run: npm ci + - run: npm run build --if-present + - run: npm publish diff --git a/.github/workflows/mongoose.yaml b/.github/workflows/mongoose.yaml index 8f8a6c76..b8bd7e0f 100644 --- a/.github/workflows/mongoose.yaml +++ b/.github/workflows/mongoose.yaml @@ -17,8 +17,8 @@ jobs: strategy: matrix: cerbos-version: ["latest"] - mongodb-version: ["4.4", "5.0", "6.0", "7.0", "8.0"] - node-version: ["18", "20", "22"] + mongodb-version: ["7.0", "8.0"] + node-version: ["20", "22", "24", "25"] runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 diff --git a/.github/workflows/prisma-publish.yaml b/.github/workflows/prisma-publish.yaml new file mode 100644 index 00000000..6e6987a5 --- /dev/null +++ b/.github/workflows/prisma-publish.yaml @@ -0,0 +1,32 @@ +name: Publish Package + +on: + push: + tags: + - "@cerbos/orm-prisma@v*" + +defaults: + run: + working-directory: prisma + +permissions: + id-token: write # Required for OIDC + contents: read + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: "20" + registry-url: "https://registry.npmjs.org" + + # Ensure npm 11.5.1 or later is installed + - name: Update npm + run: npm install -g npm@latest + - run: npm ci + - run: npm run build --if-present + - run: npm publish diff --git a/.github/workflows/prisma.yaml b/.github/workflows/prisma.yaml index 4a80add3..24733bbc 100644 --- a/.github/workflows/prisma.yaml +++ b/.github/workflows/prisma.yaml @@ -17,7 +17,7 @@ jobs: strategy: matrix: cerbos-version: ["latest"] - node-version: ["18", "20", "22"] + node-version: ["20", "22", "24", "25"] runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 diff --git a/mongoose/.gitignore b/mongoose/.gitignore index 38878b18..e311fe17 100644 --- a/mongoose/.gitignore +++ b/mongoose/.gitignore @@ -3,3 +3,4 @@ dist lib .DS_Store data +tsconfig.tsbuildinfo diff --git a/mongoose/README.md b/mongoose/README.md index 3ee03d1a..188130e3 100644 --- a/mongoose/README.md +++ b/mongoose/README.md @@ -22,6 +22,12 @@ Not Supported: - Cerbos > v0.16 - `@cerbos/http` or `@cerbos/grpc` client +## System Requirements + +- Node.js >= 20.0.0 +- Mongoose 8.x +- A MongoDB-compatible server (MongoDB 5.0+ is recommended for compatibility with Mongoose 8) + ## Usage ``` diff --git a/mongoose/jest.config.js b/mongoose/jest.config.js index fbaa435b..1a3dd9ed 100644 --- a/mongoose/jest.config.js +++ b/mongoose/jest.config.js @@ -10,7 +10,6 @@ module.exports = { "ts-jest", { useESM: true, - tsconfig: "./tsconfig.jest.json", }, ], }, diff --git a/mongoose/package-lock.json b/mongoose/package-lock.json index 3245eae6..dea5ca60 100644 --- a/mongoose/package-lock.json +++ b/mongoose/package-lock.json @@ -1,24 +1,29 @@ { "name": "@cerbos/orm-mongoose", - "version": "0.1.2", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@cerbos/orm-mongoose", - "version": "0.1.2", + "version": "1.0.0", "license": "Apache-2.0", "dependencies": { "@cerbos/core": "^0.24.0", "@cerbos/grpc": "^0.23.0" }, "devDependencies": { + "@tsconfig/node20": "^20.1.7", + "@tsconfig/strictest": "^2.0.8", "@types/jest": "^29.0.3", "@types/node": "^22.0.0", "mongoose": "^8.0.0", "ts-jest": "^29.0.0", "ts-node": "^10.4.0", "typescript": "^5.0.0" + }, + "engines": { + "node": ">=20.0.0" } }, "node_modules/@ampproject/remapping": { @@ -26,6 +31,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -123,6 +129,7 @@ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", "dev": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -163,6 +170,7 @@ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, + "peer": true, "dependencies": { "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", @@ -178,6 +186,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", "dev": true, + "peer": true, "dependencies": { "@babel/compat-data": "^7.22.5", "@babel/helper-validator-option": "^7.22.5", @@ -197,6 +206,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -206,6 +216,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, + "peer": true, "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" @@ -219,6 +230,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, + "peer": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -231,6 +243,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, + "peer": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -243,6 +256,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", @@ -262,6 +276,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -271,6 +286,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, + "peer": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -283,6 +299,7 @@ "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, + "peer": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -295,6 +312,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -313,6 +331,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -322,6 +341,7 @@ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", "dev": true, + "peer": true, "dependencies": { "@babel/template": "^7.22.5", "@babel/traverse": "^7.22.5", @@ -421,6 +441,7 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, + "peer": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -433,6 +454,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -445,6 +467,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -457,6 +480,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -469,6 +493,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -481,6 +506,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -493,6 +519,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -508,6 +535,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -520,6 +548,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -532,6 +561,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -544,6 +574,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -556,6 +587,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -568,6 +600,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -580,6 +613,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -595,6 +629,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -610,6 +645,7 @@ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -624,6 +660,7 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.23.0", @@ -645,6 +682,7 @@ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", @@ -658,7 +696,8 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@bufbuild/protobuf": { "version": "2.9.0", @@ -749,6 +788,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "peer": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -765,6 +805,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -774,6 +815,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.1", "@types/node": "*", @@ -791,6 +833,7 @@ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", "dev": true, + "peer": true, "dependencies": { "@jest/console": "^29.6.1", "@jest/reporters": "^29.6.1", @@ -838,6 +881,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", "dev": true, + "peer": true, "dependencies": { "@jest/fake-timers": "^29.6.1", "@jest/types": "^29.6.1", @@ -853,6 +897,7 @@ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", "dev": true, + "peer": true, "dependencies": { "expect": "^29.6.1", "jest-snapshot": "^29.6.1" @@ -878,6 +923,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.1", "@sinonjs/fake-timers": "^10.0.2", @@ -895,6 +941,7 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", "dev": true, + "peer": true, "dependencies": { "@jest/environment": "^29.6.1", "@jest/expect": "^29.6.1", @@ -910,6 +957,7 @@ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", "dev": true, + "peer": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.6.1", @@ -965,6 +1013,7 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -979,6 +1028,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", "dev": true, + "peer": true, "dependencies": { "@jest/console": "^29.6.1", "@jest/types": "^29.6.1", @@ -994,6 +1044,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", "dev": true, + "peer": true, "dependencies": { "@jest/test-result": "^29.6.1", "graceful-fs": "^4.2.9", @@ -1009,6 +1060,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.1", @@ -1034,7 +1086,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@jest/types": { "version": "29.6.1", @@ -1058,6 +1111,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1081,6 +1135,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -1096,6 +1151,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -1105,7 +1161,8 @@ "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@js-sdsl/ordered-map": { "version": "4.4.2", @@ -1191,6 +1248,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, + "peer": true, "dependencies": { "type-detect": "4.0.8" } @@ -1200,6 +1258,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -1228,11 +1287,26 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "node_modules/@tsconfig/node20": { + "version": "20.1.7", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.7.tgz", + "integrity": "sha512-Lt137u6AoCCJNNklpNtfGIYFEywma7Hd3B083jqMga37opSEVw7beWsD4OTXyzKS0I3G2kbQJVoZpOxy9GnxBQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/strictest": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/strictest/-/strictest-2.0.8.tgz", + "integrity": "sha512-XnQ7vNz5HRN0r88GYf1J9JJjqtZPiHt2woGJOo2dYqyHGGcd6OLGqSlBB6p1j9mpzja6Oe5BoPqWmeDx6X9rLw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, + "peer": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -1246,6 +1320,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, + "peer": true, "dependencies": { "@babel/types": "^7.0.0" } @@ -1255,6 +1330,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, + "peer": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -1265,6 +1341,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, + "peer": true, "dependencies": { "@babel/types": "^7.20.7" } @@ -1274,6 +1351,7 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -1318,7 +1396,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.8.tgz", "integrity": "sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -1327,7 +1404,8 @@ "version": "2.7.3", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/stack-utils": { "version": "2.0.1", @@ -1393,6 +1471,7 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "peer": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -1430,6 +1509,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "peer": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1449,6 +1529,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -1458,6 +1539,7 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", "dev": true, + "peer": true, "dependencies": { "@jest/transform": "^29.6.1", "@types/babel__core": "^7.1.14", @@ -1479,6 +1561,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -1495,6 +1578,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", "dev": true, + "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -1510,6 +1594,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, + "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -1533,6 +1618,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", "dev": true, + "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.5.0", "babel-preset-current-node-syntax": "^1.0.0" @@ -1548,13 +1634,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "peer": 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==", "dev": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1622,6 +1710,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -1640,13 +1729,15 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "peer": true }, "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, + "peer": true, "engines": { "node": ">=6" } @@ -1656,6 +1747,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -1678,7 +1770,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "peer": true }, "node_modules/chalk": { "version": "4.1.2", @@ -1701,6 +1794,7 @@ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, + "peer": true, "engines": { "node": ">=10" } @@ -1724,7 +1818,8 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/cliui": { "version": "8.0.1", @@ -1744,6 +1839,7 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "peer": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -1753,7 +1849,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true + "dev": true, + "peer": true }, "node_modules/color-convert": { "version": "2.0.1", @@ -1775,13 +1872,15 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/create-require": { "version": "1.1.1", @@ -1794,6 +1893,7 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1824,13 +1924,15 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -1840,6 +1942,7 @@ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -1866,13 +1969,15 @@ "version": "1.4.442", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.442.tgz", "integrity": "sha512-RkrZF//Ya+0aJq2NM3OdisNh5ZodZq1rdXOS96G8DdDgpDKqKE81yTbbQ3F/4CKm1JBPsGu1Lp/akkna2xO06Q==", - "dev": true + "dev": true, + "peer": true }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, + "peer": true, "engines": { "node": ">=12" }, @@ -1890,6 +1995,7 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "peer": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -1916,6 +2022,7 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -1929,6 +2036,7 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "peer": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -1952,6 +2060,7 @@ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -1984,6 +2093,7 @@ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "peer": true, "dependencies": { "bser": "2.1.1" } @@ -2005,6 +2115,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -2017,19 +2128,22 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -2047,6 +2161,7 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "peer": true, "engines": { "node": ">=8.0.0" } @@ -2056,6 +2171,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -2068,6 +2184,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2088,6 +2205,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -2125,6 +2243,7 @@ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, + "peer": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -2145,13 +2264,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "peer": true, "engines": { "node": ">=10.17.0" } @@ -2161,6 +2282,7 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, + "peer": true, "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -2180,6 +2302,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "peer": true, "engines": { "node": ">=0.8.19" } @@ -2189,6 +2312,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, + "peer": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2198,19 +2322,22 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "peer": true }, "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 + "dev": true, + "peer": true }, "node_modules/is-core-module": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, + "peer": true, "dependencies": { "has": "^1.0.3" }, @@ -2231,6 +2358,7 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -2249,6 +2377,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "peer": true, "engines": { "node": ">=8" }, @@ -2260,13 +2389,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -2276,6 +2407,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -2292,6 +2424,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, + "peer": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", @@ -2306,6 +2439,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "peer": true, "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -2320,6 +2454,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, + "peer": true, "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -2360,6 +2495,7 @@ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", "dev": true, + "peer": true, "dependencies": { "execa": "^5.0.0", "p-limit": "^3.1.0" @@ -2373,6 +2509,7 @@ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", "dev": true, + "peer": true, "dependencies": { "@jest/environment": "^29.6.1", "@jest/expect": "^29.6.1", @@ -2404,6 +2541,7 @@ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", "dev": true, + "peer": true, "dependencies": { "@jest/core": "^29.6.1", "@jest/test-result": "^29.6.1", @@ -2438,6 +2576,7 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.6.1", @@ -2498,6 +2637,7 @@ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "dev": true, + "peer": true, "dependencies": { "detect-newline": "^3.0.0" }, @@ -2510,6 +2650,7 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.1", "chalk": "^4.0.0", @@ -2526,6 +2667,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", "dev": true, + "peer": true, "dependencies": { "@jest/environment": "^29.6.1", "@jest/fake-timers": "^29.6.1", @@ -2552,6 +2694,7 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.1", "@types/graceful-fs": "^4.1.3", @@ -2577,6 +2720,7 @@ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", "dev": true, + "peer": true, "dependencies": { "jest-get-type": "^29.4.3", "pretty-format": "^29.6.1" @@ -2625,6 +2769,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.1", "@types/node": "*", @@ -2639,6 +2784,7 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, + "peer": true, "engines": { "node": ">=6" }, @@ -2656,6 +2802,7 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -2665,6 +2812,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", "dev": true, + "peer": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -2685,6 +2833,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", "dev": true, + "peer": true, "dependencies": { "jest-regex-util": "^29.4.3", "jest-snapshot": "^29.6.1" @@ -2698,6 +2847,7 @@ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", "dev": true, + "peer": true, "dependencies": { "@jest/console": "^29.6.1", "@jest/environment": "^29.6.1", @@ -2730,6 +2880,7 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", "dev": true, + "peer": true, "dependencies": { "@jest/environment": "^29.6.1", "@jest/fake-timers": "^29.6.1", @@ -2763,6 +2914,7 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -2795,6 +2947,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -2807,6 +2960,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -2821,7 +2975,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/jest-util": { "version": "29.6.1", @@ -2845,6 +3000,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.1", "camelcase": "^6.2.0", @@ -2862,6 +3018,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -2874,6 +3031,7 @@ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", "dev": true, + "peer": true, "dependencies": { "@jest/test-result": "^29.6.1", "@jest/types": "^29.6.1", @@ -2893,6 +3051,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.6.1", @@ -2908,6 +3067,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -2929,6 +3089,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -2942,6 +3103,7 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, + "peer": true, "bin": { "jsesc": "bin/jsesc" }, @@ -2953,7 +3115,8 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/json5": { "version": "2.2.3", @@ -2981,6 +3144,7 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -2990,6 +3154,7 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -2998,13 +3163,15 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -3033,6 +3200,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "peer": true, "dependencies": { "yallist": "^3.0.2" } @@ -3042,6 +3210,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "peer": true, "dependencies": { "semver": "^6.0.0" }, @@ -3063,6 +3232,7 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -3078,7 +3248,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/micromatch": { "version": "4.0.5", @@ -3098,6 +3269,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -3107,6 +3279,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3243,7 +3416,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/neo-async": { "version": "2.6.2", @@ -3256,19 +3430,22 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/node-releases": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -3278,6 +3455,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "peer": true, "dependencies": { "path-key": "^3.0.0" }, @@ -3290,6 +3468,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "peer": true, "dependencies": { "wrappy": "1" } @@ -3299,6 +3478,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -3314,6 +3494,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -3329,6 +3510,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -3341,6 +3523,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -3356,6 +3539,7 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -3365,6 +3549,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -3383,6 +3568,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -3392,6 +3578,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -3401,6 +3588,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -3409,13 +3597,15 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/picomatch": { "version": "2.3.1", @@ -3434,6 +3624,7 @@ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, + "peer": true, "engines": { "node": ">= 6" } @@ -3443,6 +3634,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "peer": true, "dependencies": { "find-up": "^4.0.0" }, @@ -3481,6 +3673,7 @@ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, + "peer": true, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -3536,7 +3729,8 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "peer": true }, "node_modules/react-is": { "version": "18.2.0", @@ -3557,6 +3751,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, + "peer": true, "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -3574,6 +3769,7 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "peer": true, "dependencies": { "resolve-from": "^5.0.0" }, @@ -3586,6 +3782,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -3595,6 +3792,7 @@ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, + "peer": true, "engines": { "node": ">=10" } @@ -3604,6 +3802,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -3613,6 +3812,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3625,6 +3825,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -3639,13 +3840,15 @@ "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 + "dev": true, + "peer": true }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/slash": { "version": "3.0.0", @@ -3670,6 +3873,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3689,7 +3893,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/stack-utils": { "version": "2.0.6", @@ -3708,6 +3913,7 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "peer": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -3745,6 +3951,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -3754,6 +3961,7 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -3763,6 +3971,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "peer": true, "engines": { "node": ">=8" }, @@ -3787,6 +3996,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -3799,6 +4009,7 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -3812,13 +4023,15 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -3932,7 +4145,6 @@ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, - "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -3976,6 +4188,7 @@ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -3985,6 +4198,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -3998,7 +4212,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4046,6 +4259,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -4081,6 +4295,7 @@ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -4095,6 +4310,7 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -4128,6 +4344,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -4165,13 +4382,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -4192,7 +4411,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/yargs": { "version": "17.7.2", @@ -4233,6 +4453,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, diff --git a/mongoose/package.json b/mongoose/package.json index fced1eba..ba5c8492 100644 --- a/mongoose/package.json +++ b/mongoose/package.json @@ -1,16 +1,41 @@ { "name": "@cerbos/orm-mongoose", - "version": "0.1.2", + "version": "1.0.0", "homepage": "https://cerbos.dev", "description": "", - "private": false, - "main": "./lib/cjs/index.js", - "module": "./lib/esm/index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/cerbos/cerbos-queryplan-helpers.git", + "directory": "packages/mongoose" + }, + "bugs": { + "url": "https://github.com/cerbos/cerbos-queryplan-helpers/issues" + }, + "author": "Cerbos (https://cerbos.dev)", + "license": "Apache-2.0", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "exports": { + ".": { + "types": "./lib/index.d.ts", + "default": "./lib/index.js" + } + }, "files": [ - "lib/**/*" + "lib/**/*.d.ts", + "lib/**/*.d.ts.map", + "lib/**/*.js", + "lib/**/*.js.map", + "src/**/*.ts", + "README.md", + "LICENSE" ], + "publishConfig": { + "access": "public", + "provenance": true + }, "scripts": { - "build": "tsc -p tsconfig.json && tsc -p tsconfig-cjs.json", + "build": "tsc --build", "prepare": "npm run build", "preversion": "npm run lint", "version": "git add -A src", @@ -19,11 +44,14 @@ "test": "cerbos run --log-level=debug --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts", "cerbos": "cerbos server --config=./cerbos-config.yaml" }, - "author": "Cerbos", - "license": "Apache-2.0", + "engines": { + "node": ">=20.0.0" + }, "devDependencies": { "@types/jest": "^29.0.3", "@types/node": "^22.0.0", + "@tsconfig/node20": "^20.1.7", + "@tsconfig/strictest": "^2.0.8", "mongoose": "^8.0.0", "ts-jest": "^29.0.0", "ts-node": "^10.4.0", diff --git a/mongoose/src/index.test.ts b/mongoose/src/index.test.ts index 63f2d3a7..129ea132 100644 --- a/mongoose/src/index.test.ts +++ b/mongoose/src/index.test.ts @@ -155,15 +155,17 @@ test("conditional - eq - inverted order", async () => { action: "equal", }); const typeQp = queryPlan as PlanResourcesConditionalResponse; + const expression = typeQp.condition as PlanExpression; + const [firstOperand, secondOperand] = expression.operands; + if (!firstOperand || !secondOperand) { + throw new Error("Expected plan expression to have at least two operands"); + } const invertedQueryPlan: PlanResourcesConditionalResponse = { ...typeQp, condition: { - ...typeQp.condition, - operands: [ - (typeQp.condition as PlanExpression).operands[1], - (typeQp.condition as PlanExpression).operands[0], - ], + ...expression, + operands: [secondOperand, firstOperand], }, }; diff --git a/mongoose/src/index.ts b/mongoose/src/index.ts index fb468205..58417299 100644 --- a/mongoose/src/index.ts +++ b/mongoose/src/index.ts @@ -16,17 +16,6 @@ type FieldMapper = } | ((key: string) => string); -type Relation = { - relation: string; - field: string; -}; - -type RelationMapper = - | { - [key: string]: Relation; - } - | ((key: string) => Relation); - interface QueryPlanToPrismaArgs { queryPlan: PlanResourcesResponse; fieldNameMapper: FieldMapper; @@ -79,10 +68,6 @@ function isValue(e: PlanExpressionOperand): e is PlanExpressionValue { return (e as any).value !== undefined; } -function isVariable(e: PlanExpressionOperand): e is PlanExpressionVariable { - return (e as any).variable !== undefined; -} - function getOperandVariable(operands: PlanExpressionOperand[]) { const op = operands.find((o) => o.hasOwnProperty("name")); if (!op) return; diff --git a/mongoose/tsconfig-cjs.json b/mongoose/tsconfig-cjs.json deleted file mode 100644 index 945c51f2..00000000 --- a/mongoose/tsconfig-cjs.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "CommonJS", - "outDir": "./lib/cjs" - } -} diff --git a/mongoose/tsconfig.jest.json b/mongoose/tsconfig.jest.json deleted file mode 100644 index 1809033f..00000000 --- a/mongoose/tsconfig.jest.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "allowJs": true - } -} diff --git a/mongoose/tsconfig.json b/mongoose/tsconfig.json index 3eb84d02..9aa630e9 100644 --- a/mongoose/tsconfig.json +++ b/mongoose/tsconfig.json @@ -1,15 +1,13 @@ { - "compilerOptions": { - "target": "ES2015", - "module": "ES2020", - "strict": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "outDir": "./lib", - "declaration": true, - "moduleResolution": "node", - "types": ["@types/jest"] - }, + "extends": ["@tsconfig/node20", "@tsconfig/strictest"], "include": ["src"], - "exclude": ["**/*.test.ts"] + "compilerOptions": { + "checkJs": true, + "composite": true, + "exactOptionalPropertyTypes": false, + "outDir": "lib", + "rootDir": "src", + "declarationMap": true, + "sourceMap": true + } } diff --git a/prisma/.gitignore b/prisma/.gitignore index a0285663..ce916cf2 100644 --- a/prisma/.gitignore +++ b/prisma/.gitignore @@ -3,4 +3,5 @@ dist lib .DS_Store prisma/dev.db -prisma/dev.db-journal \ No newline at end of file +prisma/dev.db-journal +tsconfig.tsbuildinfo diff --git a/prisma/README.md b/prisma/README.md index c4bfe12c..88879880 100644 --- a/prisma/README.md +++ b/prisma/README.md @@ -33,6 +33,12 @@ An adapter library that takes a [Cerbos](https://cerbos.dev) Query Plan ([PlanRe - `@cerbos/http` or `@cerbos/grpc` client - Prisma > v6.0 +## System Requirements + +- Node.js >= 20.0. +- Prisma CLI & Client >= 6.0 +- A database supported by Prisma (SQLite/PostgreSQL/MySQL/etc.) so the Prisma client can communicate with stored data + ## Installation ```bash diff --git a/prisma/jest.config.js b/prisma/jest.config.js index fbaa435b..1a3dd9ed 100644 --- a/prisma/jest.config.js +++ b/prisma/jest.config.js @@ -10,7 +10,6 @@ module.exports = { "ts-jest", { useESM: true, - tsconfig: "./tsconfig.jest.json", }, ], }, diff --git a/prisma/package-lock.json b/prisma/package-lock.json index 885e60eb..543f603c 100644 --- a/prisma/package-lock.json +++ b/prisma/package-lock.json @@ -1,16 +1,18 @@ { "name": "@cerbos/orm-prisma", - "version": "2.0.2", + "version": "3.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@cerbos/orm-prisma", - "version": "2.0.2", + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { "@cerbos/core": "^0.24.0", "@cerbos/grpc": "^0.23.0", + "@tsconfig/node20": "^20.1.7", + "@tsconfig/strictest": "^2.0.8", "tslib": "^2.8.1" }, "devDependencies": { @@ -25,7 +27,7 @@ "typescript": "^5.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" }, "peerDependencies": { "@prisma/client": "^5.0.0 || ^6.0.0" @@ -1472,6 +1474,18 @@ "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", "dev": true }, + "node_modules/@tsconfig/node20": { + "version": "20.1.7", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.7.tgz", + "integrity": "sha512-Lt137u6AoCCJNNklpNtfGIYFEywma7Hd3B083jqMga37opSEVw7beWsD4OTXyzKS0I3G2kbQJVoZpOxy9GnxBQ==", + "license": "MIT" + }, + "node_modules/@tsconfig/strictest": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/strictest/-/strictest-2.0.8.tgz", + "integrity": "sha512-XnQ7vNz5HRN0r88GYf1J9JJjqtZPiHt2woGJOo2dYqyHGGcd6OLGqSlBB6p1j9mpzja6Oe5BoPqWmeDx6X9rLw==", + "license": "MIT" + }, "node_modules/@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", @@ -6034,6 +6048,16 @@ "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", "dev": true }, + "@tsconfig/node20": { + "version": "20.1.7", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.7.tgz", + "integrity": "sha512-Lt137u6AoCCJNNklpNtfGIYFEywma7Hd3B083jqMga37opSEVw7beWsD4OTXyzKS0I3G2kbQJVoZpOxy9GnxBQ==" + }, + "@tsconfig/strictest": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/strictest/-/strictest-2.0.8.tgz", + "integrity": "sha512-XnQ7vNz5HRN0r88GYf1J9JJjqtZPiHt2woGJOo2dYqyHGGcd6OLGqSlBB6p1j9mpzja6Oe5BoPqWmeDx6X9rLw==" + }, "@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", diff --git a/prisma/package.json b/prisma/package.json index e3b8abc5..2398bbef 100644 --- a/prisma/package.json +++ b/prisma/package.json @@ -1,31 +1,42 @@ { "name": "@cerbos/orm-prisma", - "version": "2.0.2", + "version": "3.0.0", "homepage": "https://cerbos.dev", "description": "Prisma adapter for Cerbos query plans", - "private": false, - "main": "./lib/cjs/index.js", - "module": "./lib/esm/index.js", - "types": "./lib/types/index.d.ts", + "repository": { + "type": "git", + "url": "git+https://github.com/cerbos/cerbos-queryplan-helpers.git", + "directory": "packages/prisma" + }, + "bugs": { + "url": "https://github.com/cerbos/cerbos-queryplan-helpers/issues" + }, + "author": "Cerbos (https://cerbos.dev)", + "license": "Apache-2.0", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", "exports": { ".": { - "require": "./lib/cjs/index.js", - "import": "./lib/esm/index.js", - "types": "./lib/types/index.d.ts" + "types": "./lib/index.d.ts", + "default": "./lib/index.js" } }, "files": [ - "lib", + "lib/**/*.d.ts", + "lib/**/*.d.ts.map", + "lib/**/*.js", + "lib/**/*.js.map", + "src/**/*.ts", "README.md", "LICENSE" ], - "sideEffects": false, + "publishConfig": { + "access": "public", + "provenance": true + }, "scripts": { "clean": "rimraf lib", - "build": "npm run clean && npm run build:types && npm run build:cjs && npm run build:esm", - "build:types": "tsc -p tsconfig.types.json", - "build:cjs": "tsc -p tsconfig.cjs.json", - "build:esm": "tsc -p tsconfig.esm.json", + "build": "tsc --build", "prepare": "npm run build", "prepublishOnly": "npm test", "version": "git add -A src", @@ -33,10 +44,8 @@ "cerbos": "cerbos server --config=./cerbos-config.yaml" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" }, - "author": "Cerbos", - "license": "Apache-2.0", "devDependencies": { "@prisma/client": "^6.4.1", "@types/jest": "^29.0.3", @@ -54,11 +63,10 @@ "dependencies": { "@cerbos/core": "^0.24.0", "@cerbos/grpc": "^0.23.0", + "@tsconfig/node20": "^20.1.7", + "@tsconfig/strictest": "^2.0.8", "tslib": "^2.8.1" }, - "publishConfig": { - "access": "public" - }, "keywords": [ "cerbos", "prisma", diff --git a/prisma/src/index.test.ts b/prisma/src/index.test.ts index f455607d..8657c27f 100644 --- a/prisma/src/index.test.ts +++ b/prisma/src/index.test.ts @@ -9,6 +9,7 @@ import { } from "@jest/globals"; import { PlanExpression, + PlanExpressionOperand, PlanResourcesConditionalResponse, PlanResourcesResponse, } from "@cerbos/core"; @@ -18,6 +19,30 @@ import { GRPC as Cerbos } from "@cerbos/grpc"; const prisma = new PrismaClient(); const cerbos = new Cerbos("127.0.0.1:3593", { tls: false }); +function createConditionalPlan( + condition: PlanExpressionOperand +): PlanResourcesConditionalResponse { + return { + kind: PlanKind.CONDITIONAL, + condition, + cerbosCallId: "", + requestId: "", + validationErrors: [], + metadata: undefined, + }; +} + +function getExpressionOperand( + expression: PlanExpression, + index: number +): PlanExpressionOperand { + const operand = expression.operands[index]; + if (!operand) { + throw new Error(`Missing operand at index ${index}`); + } + return operand; +} + const fixtureUsers: Prisma.UserCreateInput[] = [ { id: "user1", @@ -396,8 +421,8 @@ describe("Field Operations", () => { condition: { ...typeQp.condition, operands: [ - (typeQp.condition as PlanExpression).operands[1], - (typeQp.condition as PlanExpression).operands[0], + getExpressionOperand(typeQp.condition as PlanExpression, 1), + getExpressionOperand(typeQp.condition as PlanExpression, 0), ], }, }; @@ -943,16 +968,13 @@ describe("Collection Operations", () => { }); test("conditional - in - scalar value", async () => { - const queryPlan: PlanResourcesConditionalResponse = { - kind: PlanKind.CONDITIONAL, - condition: { - operator: "in", - operands: [ - { name: "request.resource.attr.aString" }, - { value: "string" }, - ], - }, - }; + const queryPlan = createConditionalPlan({ + operator: "in", + operands: [ + { name: "request.resource.attr.aString" }, + { value: "string" }, + ], + }); const result = queryPlanToPrisma({ queryPlan, @@ -983,16 +1005,13 @@ describe("Collection Operations", () => { }); test("conditional - relation in", async () => { - const queryPlan: PlanResourcesConditionalResponse = { - kind: PlanKind.CONDITIONAL, - condition: { - operator: "in", - operands: [ - { name: "request.resource.attr.categories.name" }, - { value: ["business"] }, - ], - }, - }; + const queryPlan = createConditionalPlan({ + operator: "in", + operands: [ + { name: "request.resource.attr.categories.name" }, + { value: ["business"] }, + ], + }); const result = queryPlanToPrisma({ queryPlan, @@ -1047,16 +1066,13 @@ describe("Collection Operations", () => { }); test("conditional - relation in multiple values", async () => { - const queryPlan: PlanResourcesConditionalResponse = { - kind: PlanKind.CONDITIONAL, - condition: { - operator: "in", - operands: [ - { name: "request.resource.attr.categories.name" }, - { value: ["business", "development"] }, - ], - }, - }; + const queryPlan = createConditionalPlan({ + operator: "in", + operands: [ + { name: "request.resource.attr.categories.name" }, + { value: ["business", "development"] }, + ], + }); const result = queryPlanToPrisma({ queryPlan, @@ -1111,28 +1127,25 @@ describe("Collection Operations", () => { }); test("conditional - except relation subset", async () => { - const queryPlan: PlanResourcesConditionalResponse = { - kind: PlanKind.CONDITIONAL, - condition: { - operator: "except", - operands: [ - { name: "request.resource.attr.categories" }, - { - operator: "lambda", - operands: [ - { - operator: "eq", - operands: [ - { name: "cat.name" }, - { value: "business" }, - ], - }, - { name: "cat" }, - ], - }, - ], - }, - }; + const queryPlan = createConditionalPlan({ + operator: "except", + operands: [ + { name: "request.resource.attr.categories" }, + { + operator: "lambda", + operands: [ + { + operator: "eq", + operands: [ + { name: "cat.name" }, + { value: "business" }, + ], + }, + { name: "cat" }, + ], + }, + ], + }); const result = queryPlanToPrisma({ queryPlan, @@ -1189,40 +1202,37 @@ describe("Collection Operations", () => { }); test("conditional - except nested relation subset", async () => { - const queryPlan: PlanResourcesConditionalResponse = { - kind: PlanKind.CONDITIONAL, - condition: { - operator: "except", - operands: [ - { name: "request.resource.attr.categories" }, - { - operator: "lambda", - operands: [ - { - operator: "exists", - operands: [ - { name: "cat.subCategories" }, - { - operator: "lambda", - operands: [ - { - operator: "eq", - operands: [ - { name: "sub.name" }, - { value: "finance" }, - ], - }, - { name: "sub" }, - ], - }, - ], - }, - { name: "cat" }, - ], - }, - ], - }, - }; + const queryPlan = createConditionalPlan({ + operator: "except", + operands: [ + { name: "request.resource.attr.categories" }, + { + operator: "lambda", + operands: [ + { + operator: "exists", + operands: [ + { name: "cat.subCategories" }, + { + operator: "lambda", + operands: [ + { + operator: "eq", + operands: [ + { name: "sub.name" }, + { value: "finance" }, + ], + }, + { name: "sub" }, + ], + }, + ], + }, + { name: "cat" }, + ], + }, + ], + }); const result = queryPlanToPrisma({ queryPlan, diff --git a/prisma/src/index.ts b/prisma/src/index.ts index 73c64047..e3f22a32 100644 --- a/prisma/src/index.ts +++ b/prisma/src/index.ts @@ -75,6 +75,29 @@ function isOperatorOperand( ); } +function assertDefined(value: T | undefined, message: string): T { + if (value === undefined) { + throw new Error(message); + } + return value; +} + +function getLeafField(path: string[]): string { + const fieldName = path[path.length - 1]; + if (!fieldName) { + throw new Error("Field path cannot be empty"); + } + return fieldName; +} + +function getFilterEntry(filter: Record): [string, unknown] { + const entry = Object.entries(filter)[0]; + if (!entry) { + throw new Error("Filter must contain at least one entry"); + } + return entry; +} + // Field reference resolution types type RelationConfig = { name: string; @@ -158,7 +181,7 @@ function resolveFieldReference( } } - const activeConfig = config || matchedConfig!; + const activeConfig = config ?? matchedConfig; // Handle relation mapping if (activeConfig?.relation) { @@ -180,11 +203,20 @@ function resolveFieldReference( // Process nested relations if (fields && remainingParts.length > 0) { - let currentMapper = fields; + let currentMapper: Record | undefined = fields; let currentParts = remainingParts; while (currentParts.length > 0) { - const nextConfig = currentMapper[currentParts[0]]; + if (!currentMapper) { + break; + } + + const currentPart = currentParts[0]; + if (!currentPart) { + break; + } + + const nextConfig: MapperConfig | undefined = currentMapper[currentPart]; if (nextConfig?.relation) { relations.push({ name: nextConfig.relation.name, @@ -195,7 +227,11 @@ function resolveFieldReference( currentMapper = nextConfig.relation.fields || {}; currentParts = currentParts.slice(1); } else { - field = nextConfig?.field || currentParts[currentParts.length - 1]; + const lastPart = currentParts[currentParts.length - 1]; + if (!lastPart) { + break; + } + field = nextConfig?.field || lastPart; break; } } @@ -233,11 +269,14 @@ function buildNestedRelationFilter( // Build nested structure from inside out for (let i = relations.length - 1; i >= 0; i--) { const relation = relations[i]; + if (!relation) { + throw new Error("Relation mapping is missing"); + } const relationOperator = getPrismaRelationOperator(relation); // Handle special case for the deepest relation if (relation.field && i === relations.length - 1) { - const [key, filterValue] = Object.entries(currentFilter)[0]; + const [key, filterValue] = getFilterEntry(currentFilter); if (key === "NOT") { currentFilter = { NOT: { [relation.field]: filterValue } }; } else { @@ -291,19 +330,34 @@ function createScopedMapper( if (collectionConfig?.relation?.fields) { // For nested paths, traverse the fields configuration - let currentConfig = collectionConfig.relation.fields; - let field = parts[0]; + const baseConfig = collectionConfig.relation.fields; + if (!baseConfig) { + return { field: strippedKey }; + } + + let currentConfig = baseConfig; + let field = parts[0] || strippedKey; for (let i = 0; i < parts.length - 1; i++) { const part = parts[i]; - if (currentConfig[part]?.relation?.fields) { - currentConfig = currentConfig[part].relation.fields; - field = parts[i + 1]; + const nextPart = parts[i + 1]; + if (!part || !nextPart) { + break; + } + + const nextConfig = currentConfig[part]; + if (nextConfig?.relation?.fields) { + currentConfig = nextConfig.relation.fields; + field = nextPart; } else { break; } } + if (!field) { + field = strippedKey; + } + // Return the field config if it exists, otherwise create a default one return currentConfig[field] || { field }; } @@ -311,7 +365,10 @@ function createScopedMapper( } // For keys not referencing the collection item, use the full mapper - return typeof fullMapper === "function" ? fullMapper(key) : fullMapper[key]; + if (typeof fullMapper === "function") { + return fullMapper(key); + } + return fullMapper[key] || { field: key }; }; } @@ -345,10 +402,15 @@ function buildPrismaFilterFromCerbosExpression( ), }; - case "not": + case "not": { + const operand = operands[0]; + if (!operand) { + throw new Error("not operator requires an operand"); + } return { - NOT: buildPrismaFilterFromCerbosExpression(operands[0], mapper), + NOT: buildPrismaFilterFromCerbosExpression(operand, mapper), }; + } case "eq": case "ne": @@ -438,7 +500,8 @@ function handleRelationalOperator( } const filterValue = { [prismaOperator]: right.value }; - const fieldFilter = { [path[path.length - 1]]: filterValue }; + const fieldName = getLeafField(path); + const fieldFilter = { [fieldName]: filterValue }; if (relations && relations.length > 0) { return buildNestedRelationFilter(relations, fieldFilter); @@ -481,7 +544,7 @@ function handleInOperator( const { value } = resolvedValue; const values = Array.isArray(value) ? value : [value]; - const fieldName = path[path.length - 1]; + const fieldName = getLeafField(path); if (relations && relations.length > 0) { const fieldFilter = @@ -527,7 +590,8 @@ function handleStringOperator( throw new Error(`${operator} operator requires string value`); } - const fieldFilter = { [path[path.length - 1]]: { [operator]: value } }; + const fieldName = getLeafField(path); + const fieldFilter = { [fieldName]: { [operator]: value } }; if (relations && relations.length > 0) { return buildNestedRelationFilter(relations, fieldFilter); @@ -561,10 +625,9 @@ function handleIsSetOperator( throw new Error("Value operand must resolve to a value"); } + const fieldName = getLeafField(path); const fieldFilter = { - [path[path.length - 1]]: resolvedValue.value - ? { not: null } - : { equals: null }, + [fieldName]: resolvedValue.value ? { not: null } : { equals: null }, }; if (relations && relations.length > 0) { @@ -585,7 +648,14 @@ function handleHasIntersectionOperator( throw new Error("hasIntersection requires exactly two operands"); } - const [leftOperand, rightOperand] = operands; + const leftOperand = assertDefined( + operands[0], + "hasIntersection requires a left operand" + ); + const rightOperand = assertDefined( + operands[1], + "hasIntersection requires a right operand" + ); // Check if left operand is a map operation if (isOperatorOperand(leftOperand) && leftOperand.operator === "map") { @@ -593,7 +663,15 @@ function handleHasIntersectionOperator( throw new Error("Second operand of hasIntersection must be a value"); } - const [collection, lambda] = leftOperand.operands; + const collection = assertDefined( + leftOperand.operands[0], + "Map expression must include a collection reference" + ); + const lambda = assertDefined( + leftOperand.operands[1], + "Map expression must include a lambda expression" + ); + if (!isNamedOperand(collection)) { throw new Error("First operand of map must be a collection reference"); } @@ -603,7 +681,10 @@ function handleHasIntersectionOperator( throw new Error("Lambda expression must have operands"); } - const [, variable] = lambda.operands; + const variable = assertDefined( + lambda.operands[1], + "Lambda variable must have a name" + ); if (!isNamedOperand(variable)) { throw new Error("Lambda variable must have a name"); } @@ -620,18 +701,17 @@ function handleHasIntersectionOperator( throw new Error("Map operation requires relations"); } - if (!isOperatorOperand(lambda)) { - throw new Error("Invalid lambda expression structure"); - } - - const [projection] = lambda.operands; + const projection = assertDefined( + lambda.operands[0], + "Invalid map lambda expression structure" + ); if (!isNamedOperand(projection)) { throw new Error("Invalid map lambda expression structure"); } // Use scoped mapper for resolving the projection const resolved = resolveFieldReference(projection.name, scopedMapper); - const fieldName = resolved.path[resolved.path.length - 1]; + const fieldName = getLeafField(resolved.path); return buildNestedRelationFilter(relations, { [fieldName]: { in: rightOperand.value }, @@ -656,20 +736,29 @@ function handleHasIntersectionOperator( } if (relations && relations.length > 0) { + const fieldName = getLeafField(path); const fieldFilter = { - [path[path.length - 1]]: { in: rightOperand.value }, + [fieldName]: { in: rightOperand.value }, }; return buildNestedRelationFilter(relations, fieldFilter); } - return { [path[path.length - 1]]: { some: rightOperand.value } }; + const fieldName = getLeafField(path); + return { [fieldName]: { some: rightOperand.value } }; } /** * Helper function to handle "lambda" operator */ function handleLambdaOperator(operands: PlanExpressionOperand[]): PrismaFilter { - const [condition, variable] = operands; + const condition = assertDefined( + operands[0], + "Lambda requires a condition operand" + ); + const variable = assertDefined( + operands[1], + "Lambda requires a variable operand" + ); if (!isNamedOperand(variable)) { throw new Error("Lambda variable must have a name"); @@ -692,7 +781,14 @@ function handleCollectionOperator( throw new Error(`${operator} requires exactly two operands`); } - const [collection, lambda] = operands; + const collection = assertDefined( + operands[0], + `${operator} requires a collection operand` + ); + const lambda = assertDefined( + operands[1], + `${operator} requires a lambda operand` + ); if (!isNamedOperand(collection)) { throw new Error( @@ -707,7 +803,10 @@ function handleCollectionOperator( } // Get variable name from lambda - const [, variable] = lambda.operands; + const variable = assertDefined( + lambda.operands[1], + "Lambda variable must have a name" + ); if (!isNamedOperand(variable)) { throw new Error("Lambda variable must have a name"); } @@ -720,25 +819,41 @@ function handleCollectionOperator( ); const { relations } = resolveFieldReference(collection.name, mapper); - if (!relations) { + if (!relations || relations.length === 0) { throw new Error(`${operator} operator requires a relation mapping`); } + const lambdaConditionOperand = assertDefined( + lambda.operands[0], + "Lambda expression must provide a condition" + ); const lambdaCondition = buildPrismaFilterFromCerbosExpression( - lambda.operands[0], // Use the condition part of the lambda + lambdaConditionOperand, // Use the condition part of the lambda scopedMapper ); - const relation = relations[0]; + const relation = assertDefined( + relations[0], + `${operator} operator requires a relation mapping` + ); let filterValue = lambdaCondition; // If the lambda condition already has a relation structure, merge it - if (lambdaCondition.AND || lambdaCondition.OR) { + if (lambdaCondition["AND"] || lambdaCondition["OR"]) { filterValue = lambdaCondition; } else { - const filterField = relation.field || Object.keys(lambdaCondition)[0]; + const lambdaKeys = Object.keys(lambdaCondition); + const defaultKey = lambdaKeys[0]; + if (!defaultKey) { + throw new Error("Lambda condition must have at least one field"); + } + const lambdaFieldValue = lambdaCondition[defaultKey]; + if (lambdaFieldValue === undefined) { + throw new Error("Lambda condition field value cannot be undefined"); + } + const filterField = relation.field || defaultKey; filterValue = { - [filterField]: lambdaCondition[Object.keys(lambdaCondition)[0]], + [filterField]: lambdaFieldValue, }; } @@ -781,7 +896,14 @@ function handleMapOperator( throw new Error("map requires exactly two operands"); } - const [collection, lambda] = operands; + const collection = assertDefined( + operands[0], + "map requires a collection operand" + ); + const lambda = assertDefined( + operands[1], + "map requires a lambda operand" + ); if (!isNamedOperand(collection)) { throw new Error("First operand of map must be a collection reference"); @@ -792,7 +914,14 @@ function handleMapOperator( } // Get variable name from lambda - const [projection, variable] = lambda.operands; + const projection = assertDefined( + lambda.operands[0], + "Map lambda expression must provide a projection" + ); + const variable = assertDefined( + lambda.operands[1], + "Map lambda expression must provide a variable" + ); if (!isNamedOperand(projection) || !isNamedOperand(variable)) { throw new Error("Invalid map lambda expression structure"); } @@ -805,16 +934,20 @@ function handleMapOperator( ); const { relations } = resolveFieldReference(collection.name, mapper); - if (!relations) { + if (!relations || relations.length === 0) { throw new Error("map operator requires a relation mapping"); } // Use scoped mapper for resolving the projection const resolved = resolveFieldReference(projection.name, scopedMapper); - const fieldName = resolved.path[resolved.path.length - 1]; + const fieldName = getLeafField(resolved.path); + const lastRelation = assertDefined( + relations[relations.length - 1], + "Relation mapping must contain at least one relation" + ); return buildNestedRelationFilter(relations, { - [getPrismaRelationOperator(relations[relations.length - 1])]: { + [getPrismaRelationOperator(lastRelation)]: { select: { [fieldName]: true }, }, }); diff --git a/prisma/tsconfig.cjs.json b/prisma/tsconfig.cjs.json deleted file mode 100644 index 560d008e..00000000 --- a/prisma/tsconfig.cjs.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "CommonJS", - "outDir": "./lib/cjs", - "declaration": false, - "declarationMap": false, - "sourceMap": true - }, - "include": ["src"], - "exclude": ["src/**/*.test.ts"] -} diff --git a/prisma/tsconfig.esm.json b/prisma/tsconfig.esm.json deleted file mode 100644 index 37c29daa..00000000 --- a/prisma/tsconfig.esm.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "ESNext", - "outDir": "./lib/esm", - "declaration": false, - "declarationMap": false, - "sourceMap": true - }, - "include": ["src"], - "exclude": ["src/**/*.test.ts"] -} diff --git a/prisma/tsconfig.jest.json b/prisma/tsconfig.jest.json deleted file mode 100644 index 1809033f..00000000 --- a/prisma/tsconfig.jest.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "allowJs": true - } -} diff --git a/prisma/tsconfig.json b/prisma/tsconfig.json index a70e87bd..9aa630e9 100644 --- a/prisma/tsconfig.json +++ b/prisma/tsconfig.json @@ -1,29 +1,13 @@ { + "extends": ["@tsconfig/node20", "@tsconfig/strictest"], + "include": ["src"], "compilerOptions": { - "target": "ES2020", - "lib": ["ES2020"], - "module": "ESNext", - "moduleResolution": "node", - "rootDir": "./src", - "baseUrl": "./src", - "outDir": "./lib", - "declaration": true, + "checkJs": true, + "composite": true, + "exactOptionalPropertyTypes": false, + "outDir": "lib", + "rootDir": "src", "declarationMap": true, - "sourceMap": true, - "importHelpers": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "allowSyntheticDefaultImports": true, - "isolatedModules": true, - "types": ["node", "jest"] - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "lib", "**/*.test.ts"] + "sourceMap": true + } } diff --git a/prisma/tsconfig.types.json b/prisma/tsconfig.types.json deleted file mode 100644 index b16c656f..00000000 --- a/prisma/tsconfig.types.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": true, - "emitDeclarationOnly": true, - "outDir": "./lib/types", - "removeComments": false - }, - "include": ["src"], - "exclude": ["src/**/*.test.ts"] -}