diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 800b2f4..91621a0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,10 +63,14 @@ jobs: npm run ory:generate:kratos -- -e .env.ci npm run ory:generate:keto -- -e .env.ci - - run: npx nx run cat-fostering-api:docker-build --no-agents + - run: echo "DOCKER_API_TAG=$(echo $GITHUB_SHA | cut -c 1-6)" >> $GITHUB_ENV + + - run: npx nx run cat-fostering-api:container --skip-nx-cache --no-agents --platforms=linux/amd64 --load=true --push=false --tags='ghcr.io/getlarge/cat-fostering/cat-fostering-api:${{ env.DOCKER_API_TAG }}' # can't use --wait --wait-timeout N options since Keto and Kratos migrate containers will exit before the Keto and Kratos services are ready - run: npx @dotenvx/dotenvx run -- docker compose --profile ci -p cat-fostering up -d + env: + DOCKER_API_TAG: ${{ env.DOCKER_API_TAG }} - run: sleep 10 diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..5c0a090 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,2 @@ +[ -n "$CI" ] && exit 0 +npx lint-staged --concurrent false --relative diff --git a/.lintstagedrc b/.lintstagedrc new file mode 100644 index 0000000..86e66f1 --- /dev/null +++ b/.lintstagedrc @@ -0,0 +1,4 @@ +{ + "*.ts": ["nx affected:lint --fix --files"], + "*": ["npx nx format:write --files"] +} diff --git a/.vscode/thunder-tests/collections/tc_col_cat-fostering.json b/.vscode/thunder-tests/collections/tc_col_cat-fostering.json index 378b0e8..706be1d 100644 --- a/.vscode/thunder-tests/collections/tc_col_cat-fostering.json +++ b/.vscode/thunder-tests/collections/tc_col_cat-fostering.json @@ -1,138 +1,138 @@ { - "_id": "68f2794f-94c6-4be1-847f-46cc09aef587", - "colName": "CatFostering", - "created": "2024-05-19T19:03:45.980Z", - "sortNum": 10000, - "folders": [], - "requests": [ + "_id": "68f2794f-94c6-4be1-847f-46cc09aef587", + "colName": "CatFostering", + "created": "2024-05-19T19:03:45.980Z", + "sortNum": 10000, + "folders": [], + "requests": [ + { + "_id": "75c7aff3-5a3e-4085-aa4f-e5fa78308a68", + "colId": "68f2794f-94c6-4be1-847f-46cc09aef587", + "containerId": "", + "name": "GET current-user", + "url": "/api/users/current-user", + "method": "GET", + "sortNum": 10000, + "created": "2024-05-19T19:05:21.811Z", + "modified": "2024-05-19T19:17:00.791Z", + "headers": [] + }, + { + "_id": "c92cb441-f570-45ab-8a46-e1be1c88b323", + "colId": "68f2794f-94c6-4be1-847f-46cc09aef587", + "containerId": "", + "name": "POST cat-profiles", + "url": "/api/cat-profiles", + "method": "POST", + "sortNum": 20000, + "created": "2024-05-19T19:07:50.514Z", + "modified": "2024-05-19T19:56:31.801Z", + "headers": [], + "body": { + "type": "json", + "raw": "{\n \"name\": \"Romeo\",\n \"description\": \"Romeo is a very playful cat, he loves to play with curtains and sleep on the couch.\",\n \"age\": 2\n}", + "form": [] + }, + "auth": { + "type": "bearer", + "bearer": "{{orySessionToken}}" + } + }, + { + "_id": "719143af-9033-4fb9-9e4d-d3f309ea4fde", + "colId": "68f2794f-94c6-4be1-847f-46cc09aef587", + "containerId": "", + "name": "PATCH cat-profiles/:id", + "url": "/api/cat-profiles/{catProfileId}", + "method": "PATCH", + "sortNum": 30000, + "created": "2024-05-19T19:10:10.851Z", + "modified": "2024-05-19T19:59:38.045Z", + "headers": [], + "params": [ { - "_id": "75c7aff3-5a3e-4085-aa4f-e5fa78308a68", - "colId": "68f2794f-94c6-4be1-847f-46cc09aef587", - "containerId": "", - "name": "GET current-user", - "url": "/api/users/current-user", - "method": "GET", - "sortNum": 10000, - "created": "2024-05-19T19:05:21.811Z", - "modified": "2024-05-19T19:17:00.791Z", - "headers": [] - }, - { - "_id": "c92cb441-f570-45ab-8a46-e1be1c88b323", - "colId": "68f2794f-94c6-4be1-847f-46cc09aef587", - "containerId": "", - "name": "POST cat-profiles", - "url": "/api/cat-profiles", - "method": "POST", - "sortNum": 20000, - "created": "2024-05-19T19:07:50.514Z", - "modified": "2024-05-19T19:56:31.801Z", - "headers": [], - "body": { - "type": "json", - "raw": "{\n \"name\": \"Romeo\",\n \"description\": \"Romeo is a very playful cat, he loves to play with curtains and sleep on the couch.\",\n \"age\": 2\n}", - "form": [] - }, - "auth": { - "type": "bearer", - "bearer": "{{orySessionToken}}" - } - }, - { - "_id": "719143af-9033-4fb9-9e4d-d3f309ea4fde", - "colId": "68f2794f-94c6-4be1-847f-46cc09aef587", - "containerId": "", - "name": "PATCH cat-profiles/:id", - "url": "/api/cat-profiles/{catProfileId}", - "method": "PATCH", - "sortNum": 30000, - "created": "2024-05-19T19:10:10.851Z", - "modified": "2024-05-19T19:59:38.045Z", - "headers": [], - "params": [ - { - "name": "catProfileId", - "value": "{{user1CatProfileId}}", - "isPath": true - } - ], - "body": { - "type": "json", - "raw": "{\n \"age\": 4\n}", - "form": [] - }, - "auth": { - "type": "bearer", - "bearer": "{{orySessionToken}}" - } - }, - { - "_id": "8360df1f-1907-47e6-9306-bf78eb2950be", - "colId": "68f2794f-94c6-4be1-847f-46cc09aef587", - "containerId": "", - "name": "POST fostering", - "url": "/api/fostering", - "method": "POST", - "sortNum": 40000, - "created": "2024-05-19T19:11:13.012Z", - "modified": "2024-05-19T19:24:11.344Z", - "headers": [], - "body": { - "type": "json", - "raw": "{\n \"catProfileId\": \"{{user1CatProfileId}}\",\n \"startDate\": \"2023-12-01\",\n \"endDate\": \"2023-12-07\"\n }", - "form": [] - }, - "auth": { - "type": "bearer", - "bearer": "{{orySessionToken}}" - } - }, - { - "_id": "733d1f15-2637-48a3-8f95-fb9bdbad2a6d", - "colId": "68f2794f-94c6-4be1-847f-46cc09aef587", - "containerId": "", - "name": "GET fostering/:id", - "url": "/api/fostering/{fosteringId}", - "method": "GET", - "sortNum": 50000, - "created": "2024-05-19T19:13:22.742Z", - "modified": "2024-05-19T19:25:16.059Z", - "headers": [], - "params": [ - { - "name": "fosteringId", - "value": "{{user2FosteringId}}", - "isPath": true - } - ] - }, + "name": "catProfileId", + "value": "{{user1CatProfileId}}", + "isPath": true + } + ], + "body": { + "type": "json", + "raw": "{\n \"age\": 4\n}", + "form": [] + }, + "auth": { + "type": "bearer", + "bearer": "{{orySessionToken}}" + } + }, + { + "_id": "8360df1f-1907-47e6-9306-bf78eb2950be", + "colId": "68f2794f-94c6-4be1-847f-46cc09aef587", + "containerId": "", + "name": "POST fostering", + "url": "/api/fostering", + "method": "POST", + "sortNum": 40000, + "created": "2024-05-19T19:11:13.012Z", + "modified": "2024-05-19T19:24:11.344Z", + "headers": [], + "body": { + "type": "json", + "raw": "{\n \"catProfileId\": \"{{user1CatProfileId}}\",\n \"startDate\": \"2023-12-01\",\n \"endDate\": \"2023-12-07\"\n }", + "form": [] + }, + "auth": { + "type": "bearer", + "bearer": "{{orySessionToken}}" + } + }, + { + "_id": "733d1f15-2637-48a3-8f95-fb9bdbad2a6d", + "colId": "68f2794f-94c6-4be1-847f-46cc09aef587", + "containerId": "", + "name": "GET fostering/:id", + "url": "/api/fostering/{fosteringId}", + "method": "GET", + "sortNum": 50000, + "created": "2024-05-19T19:13:22.742Z", + "modified": "2024-05-19T19:25:16.059Z", + "headers": [], + "params": [ { - "_id": "c80cd784-6357-4c55-84cd-69922d916146", - "colId": "68f2794f-94c6-4be1-847f-46cc09aef587", - "containerId": "", - "name": "PATCH approve fostering/:id", - "url": "/api/fostering/{fosteringId}/approve", - "method": "PATCH", - "sortNum": 60000, - "created": "2024-05-19T19:14:02.538Z", - "modified": "2024-05-19T19:27:01.544Z", - "headers": [], - "params": [ - { - "name": "fosteringId", - "value": "{{user2FosteringId}}", - "isPath": true - } - ] + "name": "fosteringId", + "value": "{{user2FosteringId}}", + "isPath": true } - ], - "settings": { - "auth": { - "type": "bearer", - "bearer": "{{orySessionToken}}" - }, - "options": { - "baseUrl": "{{baseUrl}}" + ] + }, + { + "_id": "c80cd784-6357-4c55-84cd-69922d916146", + "colId": "68f2794f-94c6-4be1-847f-46cc09aef587", + "containerId": "", + "name": "PATCH approve fostering/:id", + "url": "/api/fostering/{fosteringId}/approve", + "method": "PATCH", + "sortNum": 60000, + "created": "2024-05-19T19:14:02.538Z", + "modified": "2024-05-19T19:27:01.544Z", + "headers": [], + "params": [ + { + "name": "fosteringId", + "value": "{{user2FosteringId}}", + "isPath": true } + ] + } + ], + "settings": { + "auth": { + "type": "bearer", + "bearer": "{{orySessionToken}}" + }, + "options": { + "baseUrl": "{{baseUrl}}" } -} \ No newline at end of file + } +} diff --git a/.vscode/thunder-tests/environments/tc_env_cat-fostering-demo.json b/.vscode/thunder-tests/environments/tc_env_cat-fostering-demo.json index ee5bdba..010c1da 100644 --- a/.vscode/thunder-tests/environments/tc_env_cat-fostering-demo.json +++ b/.vscode/thunder-tests/environments/tc_env_cat-fostering-demo.json @@ -1,47 +1,47 @@ { - "_id": "11d9d233-af83-41c6-9dce-0afe40547244", - "name": "CatFostering Demo", - "default": true, - "sortNum": 20000, - "created": "2024-05-19T19:39:54.612Z", - "modified": "2024-05-19T19:39:54.612Z", - "data": [ - { - "name": "baseUrl", - "value": "http://localhost:3000" - }, - { - "name": "orySessionToken", - "value": "" - }, - { - "name": "user1Id", - "value": "" - }, - { - "name": "user1CatProfileId", - "value": "" - }, - { - "name": "user2Id", - "value": "" - }, - { - "name": "user2FosteringId", - "value": "" - }, - { - "name": "orySessionToken1", - "value": "" - }, - { - "name": "orySessionToken2", - "value": "" - }, - { - "name": "orySessionToken3", - "value": "" - } - ], - "envFile": "../../.env.demo.thunderclient" -} \ No newline at end of file + "_id": "11d9d233-af83-41c6-9dce-0afe40547244", + "name": "CatFostering Demo", + "default": false, + "sortNum": 20000, + "created": "2024-05-19T19:39:54.612Z", + "modified": "2024-05-19T19:39:54.612Z", + "data": [ + { + "name": "baseUrl", + "value": "http://localhost:3000" + }, + { + "name": "orySessionToken", + "value": "" + }, + { + "name": "user1Id", + "value": "" + }, + { + "name": "user1CatProfileId", + "value": "" + }, + { + "name": "user2Id", + "value": "" + }, + { + "name": "user2FosteringId", + "value": "" + }, + { + "name": "orySessionToken1", + "value": "" + }, + { + "name": "orySessionToken2", + "value": "" + }, + { + "name": "orySessionToken3", + "value": "" + } + ], + "envFile": "../../.env.demo.thunderclient" +} diff --git a/.vscode/thunder-tests/environments/tc_env_cat-fostering.json b/.vscode/thunder-tests/environments/tc_env_cat-fostering.json index a7db370..7da2f65 100644 --- a/.vscode/thunder-tests/environments/tc_env_cat-fostering.json +++ b/.vscode/thunder-tests/environments/tc_env_cat-fostering.json @@ -1,36 +1,35 @@ { - "_id": "361ba671-579f-4a65-86ec-00fd1a930b2d", - "name": "CatFostering", - "default": false, - "sortNum": 10000, - "created": "2024-05-19T19:05:50.272Z", - "modified": "2024-05-19T19:05:50.272Z", - "data": [ - { - "name": "baseUrl", - "value": "http://localhost:3000" - }, - { - "name": "orySessionToken", - "value": "", - "secret": true - }, - { - "name": "user1Id", - "value": "" - }, - { - "name": "user1CatProfileId", - "value": "" - }, - { - "name": "user2Id", - "value": "" - }, - { - "name": "user2FosteringId", - "value": "" - } - ], - "envFile": "../../.env.thunderclient" -} \ No newline at end of file + "_id": "361ba671-579f-4a65-86ec-00fd1a930b2d", + "name": "CatFostering", + "default": true, + "sortNum": 10000, + "created": "2024-05-19T19:05:50.272Z", + "modified": "2024-05-19T19:05:50.272Z", + "data": [ + { + "name": "baseUrl", + "value": "http://localhost:3000" + }, + { + "name": "sessionToken", + "value": "ory_st_aUFfSyTXnrTcbGbLffcxwVZ91yRdzuk1", + "secret": true + }, + { + "name": "user1Id", + "value": "" + }, + { + "name": "user1CatProfileId", + "value": "" + }, + { + "name": "user2Id", + "value": "" + }, + { + "name": "user2FosteringId", + "value": "" + } + ] +} diff --git a/.vscode/thunder-tests/environments/tc_env_local.json b/.vscode/thunder-tests/environments/tc_env_local.json index fddcd3d..a31a3f8 100644 --- a/.vscode/thunder-tests/environments/tc_env_local.json +++ b/.vscode/thunder-tests/environments/tc_env_local.json @@ -1,11 +1,11 @@ { - "_id": "3d0ba032-a98d-4a8e-925f-7f130c8f985c", - "name": "(Local Env)", - "default": false, - "global": true, - "local": true, - "sortNum": -1, - "created": "2024-05-19T19:05:35.856Z", - "modified": "2024-05-19T19:05:35.856Z", - "data": [] -} \ No newline at end of file + "_id": "3d0ba032-a98d-4a8e-925f-7f130c8f985c", + "name": "(Local Env)", + "default": false, + "global": true, + "local": true, + "sortNum": -1, + "created": "2024-05-19T19:05:35.856Z", + "modified": "2024-05-19T19:05:35.856Z", + "data": [] +} diff --git a/apps/cat-fostering-api/openapi.json b/apps/cat-fostering-api/openapi.json index c0f8677..8cb1168 100644 --- a/apps/cat-fostering-api/openapi.json +++ b/apps/cat-fostering-api/openapi.json @@ -38,9 +38,7 @@ } } }, - "tags": [ - "users" - ], + "tags": ["users"], "security": [ { "ory-action": [] @@ -74,9 +72,7 @@ } } }, - "tags": [ - "users" - ], + "tags": ["users"], "security": [ { "ory-action": [] @@ -100,9 +96,7 @@ } } }, - "tags": [ - "users" - ], + "tags": ["users"], "security": [ { "cookie": [] @@ -132,9 +126,7 @@ } } }, - "tags": [ - "cat-profiles" - ], + "tags": ["cat-profiles"], "security": [ { "cookie": [] @@ -169,9 +161,7 @@ } } }, - "tags": [ - "cat-profiles" - ], + "tags": ["cat-profiles"], "security": [ { "cookie": [] @@ -207,9 +197,7 @@ } } }, - "tags": [ - "cat-profiles" - ], + "tags": ["cat-profiles"], "security": [ { "cookie": [] @@ -253,9 +241,7 @@ } } }, - "tags": [ - "cat-profiles" - ], + "tags": ["cat-profiles"], "security": [ { "cookie": [] @@ -282,9 +268,7 @@ "description": "" } }, - "tags": [ - "cat-profiles" - ], + "tags": ["cat-profiles"], "security": [ { "cookie": [] @@ -314,9 +298,7 @@ } } }, - "tags": [ - "fostering" - ], + "tags": ["fostering"], "security": [ { "cookie": [] @@ -351,9 +333,7 @@ } } }, - "tags": [ - "fostering" - ], + "tags": ["fostering"], "security": [ { "cookie": [] @@ -389,9 +369,7 @@ } } }, - "tags": [ - "fostering" - ], + "tags": ["fostering"], "security": [ { "cookie": [] @@ -427,9 +405,7 @@ } } }, - "tags": [ - "fostering" - ], + "tags": ["fostering"], "security": [ { "cookie": [] @@ -458,9 +434,7 @@ "description": "" } }, - "tags": [ - "fostering" - ], + "tags": ["fostering"], "security": [ { "cookie": [] @@ -519,9 +493,7 @@ "type": "string" } }, - "required": [ - "email" - ] + "required": ["email"] }, "OryIdentityDto": { "type": "object", @@ -540,10 +512,7 @@ }, "state": { "type": "string", - "enum": [ - "active", - "inactive" - ] + "enum": ["active", "inactive"] }, "recovery_addresses": { "type": "array", @@ -597,9 +566,7 @@ "$ref": "#/components/schemas/OryIdentityDto" } }, - "required": [ - "identity" - ] + "required": ["identity"] }, "OnOrySignInDto": { "type": "object", @@ -608,9 +575,7 @@ "$ref": "#/components/schemas/OryIdentityDto" } }, - "required": [ - "identity" - ] + "required": ["identity"] }, "Fostering": { "type": "object", @@ -627,11 +592,7 @@ "type": "string" }, "status": { - "enum": [ - "PENDING", - "APPROVED", - "REJECTED" - ], + "enum": ["PENDING", "APPROVED", "REJECTED"], "type": "string" }, "catProfile": { @@ -677,11 +638,7 @@ } } }, - "required": [ - "id", - "name", - "email" - ] + "required": ["id", "name", "email"] }, "CatProfile": { "type": "object", @@ -718,14 +675,7 @@ } } }, - "required": [ - "id", - "name", - "age", - "description", - "photosUrls", - "owner" - ] + "required": ["id", "name", "age", "description", "photosUrls", "owner"] }, "CreateCatProfile": { "type": "object", @@ -744,11 +694,7 @@ "maxLength": 300 } }, - "required": [ - "name", - "age", - "description" - ] + "required": ["name", "age", "description"] }, "UpdateCatProfile": { "type": "object", @@ -783,12 +729,8 @@ "type": "string" } }, - "required": [ - "catProfileId", - "startDate", - "endDate" - ] + "required": ["catProfileId", "startDate", "endDate"] } } } -} \ No newline at end of file +} diff --git a/apps/cat-fostering-api/project.json b/apps/cat-fostering-api/project.json index a464feb..9ec8d14 100644 --- a/apps/cat-fostering-api/project.json +++ b/apps/cat-fostering-api/project.json @@ -12,7 +12,10 @@ "executor": "@nx/js:node", "defaultConfiguration": "local", "options": { - "buildTarget": "cat-fostering-api:build" + "buildTarget": "cat-fostering-api:build", + "runBuildTargetDependencies": false, + "watch": true, + "debounce": 500 }, "configurations": { "local": { @@ -41,9 +44,12 @@ } } }, - "docker-push": { + "container": { "executor": "@nx-tools/nx-container:build", - "inputs": ["production", "^production"], + "inputs": [ + "dockerFiles", + { "dependentTasksOutputFiles": "**/dist/**/*", "transitive": true } + ], "dependsOn": ["lint", "build"], "options": { "file": "apps/cat-fostering-api/Dockerfile", diff --git a/apps/cat-fostering-api/webpack.config.js b/apps/cat-fostering-api/webpack.config.js index 8f654b2..629d085 100644 --- a/apps/cat-fostering-api/webpack.config.js +++ b/apps/cat-fostering-api/webpack.config.js @@ -1,6 +1,9 @@ const { NxWebpackPlugin } = require('@nx/webpack'); const { join } = require('path'); +/** + * @type {import('webpack').Configuration} + */ module.exports = { output: { path: join(__dirname, '../../dist/apps/cat-fostering-api'), @@ -29,4 +32,8 @@ module.exports = { ], }), ], + // not working, why? + // watchOptions: { + // ignored: ['**/openapi.json'], + // }, }; diff --git a/docker-compose.yaml b/docker-compose.yaml index f9318b4..de39b2b 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -49,7 +49,7 @@ services: - dev api: - image: ghcr.io/getlarge/cat-fostering/cat-fostering-api:dev + image: ghcr.io/getlarge/cat-fostering/cat-fostering-api:${DOCKER_API_TAG:-dev} pull_policy: never depends_on: - postgres diff --git a/package-lock.json b/package-lock.json index 9208de7..39b0834 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,10 +93,12 @@ "eslint-plugin-import": "^2.29.0", "eslint-plugin-playwright": "^0.15.3", "eslint-plugin-simple-import-sort": "^12.0.0", + "husky": "^9.1.4", "jest": "^29.4.1", "jest-environment-jsdom": "^29.4.1", "jest-environment-node": "^29.4.1", "jest-preset-angular": "~14.0.3", + "lint-staged": "^15.2.8", "nx": "19.3.1", "patch-package": "^8.0.0", "prettier": "^2.6.2", @@ -10586,11 +10588,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -11057,6 +11059,72 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -12191,9 +12259,9 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -12728,6 +12796,18 @@ "node": ">=4" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", @@ -13774,9 +13854,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -14242,6 +14322,18 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -14835,6 +14927,21 @@ "node": ">=10.17.0" } }, + "node_modules/husky": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.4.tgz", + "integrity": "sha512-bho94YyReb4JV7LYWRWxZ/xr6TtOTt8cMfmQ39MQYJ7f/YE268s3GdghGwi+y4zAeqewE5zYLvuhV0M0ijsDEA==", + "dev": true, + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -16792,6 +16899,302 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/lint-staged": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.8.tgz", + "integrity": "sha512-PUWFf2zQzsd9EFU+kM1d7UP+AZDbKFKuj+9JNVTBkhUFhbg4MAt6WfyMMwBfM4lYqd4D2Jwac5iuTu9rVj4zCQ==", + "dev": true, + "dependencies": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.7", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/listr2": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -16871,6 +17274,208 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/logform": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", @@ -17022,11 +17627,11 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -17071,6 +17676,18 @@ "node": ">=6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mini-css-extract-plugin": { "version": "2.4.7", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.7.tgz", @@ -18817,6 +19434,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -20445,6 +21074,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -21056,6 +21691,46 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -21321,6 +21996,15 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", diff --git a/package.json b/package.json index aefdc01..a8b885b 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "docker:dev:clean": "docker compose --profile dev -p cat-fostering down -v --rmi all", "docker:caddy:build": "docker buildx build infra/caddy -f infra/caddy/Dockerfile -t ghcr.io/getlarge/cat-fostering/caddy --load", "docker:caddy:push": "docker buildx build infra/caddy -f infra/caddy/Dockerfile --platform linux/amd64,linux/arm64 -t ghcr.io/getlarge/cat-fostering/caddy --push", - "postinstall": "patch-package" + "postinstall": "patch-package", + "prepare": "husky" }, "private": true, "dependencies": { @@ -99,10 +100,12 @@ "eslint-plugin-import": "^2.29.0", "eslint-plugin-playwright": "^0.15.3", "eslint-plugin-simple-import-sort": "^12.0.0", + "husky": "^9.1.4", "jest": "^29.4.1", "jest-environment-jsdom": "^29.4.1", "jest-environment-node": "^29.4.1", "jest-preset-angular": "~14.0.3", + "lint-staged": "^15.2.8", "nx": "19.3.1", "patch-package": "^8.0.0", "prettier": "^2.6.2", diff --git a/tools/tsconfig.json b/tools/tsconfig.json index 6db2d7c..cc297b8 100644 --- a/tools/tsconfig.json +++ b/tools/tsconfig.json @@ -3,9 +3,7 @@ "ts-node": { "transpileOnly": true, "files": true, - "require": [ - "tsconfig-paths/register" - ], + "require": ["tsconfig-paths/register"], "esm": false, "compilerOptions": { // compilerOptions specified here will override those declared below, @@ -13,21 +11,15 @@ // different options with a single tsconfig.json. "module": "CommonJS", "target": "es2021", - "lib": [ - "es2021" - ], + "lib": ["es2021"], "strict": true } }, "compilerOptions": { "module": "CommonJS", - "types": [ - "node" - ], + "types": ["node"], "target": "es2021", - "lib": [ - "es2021" - ], + "lib": ["es2021"], "noEmitHelpers": true, "importHelpers": true, "emitDecoratorMetadata": true, @@ -36,10 +28,6 @@ "esModuleInterop": true, "resolveJsonModule": true }, - "include": [ - "**/*.ts" - ], - "types": [ - "node" - ] + "include": ["**/*.ts"], + "types": ["node"] }