diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1291def..823fcd0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,7 +9,6 @@ jobs: build-and-test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - uses: docker/setup-buildx-action@v3 diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..2312dc5 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npx lint-staged diff --git a/.lintstagedrc b/.lintstagedrc new file mode 100644 index 0000000..6132848 --- /dev/null +++ b/.lintstagedrc @@ -0,0 +1,3 @@ +{ + "**/*": "npx prettier --write --ignore-unknown" +} diff --git a/Dockerfile b/Dockerfile index e6e3333..6d91f5f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ # Stage 1: Build the Angular Application # ========================================= ARG NODE_VERSION=24-alpine -ARG NGINX_VERSION=alpine3.21 +ARG NGINX_VERSION=1.28.0-alpine3.21 # Use a lightweight Node.js image for building (customizable via ARG) diff --git a/Dockerfile.dev b/Dockerfile.dev index c287b2a..a9804f8 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -20,8 +20,6 @@ COPY package.json package-lock.json ./ # Install dependencies using npm with caching to speed up subsequent builds RUN --mount=type=cache,target=/root/.npm npm ci -# Create a safe npm cache inside the container -RUN npm ci # Copy all application source files into the container COPY . . diff --git a/apps/shell-mobile/src/global.scss b/apps/shell-mobile/src/global.scss index b29ccda..f15a193 100644 --- a/apps/shell-mobile/src/global.scss +++ b/apps/shell-mobile/src/global.scss @@ -21,8 +21,6 @@ * https://ionicframework.com/docs/theming/dark-mode */ -/* @import url('@ionic/angular/css/palettes/dark.always.css'); */ -/* @import url('@ionic/angular/css/palettes/dark.class.css'); */ @import url('@ionic/angular/css/palettes/dark.system.css'); .apexcharts-legend-text { color: var(--ion-text-color) !important; diff --git a/apps/shell-mobile/src/theme/variables.scss b/apps/shell-mobile/src/theme/variables.scss index d214535..e69de29 100644 --- a/apps/shell-mobile/src/theme/variables.scss +++ b/apps/shell-mobile/src/theme/variables.scss @@ -1,243 +0,0 @@ -// // Ionic Variables and Theming. For more info, please see: -// // http://ionicframework.com/docs/theming/ - -// /** Ionic CSS Variables **/ -// :root { -// /** primary **/ -// --ion-color-primary: #3880ff; -// --ion-color-primary-rgb: 56, 128, 255; -// --ion-color-primary-contrast: #ffffff; -// --ion-color-primary-contrast-rgb: 255, 255, 255; -// --ion-color-primary-shade: #3171e0; -// --ion-color-primary-tint: #4c8dff; - -// /** secondary **/ -// --ion-color-secondary: #3dc2ff; -// --ion-color-secondary-rgb: 61, 194, 255; -// --ion-color-secondary-contrast: #ffffff; -// --ion-color-secondary-contrast-rgb: 255, 255, 255; -// --ion-color-secondary-shade: #36abe0; -// --ion-color-secondary-tint: #50c8ff; - -// /** tertiary **/ -// --ion-color-tertiary: #5260ff; -// --ion-color-tertiary-rgb: 82, 96, 255; -// --ion-color-tertiary-contrast: #ffffff; -// --ion-color-tertiary-contrast-rgb: 255, 255, 255; -// --ion-color-tertiary-shade: #4854e0; -// --ion-color-tertiary-tint: #6370ff; - -// /** success **/ -// --ion-color-success: #2dd36f; -// --ion-color-success-rgb: 45, 211, 111; -// --ion-color-success-contrast: #ffffff; -// --ion-color-success-contrast-rgb: 255, 255, 255; -// --ion-color-success-shade: #28ba62; -// --ion-color-success-tint: #42d77d; - -// /** warning **/ -// --ion-color-warning: #ffc409; -// --ion-color-warning-rgb: 255, 196, 9; -// --ion-color-warning-contrast: #000000; -// --ion-color-warning-contrast-rgb: 0, 0, 0; -// --ion-color-warning-shade: #e0ac08; -// --ion-color-warning-tint: #ffca22; - -// /** danger **/ -// --ion-color-danger: #eb445a; -// --ion-color-danger-rgb: 235, 68, 90; -// --ion-color-danger-contrast: #ffffff; -// --ion-color-danger-contrast-rgb: 255, 255, 255; -// --ion-color-danger-shade: #cf3c4f; -// --ion-color-danger-tint: #ed576b; - -// /** dark **/ -// --ion-color-dark: #222428; -// --ion-color-dark-rgb: 34, 36, 40; -// --ion-color-dark-contrast: #ffffff; -// --ion-color-dark-contrast-rgb: 255, 255, 255; -// --ion-color-dark-shade: #1e2023; -// --ion-color-dark-tint: #383a3e; - -// /** medium **/ -// --ion-color-medium: #92949c; -// --ion-color-medium-rgb: 146, 148, 156; -// --ion-color-medium-contrast: #ffffff; -// --ion-color-medium-contrast-rgb: 255, 255, 255; -// --ion-color-medium-shade: #808289; -// --ion-color-medium-tint: #9d9fa6; - -// /** light **/ -// --ion-color-light: #f4f5f8; -// --ion-color-light-rgb: 244, 245, 248; -// --ion-color-light-contrast: #000000; -// --ion-color-light-contrast-rgb: 0, 0, 0; -// --ion-color-light-shade: #d7d8da; -// --ion-color-light-tint: #f5f6f9; -// } - -// @media (prefers-color-scheme: dark) { -// /* -// * Dark Colors -// * ------------------------------------------- -// */ - -// body { -// --ion-color-primary: #428cff; -// --ion-color-primary-rgb: 66,140,255; -// --ion-color-primary-contrast: #ffffff; -// --ion-color-primary-contrast-rgb: 255,255,255; -// --ion-color-primary-shade: #3a7be0; -// --ion-color-primary-tint: #5598ff; - -// --ion-color-secondary: #50c8ff; -// --ion-color-secondary-rgb: 80,200,255; -// --ion-color-secondary-contrast: #ffffff; -// --ion-color-secondary-contrast-rgb: 255,255,255; -// --ion-color-secondary-shade: #46b0e0; -// --ion-color-secondary-tint: #62ceff; - -// --ion-color-tertiary: #6a64ff; -// --ion-color-tertiary-rgb: 106,100,255; -// --ion-color-tertiary-contrast: #ffffff; -// --ion-color-tertiary-contrast-rgb: 255,255,255; -// --ion-color-tertiary-shade: #5d58e0; -// --ion-color-tertiary-tint: #7974ff; - -// --ion-color-success: #2fdf75; -// --ion-color-success-rgb: 47,223,117; -// --ion-color-success-contrast: #000000; -// --ion-color-success-contrast-rgb: 0,0,0; -// --ion-color-success-shade: #29c467; -// --ion-color-success-tint: #44e283; - -// --ion-color-warning: #ffd534; -// --ion-color-warning-rgb: 255,213,52; -// --ion-color-warning-contrast: #000000; -// --ion-color-warning-contrast-rgb: 0,0,0; -// --ion-color-warning-shade: #e0bb2e; -// --ion-color-warning-tint: #ffd948; - -// --ion-color-danger: #ff4961; -// --ion-color-danger-rgb: 255,73,97; -// --ion-color-danger-contrast: #ffffff; -// --ion-color-danger-contrast-rgb: 255,255,255; -// --ion-color-danger-shade: #e04055; -// --ion-color-danger-tint: #ff5b71; - -// --ion-color-dark: #f4f5f8; -// --ion-color-dark-rgb: 244,245,248; -// --ion-color-dark-contrast: #000000; -// --ion-color-dark-contrast-rgb: 0,0,0; -// --ion-color-dark-shade: #d7d8da; -// --ion-color-dark-tint: #f5f6f9; - -// --ion-color-medium: #989aa2; -// --ion-color-medium-rgb: 152,154,162; -// --ion-color-medium-contrast: #000000; -// --ion-color-medium-contrast-rgb: 0,0,0; -// --ion-color-medium-shade: #86888f; -// --ion-color-medium-tint: #a2a4ab; - -// --ion-color-light: #222428; -// --ion-color-light-rgb: 34,36,40; -// --ion-color-light-contrast: #ffffff; -// --ion-color-light-contrast-rgb: 255,255,255; -// --ion-color-light-shade: #1e2023; -// --ion-color-light-tint: #383a3e; -// } - -// /* -// * iOS Dark Theme -// * ------------------------------------------- -// */ - -// .ios body { -// --ion-background-color: #000000; -// --ion-background-color-rgb: 0,0,0; - -// --ion-text-color: #ffffff; -// --ion-text-color-rgb: 255,255,255; - -// --ion-color-step-50: #0d0d0d; -// --ion-color-step-100: #1a1a1a; -// --ion-color-step-150: #262626; -// --ion-color-step-200: #333333; -// --ion-color-step-250: #404040; -// --ion-color-step-300: #4d4d4d; -// --ion-color-step-350: #595959; -// --ion-color-step-400: #666666; -// --ion-color-step-450: #737373; -// --ion-color-step-500: #808080; -// --ion-color-step-550: #8c8c8c; -// --ion-color-step-600: #999999; -// --ion-color-step-650: #a6a6a6; -// --ion-color-step-700: #b3b3b3; -// --ion-color-step-750: #bfbfbf; -// --ion-color-step-800: #cccccc; -// --ion-color-step-850: #d9d9d9; -// --ion-color-step-900: #e6e6e6; -// --ion-color-step-950: #f2f2f2; - -// --ion-item-background: #000000; - -// --ion-card-background: #1c1c1d; -// } - -// .ios ion-modal { -// --ion-background-color: var(--ion-color-step-100); -// --ion-toolbar-background: var(--ion-color-step-150); -// --ion-toolbar-border-color: var(--ion-color-step-250); -// } - -// /* -// * Material Design Dark Theme -// * ------------------------------------------- -// */ - -// .md body { -// --ion-background-color: #121212; -// --ion-background-color-rgb: 18,18,18; - -// --ion-text-color: #ffffff; -// --ion-text-color-rgb: 255,255,255; - -// --ion-border-color: #222222; - -// --ion-color-step-50: #1e1e1e; -// --ion-color-step-100: #2a2a2a; -// --ion-color-step-150: #363636; -// --ion-color-step-200: #414141; -// --ion-color-step-250: #4d4d4d; -// --ion-color-step-300: #595959; -// --ion-color-step-350: #656565; -// --ion-color-step-400: #717171; -// --ion-color-step-450: #7d7d7d; -// --ion-color-step-500: #898989; -// --ion-color-step-550: #949494; -// --ion-color-step-600: #a0a0a0; -// --ion-color-step-650: #acacac; -// --ion-color-step-700: #b8b8b8; -// --ion-color-step-750: #c4c4c4; -// --ion-color-step-800: #d0d0d0; -// --ion-color-step-850: #dbdbdb; -// --ion-color-step-900: #e7e7e7; -// --ion-color-step-950: #f3f3f3; - -// --ion-item-background: #1e1e1e; - -// --ion-toolbar-background: #1f1f1f; - -// --ion-tab-bar-background: #1f1f1f; - -// --ion-card-background: #1e1e1e; -// } -// } - -// html { -// /* -// * For more information on dynamic font scaling, visit the documentation: -// * https://ionicframework.com/docs/layout/dynamic-font-scaling -// */ -// --ion-dynamic-font: var(--ion-default-dynamic-font); -// } diff --git a/eslint.config.mjs b/eslint.config.mjs index dd2aab6..23d5c23 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -9,7 +9,13 @@ export default [ ...nx.configs['flat/javascript'], ...angular.configs.tsRecommended, { - ignores: ['**/dist', '**/vite.config.*.timestamp*', '**/vitest.config.*.timestamp*'], + ignores: [ + '**/dist', + '**/vite.config.*.timestamp*', + '**/vitest.config.*.timestamp*', + 'apps/shell-mobile/android', + 'libs/open-api/src', + ], }, ...tseslint.configs.recommended.map(cfg => ({ files: ['**/*.ts', '**/*.tsx'], diff --git a/libs/air-quality/package.json b/libs/air-quality/package.json index 1336a5d..ca0ca32 100644 --- a/libs/air-quality/package.json +++ b/libs/air-quality/package.json @@ -2,21 +2,21 @@ "name": "air-quality", "version": "0.0.1", "peerDependencies": { - "@angular/core": "20.3.0", + "@angular/core": "21.0.0", "@frontend/open-api": "0.0.1", - "@nx/angular": "21.5.2", + "@nx/angular": "22.5.3", "vite": "6.3.6", - "@analogjs/vite-plugin-angular": "1.21.0", - "@nx/vite": "21.5.2", + "@analogjs/vite-plugin-angular": "2.3.0", + "@nx/vite": "22.5.3", "rxjs": "7.8.0", "@frontend/shared": "0.0.1", - "@angular/forms": "20.3.0", + "@angular/forms": "21.0.0", "apexcharts": "5.3.5", - "@angular/common": "20.3.0", - "@angular/router": "20.3.0", - "@ngrx/store": "20.0.1", - "@ngrx/effects": "20.0.1", - "@ngrx/operators": "20.0.1" + "@angular/common": "21.0.0", + "@angular/router": "21.0.0", + "@ngrx/store": "21.0.0", + "@ngrx/effects": "21.0.0", + "@ngrx/operators": "21.0.0" }, "sideEffects": false } diff --git a/libs/repositories/package.json b/libs/repositories/package.json index e5a462b..df241e1 100644 --- a/libs/repositories/package.json +++ b/libs/repositories/package.json @@ -2,16 +2,16 @@ "name": "@frontend/repositories", "version": "0.0.1", "peerDependencies": { - "@angular/common": "20.3.0", - "@angular/core": "20.3.0", + "@angular/common": "21.0.0", + "@angular/core": "21.0.0", "rxjs": "7.8.0", - "@nx/angular": "21.5.2", + "@nx/angular": "22.5.3", "vite": "6.3.6", - "@analogjs/vite-plugin-angular": "1.21.0", - "@nx/vite": "21.5.2", - "@angular/cdk": "20.2.4", + "@analogjs/vite-plugin-angular": "2.3.0", + "@nx/vite": "22.5.3", + "@angular/cdk": "21.0.0", "@frontend/shared": "0.0.1", - "@ngrx/signals": "20.0.1" + "@ngrx/signals": "21.0.0" }, "sideEffects": false } diff --git a/libs/shared/package.json b/libs/shared/package.json index fc64d83..2ad3d7d 100644 --- a/libs/shared/package.json +++ b/libs/shared/package.json @@ -2,13 +2,13 @@ "name": "@frontend/shared", "version": "0.0.1", "peerDependencies": { - "@angular/common": "20.3.0", - "@angular/core": "20.3.0", - "@nx/angular": "21.5.2", + "@angular/common": "21.0.0", + "@angular/core": "21.0.0", + "@nx/angular": "22.5.3", "vite": "6.3.6", - "@analogjs/vite-plugin-angular": "1.21.0", - "@nx/vite": "21.5.2", - "@angular/forms": "20.3.0", + "@analogjs/vite-plugin-angular": "2.3.0", + "@nx/vite": "22.5.3", + "@angular/forms": "21.0.0", "apexcharts": "5.3.5" }, "sideEffects": false diff --git a/package-lock.json b/package-lock.json index c4c31db..0dde32b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,11 +16,11 @@ "@angular/forms": "21.0.0", "@angular/platform-browser": "21.0.0", "@angular/router": "21.0.0", - "@capacitor/android": "^7.4.3", - "@capacitor/angular": "^2.0.3", - "@capacitor/cli": "^7.4.3", - "@capacitor/core": "^7.4.3", - "@ionic/angular": "^8.7.5", + "@capacitor/android": "7.4.3", + "@capacitor/angular": "2.0.3", + "@capacitor/cli": "7.4.3", + "@capacitor/core": "7.4.3", + "@ionic/angular": "8.7.5", "@ngrx/effects": "21.0.0", "@ngrx/operators": "21.0.0", "@ngrx/signals": "21.0.0", @@ -68,9 +68,11 @@ "eslint-config-prettier": "10.0.0", "eslint-plugin-cypress": "3.5.0", "eslint-plugin-sonarjs": "3.0.5", + "husky": "^9.1.7", "jiti": "2.4.2", "jsdom": "22.1.0", "jsonc-eslint-parser": "2.1.0", + "lint-staged": "^16.2.7", "ng-morph": "4.8.4", "ng-packagr": "21.1.0", "nx": "22.5.3", @@ -3317,12 +3319,12 @@ "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@capacitor/android": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-7.5.0.tgz", - "integrity": "sha512-VjESuJYzQQH4vxvrOQV0yXuDv3Gx1bfb6YpAkoGfUHe0kiw0LY5nh5Kn7I5bI9hlht9SJ8YmSsCgFeMNyzKoWQ==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-7.4.3.tgz", + "integrity": "sha512-VpjvnOcmYGPLgvXRhe3CGLs62Cg7sxOyp77NddCr+Y06qqgnoaj6OGeBVTc2DZlqZ6bSmh15JvFu82pkvmdgfQ==", "license": "MIT", "peerDependencies": { - "@capacitor/core": "^7.5.0" + "@capacitor/core": "^7.4.0" } }, "node_modules/@capacitor/angular": { @@ -3339,9 +3341,9 @@ } }, "node_modules/@capacitor/cli": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-7.5.0.tgz", - "integrity": "sha512-mlohsvLZjWrO5eAVTn1+dABNQwQawcphVp6NQVJZ3I4x2BAoNmJj53QflX7PYGUipL9gF9EM9Yiku3m1McxFZg==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-7.4.3.tgz", + "integrity": "sha512-SWozpdDgrbQ/ry1nIapugDFvE9z+l22BmU/+fpgL2Zv5487hGdXvCX5+1SluuFBP3IPpx6b4LjsKnBigyJoUWg==", "license": "MIT", "dependencies": { "@ionic/cli-framework-output": "^2.2.8", @@ -3352,13 +3354,13 @@ "env-paths": "^2.2.0", "fs-extra": "^11.2.0", "kleur": "^4.1.5", - "native-run": "^2.0.3", + "native-run": "^2.0.1", "open": "^8.4.0", "plist": "^3.1.0", "prompts": "^2.4.2", "rimraf": "^6.0.1", "semver": "^7.6.3", - "tar": "^7.5.3", + "tar": "^6.1.11", "tslib": "^2.8.1", "xml2js": "^0.6.2" }, @@ -3370,16 +3372,119 @@ "node": ">=20.0.0" } }, + "node_modules/@capacitor/cli/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/@capacitor/cli/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@capacitor/cli/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@capacitor/cli/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/@capacitor/cli/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@capacitor/cli/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@capacitor/cli/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@capacitor/cli/node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@capacitor/cli/node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/@capacitor/cli/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/@capacitor/core": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-7.5.0.tgz", - "integrity": "sha512-4Y4trISe2Bp3lwsoGFoQIvgX4hiZO8S1Slmbz6oFaMxAuEc4noipQGCQx974PF4glwVVe/8+H3P9iEmCXtrUgA==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-7.4.3.tgz", + "integrity": "sha512-wCWr8fQ9Wxn0466vPg7nMn0tivbNVjNy1yL4GvDSIZuZx7UpU2HeVGNe9QjN/quEd+YLRFeKEBLBw619VqUiNg==", "license": "MIT", "dependencies": { "tslib": "^2.1.0" @@ -4512,12 +4617,12 @@ } }, "node_modules/@ionic/angular": { - "version": "8.7.18", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-8.7.18.tgz", - "integrity": "sha512-au4T0GVskFqr9IKf1iibsC0XB8XoJpvht7s7MOrIJxuZ+p2zT+ZOm0TXAIE7uRc0qBo99RwFcpPr0fsToDtr+w==", + "version": "8.7.5", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-8.7.5.tgz", + "integrity": "sha512-dnNVnC4j7ahLD2WN4AbplchCLufwKlgk0sykliKKt27VmWrPytlIxfXJA3eme1k5AAL7MmFXzOeVtF9r7DN+pA==", "license": "MIT", "dependencies": { - "@ionic/core": "8.7.18", + "@ionic/core": "8.7.5", "ionicons": "^8.0.13", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" @@ -4854,17 +4959,14 @@ } }, "node_modules/@ionic/core": { - "version": "8.7.18", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.18.tgz", - "integrity": "sha512-KUp91+XFTSAhOTLOIj7rY6j44guxI/gaR0S6bUZ/+65qZIuftRcETKb54yQ0COqn0lgAgQnkuYdWyH1uRPHsEA==", + "version": "8.7.5", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.5.tgz", + "integrity": "sha512-Uk1qdGPoLHaVhd2FnYSAvRehd3VwwcPIfXaR51qiC7C2L5VhD27VyLSgDetc15G4U+VAIFjgUSR/pKdLFEuMPA==", "license": "MIT", "dependencies": { - "@stencil/core": "4.38.0", + "@stencil/core": "4.36.2", "ionicons": "^8.0.13", "tslib": "^2.1.0" - }, - "engines": { - "node": ">= 16" } }, "node_modules/@ionic/utils-array": { @@ -5035,6 +5137,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, "license": "ISC", "dependencies": { "minipass": "^7.0.4" @@ -11856,9 +11959,9 @@ "license": "MIT" }, "node_modules/@stencil/core": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.38.0.tgz", - "integrity": "sha512-oC3QFKO0X1yXVvETgc8OLY525MNKhn9vISBrbtKnGoPlokJ6rI8Vk1RK22TevnNrHLI4SExNLbcDnqilKR35JQ==", + "version": "4.36.2", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz", + "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==", "license": "MIT", "bin": { "stencil": "bin/stencil" @@ -15074,6 +15177,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": ">=18" @@ -19525,6 +19629,22 @@ "node": ">=8.12.0" } }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/hyperdyperid": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", @@ -21019,6 +21139,41 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/lint-staged": { + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz", + "integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^14.0.2", + "listr2": "^9.0.5", + "micromatch": "^4.0.8", + "nano-spawn": "^2.0.0", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.8.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/listr2": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", @@ -22008,6 +22163,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, "license": "MIT", "dependencies": { "minipass": "^7.1.2" @@ -22167,6 +22323,19 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/nano-spawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", + "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -24290,6 +24459,19 @@ "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, + "license": "MIT", + "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", @@ -27742,6 +27924,16 @@ "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, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -28133,6 +28325,7 @@ "version": "7.5.9", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -28166,6 +28359,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": ">=18" diff --git a/package.json b/package.json index 9a821d9..fc5b948 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,10 @@ "start:shell": "nx serve shell", "build:shell": "npx nx build shell --prod", "test": "npx nx run-many --target=test --all", - "lint": "npx nx run-many --target=lint --all --exclude=open-api --verbose", - "prettier": "npx prettier . --write", - "openapi:generator": "npx openapi-generator-cli generate && npm run prettier" + "lint": "npx nx run-many --target=lint --all --fix", + "prettier": "npx prettier . --write --ignore-unknown", + "openapi:generator": "npx openapi-generator-cli generate", + "prepare": "husky" }, "private": true, "dependencies": { @@ -19,11 +20,11 @@ "@angular/forms": "21.0.0", "@angular/platform-browser": "21.0.0", "@angular/router": "21.0.0", - "@capacitor/android": "^7.4.3", - "@capacitor/angular": "^2.0.3", - "@capacitor/cli": "^7.4.3", - "@capacitor/core": "^7.4.3", - "@ionic/angular": "^8.7.5", + "@capacitor/android": "7.4.3", + "@capacitor/angular": "2.0.3", + "@capacitor/cli": "7.4.3", + "@capacitor/core": "7.4.3", + "@ionic/angular": "8.7.5", "@ngrx/effects": "21.0.0", "@ngrx/operators": "21.0.0", "@ngrx/signals": "21.0.0", @@ -71,9 +72,11 @@ "eslint-config-prettier": "10.0.0", "eslint-plugin-cypress": "3.5.0", "eslint-plugin-sonarjs": "3.0.5", + "husky": "^9.1.7", "jiti": "2.4.2", "jsdom": "22.1.0", "jsonc-eslint-parser": "2.1.0", + "lint-staged": "^16.2.7", "ng-morph": "4.8.4", "ng-packagr": "21.1.0", "nx": "22.5.3",