From 66fc5b1f15f8d3d237727d353293974aa027eb8b Mon Sep 17 00:00:00 2001 From: Ruslan Lekhman Date: Mon, 21 Oct 2024 12:36:32 -0600 Subject: [PATCH] feat: add placesAutocompleteRequest, placesAutocompleteDebounceTime, addressLine2, regionCode --- package-lock.json | 1164 +++++++++++------ package.json | 39 +- .../ngx-google-maps-places-api/package.json | 3 +- .../lib/ngx-google-maps-places-api.service.ts | 26 +- .../src/lib/ngx-google-maps-places.types.ts | 4 +- .../src/app/app.component.html | 20 + .../src/app/app.component.ts | 4 +- .../README.md | 12 +- .../package.json | 1 + ...maps-places-autocomplete.directive.spec.ts | 134 +- ...ogle-maps-places-autocomplete.directive.ts | 185 +-- 11 files changed, 1032 insertions(+), 560 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb7dc2f..0d1b03c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,33 +10,33 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@angular/animations": "^18.2.5", - "@angular/cdk": "^18.2.5", - "@angular/common": "^18.2.5", - "@angular/compiler": "^18.2.5", - "@angular/core": "^18.2.5", - "@angular/forms": "^18.2.5", - "@angular/google-maps": "^18.2.5", - "@angular/material": "^18.2.5", - "@angular/platform-browser": "^18.2.5", - "@angular/platform-browser-dynamic": "^18.2.5", - "@angular/router": "^18.2.5", + "@angular/animations": "^18.2.8", + "@angular/cdk": "^18.2.9", + "@angular/common": "^18.2.8", + "@angular/compiler": "^18.2.8", + "@angular/core": "^18.2.8", + "@angular/forms": "^18.2.8", + "@angular/google-maps": "^18.2.9", + "@angular/material": "^18.2.9", + "@angular/platform-browser": "^18.2.8", + "@angular/platform-browser-dynamic": "^18.2.8", + "@angular/router": "^18.2.8", "rxjs": "~7.8.1", - "tslib": "^2.7.0", + "tslib": "^2.8.0", "zone.js": "~0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^18.2.5", - "@angular/cli": "^18.2.5", - "@angular/compiler-cli": "^18.2.5", + "@angular-devkit/build-angular": "^18.2.9", + "@angular/cli": "^18.2.9", + "@angular/compiler-cli": "^18.2.8", "@commitlint/cli": ">=19.5.0", "@commitlint/config-conventional": ">=19.5.0", "@commitlint/format": ">=19.5.0", - "@types/google.maps": "^3.58.0", + "@types/google.maps": "^3.58.1", "@types/jest": "^29.5.13", - "angular-eslint": "18.3.1", + "angular-eslint": "18.4.0", "conventional-changelog-angular": ">=8.0.0", - "eslint": "^9.9.1", + "eslint": "^9.13.0", "husky": "^9.1.6", "is-ci": ">=3.0.1", "jest": "^29.7.0", @@ -47,7 +47,8 @@ "npm-run-all": "^4.1.5", "standard-version": ">=9.5.0", "typescript": "~5.5.2", - "typescript-eslint": "8.2.0" + "typescript-eslint": "8.11.0", + "validate-branch-name": "^1.3.1" } }, "node_modules/@ampproject/remapping": { @@ -65,13 +66,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1802.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.5.tgz", - "integrity": "sha512-c7sVoW85Yqj7IYvNKxtNSGS5I7gWpORorg/xxLZX3OkHWXDrwYbb5LN/2p5/Aytxyb0aXl4o5fFOu6CUwcaLUw==", + "version": "0.1802.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.9.tgz", + "integrity": "sha512-fubJf4WC/t3ITy+tyjI4/CKKwUP4XJTmV+Y0nyPcrkcthVyUcIpZB74NlUOvg6WECiPQuIc+CtoAaA9X5+RQ5Q==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "18.2.5", + "@angular-devkit/core": "18.2.9", "rxjs": "7.8.1" }, "engines": { @@ -81,17 +82,17 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.5.tgz", - "integrity": "sha512-dIvb0AHoRIMM6tLuG4t6lDDslSAYP77wqytodsN317UzFOuuCPernXbO8NJs+QHxj09nPsem1T5vnvpO2E/PVQ==", + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.9.tgz", + "integrity": "sha512-d4W6t9vBozFUmOP2VvihMcSg/zgr3AvJY6/b7OPuATlK+W3P6tmsqxGIQ6eKc1TxXeu3lWhi14mV2pPykfrwfA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.5", - "@angular-devkit/build-webpack": "0.1802.5", - "@angular-devkit/core": "18.2.5", - "@angular/build": "18.2.5", + "@angular-devkit/architect": "0.1802.9", + "@angular-devkit/build-webpack": "0.1802.9", + "@angular-devkit/core": "18.2.9", + "@angular/build": "18.2.9", "@babel/core": "7.25.2", "@babel/generator": "7.25.0", "@babel/helper-annotate-as-pure": "7.24.7", @@ -102,7 +103,7 @@ "@babel/preset-env": "7.25.3", "@babel/runtime": "7.25.0", "@discoveryjs/json-ext": "0.6.1", - "@ngtools/webpack": "18.2.5", + "@ngtools/webpack": "18.2.9", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", @@ -217,13 +218,13 @@ "license": "0BSD" }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1802.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.5.tgz", - "integrity": "sha512-6qkcrWBdkxojCVHGWcdJaz4G+7QTjFvmc+3g8xvLc9sYvJq1I059gfXhDnC0FxiA0MT4cY/26ECYWUHTD5CJLQ==", + "version": "0.1802.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.9.tgz", + "integrity": "sha512-p7xNGo5ZTV/Z0Rk+q2/E68QQLw9VT33kauDh6s010jIeBLrOwMo74JpzXMSFttQo5O4bLKP8IORzIM+0q7Uzjg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1802.5", + "@angular-devkit/architect": "0.1802.9", "rxjs": "7.8.1" }, "engines": { @@ -237,9 +238,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.5.tgz", - "integrity": "sha512-r9TumPlJ8PvA2+yz4sp+bUHgtznaVKzhvXTN5qL1k4YP8LJ7iZWMR2FOP+HjukHZOTsenzmV9pszbogabqwoZQ==", + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.9.tgz", + "integrity": "sha512-bsVt//5E0ua7FZfO0dCF/qGGY6KQD34/bNGyRu5B6HedimpdU2/0PGDptksU5v3yKEc9gNw0xC6mT0UsY/R9pA==", "dev": true, "license": "MIT", "dependencies": { @@ -265,13 +266,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.5.tgz", - "integrity": "sha512-NUmz2UQ1Xl4cf4j1AgkwIfsCjBzAPgfeC3IBrD29hSOBE1Y3j6auqjBkvw50v6mbSPxESND995Xy13HpK1Xflw==", + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.9.tgz", + "integrity": "sha512-aIY5/IomDOINGCtFYi77uo0acDpdQNNCighfBBUGEBNMQ1eE3oGNGpLAH/qWeuxJndgmxrdKsvws9DdT46kLig==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "18.2.5", + "@angular-devkit/core": "18.2.9", "jsonc-parser": "3.3.1", "magic-string": "0.30.11", "ora": "5.4.1", @@ -284,9 +285,9 @@ } }, "node_modules/@angular-eslint/builder": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.3.1.tgz", - "integrity": "sha512-cPc7Ye9zDs5M4i+feL6vob+mh7yX5vxvOS5KQIhneUrp5e9D+IGuNFMmBLlOPpmklSc9XJBtuvI5Zjuh4z1ETw==", + "version": "18.4.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.4.0.tgz", + "integrity": "sha512-FOzGHX/nHSV1wSduSsabsx3aqC1nfde0opEpEDSOJhxExDxKCwoS1XPy1aERGyKip4ZVA6phC3dLtoBH3QMkVQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -295,21 +296,21 @@ } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.3.1.tgz", - "integrity": "sha512-sikmkjfsXPpPTku1aQkQ1MNNEKGBgGGRvUN/WeNS9dhCJ4dxU3O7dZctt1aQWj+W3nbuUtDiimAWF5fZHGFE2Q==", + "version": "18.4.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.4.0.tgz", + "integrity": "sha512-HlFHt2qgdd+jqyVIkCXmrjHauXo/XY3Rp0UNabk83ejGi/raM/6lEFI7iFWzHxLyiAKk4OgGI5W26giSQw991A==", "dev": true, "license": "MIT" }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.3.1.tgz", - "integrity": "sha512-MP4Nm+SHboF8KdnN0KpPEGAaTTzDLPm3+S/4W3Mg8onqWCyadyd4mActh9mK/pvCj8TVlb/SW1zeTtdMYhwonw==", + "version": "18.4.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.4.0.tgz", + "integrity": "sha512-Saz9lkWPN3da7ZKW17UsOSN7DeY+TPh+wz/6GCNZCh67Uw2wvMC9agb+4hgpZNXYCP5+u7erqzxQmBoWnS/A+A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.3.1", - "@angular-eslint/utils": "18.3.1" + "@angular-eslint/bundled-angular-compiler": "18.4.0", + "@angular-eslint/utils": "18.4.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -318,32 +319,33 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.3.1.tgz", - "integrity": "sha512-hBJ3+f7VSidvrtYaXH7Vp0sWvblA9jLK2c6uQzhYGWdEDUcTg7g7VI9ThW39WvMbHqkyzNE4PPOynK69cBEDGg==", + "version": "18.4.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.4.0.tgz", + "integrity": "sha512-n3uZFCy76DnggPqjSVFV3gYD1ik7jCG28o2/HO4kobcMNKnwW8XAlFUagQ4TipNQh7fQiAefsEqvv2quMsYDVw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.3.1", - "@angular-eslint/utils": "18.3.1", - "aria-query": "5.3.0", + "@angular-eslint/bundled-angular-compiler": "18.4.0", + "@angular-eslint/utils": "18.4.0", + "aria-query": "5.3.2", "axobject-query": "4.1.0" }, "peerDependencies": { + "@typescript-eslint/types": "^7.11.0 || ^8.0.0", "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/schematics": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-18.3.1.tgz", - "integrity": "sha512-BTsQHDu7LjvXannJTb5BqMPCFIHRNN94eRyb60VfjJxB/ZFtsbAQDFFOi5lEZsRsd4mBeUMuL9mW4IMcPtUQ9Q==", + "version": "18.4.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-18.4.0.tgz", + "integrity": "sha512-ssqe+0YCfekbWIXNdCrHfoPK/bPZAWybs0Bn/b99dfd8h8uyXkERo9AzIOx4Uyj/08SkP9aPL/0uOOEHDsRGwQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/eslint-plugin": "18.3.1", - "@angular-eslint/eslint-plugin-template": "18.3.1", + "@angular-eslint/eslint-plugin": "18.4.0", + "@angular-eslint/eslint-plugin-template": "18.4.0", "ignore": "5.3.2", "semver": "7.6.3", "strip-json-comments": "3.1.1" @@ -354,13 +356,13 @@ } }, "node_modules/@angular-eslint/template-parser": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.3.1.tgz", - "integrity": "sha512-JUUkfWH1G+u/Uk85ZYvJSt/qwN/Ko+jlXFtzBEcknJZsTWTwBcp36v77gPZe5FmKSziJZpyPUd+7Kiy6tuSCTw==", + "version": "18.4.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.4.0.tgz", + "integrity": "sha512-VTep3Xd3IOaRIPL+JN/TV4/2DqUPbjtF3TNY15diD/llnrEhqFnmsvMihexbQyTqzOG+zU554oK44YfvAtHOrw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.3.1", + "@angular-eslint/bundled-angular-compiler": "18.4.0", "eslint-scope": "^8.0.2" }, "peerDependencies": { @@ -369,13 +371,13 @@ } }, "node_modules/@angular-eslint/utils": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.3.1.tgz", - "integrity": "sha512-sd9niZI7h9H2FQ7OLiQsLFBhjhRQTASh+Q0+4+hyjv9idbSHBJli8Gsi2fqj9zhtMKpAZFTrWzuLUpubJ9UYbA==", + "version": "18.4.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.4.0.tgz", + "integrity": "sha512-At1yS8GRviGBoaupiQwEOL4/IcZJCE/+2vpXdItMWPGB1HWetxlKAUZTMmIBX/r5Z7CoXxl+LbqpGhrhyzIQAg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.3.1" + "@angular-eslint/bundled-angular-compiler": "18.4.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -384,9 +386,9 @@ } }, "node_modules/@angular/animations": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.5.tgz", - "integrity": "sha512-IlXtW/Nj48ZzjHUzH1TykZcSR64ScJx39T3IHnjV2z/bVATzZ36JGoadQHdqpJNKBodYJNgtJCGLCbgAvGWY2g==", + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.8.tgz", + "integrity": "sha512-dMSn2hg70siv3lhP+vqhMbgc923xw6XBUvnpCPEzhZqFHvPXfh/LubmsD5RtqHmjWebXtgVcgS+zg3Gq3jB2lg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -395,18 +397,18 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.5" + "@angular/core": "18.2.8" } }, "node_modules/@angular/build": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.5.tgz", - "integrity": "sha512-XWkmjzgeUga0SJ0lYSYcTuYOWTyqcln2mNfBp7Ae/GZ+/7+APbedsIZEiZGZwveOIyOpTM5wguNSoe9khDl5Ig==", + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.9.tgz", + "integrity": "sha512-o1hOEM2e6ARy+ck2Pohl0d/RFgbbXTw6/hTLAj3CBKjtqAGStRaVF2UlJjhi+xOxlfsOPuJJc9IpzLBteku+Ag==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.5", + "@angular-devkit/architect": "0.1802.9", "@babel/core": "7.25.2", "@babel/helper-annotate-as-pure": "7.24.7", "@babel/helper-split-export-declaration": "7.24.7", @@ -425,7 +427,7 @@ "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", "piscina": "4.6.1", - "rollup": "4.20.0", + "rollup": "4.22.4", "sass": "1.77.6", "semver": "7.6.3", "vite": "5.4.6", @@ -468,9 +470,9 @@ } }, "node_modules/@angular/cdk": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.5.tgz", - "integrity": "sha512-HLg5cfrIrgNIJJ+0v3kLieHeLPJLFNOBO359holXOrKUPRG+XQ3CT8EzSvREFm1XkaSEsDC0+dnG0ouNhOPFpQ==", + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.9.tgz", + "integrity": "sha512-hV2dXpvy2TLwCsRtI/ZXkb2EoaJiellRr+kbcnKwO15LFoz3mTAOhKtsvu7yOyURkaPiI605qiIZrPP4zLL1qw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -485,18 +487,18 @@ } }, "node_modules/@angular/cli": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.5.tgz", - "integrity": "sha512-97uNs0HsOdnMaTlNJKFjIBUXw0wz43uYvSSKmIpBt7eq1LaPLju1G/qpDIHx2YwhMClPrXXrW2H/xdvqZiIw+w==", + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.9.tgz", + "integrity": "sha512-ejTIqwvPABwK7MtVmI2qWbEaMhhbHNsq0NPzl1hwLtkrLbjdDrEVv0Wy+gN0xqrT9NyCPl4AmNLz/xuYTzgU5g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1802.5", - "@angular-devkit/core": "18.2.5", - "@angular-devkit/schematics": "18.2.5", + "@angular-devkit/architect": "0.1802.9", + "@angular-devkit/core": "18.2.9", + "@angular-devkit/schematics": "18.2.9", "@inquirer/prompts": "5.3.8", "@listr2/prompt-adapter-inquirer": "2.0.15", - "@schematics/angular": "18.2.5", + "@schematics/angular": "18.2.9", "@yarnpkg/lockfile": "1.1.0", "ini": "4.1.3", "jsonc-parser": "3.3.1", @@ -519,9 +521,9 @@ } }, "node_modules/@angular/common": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.5.tgz", - "integrity": "sha512-m+KJrtbFXTE36jP/po6UAMeUR/enQxRHpVGLCRcIcE7VWVH1ZcOvoW1yqh2A6k+KxWXeajlq/Z04nnMhcoxMRw==", + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.8.tgz", + "integrity": "sha512-TYsKtE5nVaIScWSLGSO34Skc+s3hB/BujSddnfQHoNFvPT/WR0dfmdlpVCTeLj+f50htFoMhW11tW99PbK+whQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -530,14 +532,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.5", + "@angular/core": "18.2.8", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.5.tgz", - "integrity": "sha512-vcqe9x4dGGAnMfPhEpcZyiSVgAiqJeK80LqP1vWoAmBR+HeOqAilSv6SflcLAtuTzwgzMMAvD2T+SMCgUvaqww==", + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.8.tgz", + "integrity": "sha512-JRedHNfK1CCPVyeGQB5w3WBYqMA6X8Q240CkvjlGfn0pVXihf9DWk3nkSQJVgYxpvpHfxdgjaYZ5IpMzlkmkhw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -546,7 +548,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.5" + "@angular/core": "18.2.8" }, "peerDependenciesMeta": { "@angular/core": { @@ -555,15 +557,15 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.5.tgz", - "integrity": "sha512-CCCtZobUTUfId/RTYtuDCw5R1oK0w65hdAUMRP1MdGmd8bb8DKJA86u1QCWwozL3rbXlIIX4ognQ6urQ43k/Gw==", + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.8.tgz", + "integrity": "sha512-OksDE4LWQUCcIvMjtZF7eiDCdIMrcMMpC1+Q0PIYi7KmnqXFGs4/Y0NdJvtn/LrQznzz5WaKM3ZDVNZTRX4wmw==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "7.25.2", "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^3.0.0", + "chokidar": "^4.0.0", "convert-source-map": "^1.5.1", "reflect-metadata": "^0.2.0", "semver": "^7.0.0", @@ -579,14 +581,44 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.2.5", + "@angular/compiler": "18.2.8", "typescript": ">=5.4 <5.6" } }, + "node_modules/@angular/compiler-cli/node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular/compiler-cli/node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@angular/core": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.5.tgz", - "integrity": "sha512-5BLVc5gXxzanQkADNS9WPsor3vNF5nQcyIHBi5VScErwM5vVZ7ATH1iZwaOg1ykDEVTFVhKDwD0X1aaqGDbhmQ==", + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.8.tgz", + "integrity": "sha512-NwIuX/Iby1jT6Iv1/s6S3wOFf8xfuQR3MPGvKhGgNtjXLbHG+TXceK9+QPZC0s9/Z8JR/hz+li34B79GrIKgUg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -600,9 +632,9 @@ } }, "node_modules/@angular/forms": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.5.tgz", - "integrity": "sha512-ohKeH+EZCCIyGSiFYlraWLzssGAZc13P92cuYpXB62322PkcA5u0IT72mML9JWGKRqF2zteVsw4koWHVxXM5mA==", + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.8.tgz", + "integrity": "sha512-JCLki7KC6D5vF6dE6yGlBmW33khIgpHs8N9SzuiJtkQqNDTIQA8cPsGV6qpLpxflxASynQOX5lDkWYdQyfm77Q==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -611,16 +643,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.5", - "@angular/core": "18.2.5", - "@angular/platform-browser": "18.2.5", + "@angular/common": "18.2.8", + "@angular/core": "18.2.8", + "@angular/platform-browser": "18.2.8", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/google-maps": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/google-maps/-/google-maps-18.2.5.tgz", - "integrity": "sha512-g8QqO17EMpuneLWGdV/NrM3Ek7GL0TJUywCHJFT9Qx4JB3DTZ3iX+c1F6lht9NBm4EjQQhzsXnXb/CG9WHIZjg==", + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@angular/google-maps/-/google-maps-18.2.9.tgz", + "integrity": "sha512-+NBLd5hjhqAKxu+sTf+FU3NtumOil6GYCG3nwvFUNo7xttyLFW6lxag8jVh0cyq1yH17x2vHuv2y0j8nsV4esQ==", "license": "MIT", "dependencies": { "@types/google.maps": "^3.54.10", @@ -633,16 +665,16 @@ } }, "node_modules/@angular/material": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.2.5.tgz", - "integrity": "sha512-+Yz8ayKz1ALz2UvPrM33FHSUmrE0GKHn+Gg79l6NdC4eSrzAAYBVdLfQvCBWCgtdvs7IiegbCnnAJiqXVC1DDg==", + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.2.9.tgz", + "integrity": "sha512-M2oCgPPIMMd6BLgEJCD+FvdC7gRDeCjj9yktNn3ctHmkKUWRvpJ3xRBH/WjVXb+9fPCCW1iNwZI7+bN1fHE7cA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^18.0.0 || ^19.0.0", - "@angular/cdk": "18.2.5", + "@angular/cdk": "18.2.9", "@angular/common": "^18.0.0 || ^19.0.0", "@angular/core": "^18.0.0 || ^19.0.0", "@angular/forms": "^18.0.0 || ^19.0.0", @@ -651,9 +683,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.5.tgz", - "integrity": "sha512-PoX9idwnOpTJBlujzZ2nFGOsmCnZzOH7uNSWIR7trdoq0b1AFXfrxlCQ36qWamk7bbhJI4H28L8YTmKew/nXDA==", + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.8.tgz", + "integrity": "sha512-EPai4ZPqSq3ilLJUC85kPi9wo5j5suQovwtgRyjM/75D9Qy4TV19g8hkVM5Co/zrltO8a2G6vDscCNI5BeGw2A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -662,9 +694,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "18.2.5", - "@angular/common": "18.2.5", - "@angular/core": "18.2.5" + "@angular/animations": "18.2.8", + "@angular/common": "18.2.8", + "@angular/core": "18.2.8" }, "peerDependenciesMeta": { "@angular/animations": { @@ -673,9 +705,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.5.tgz", - "integrity": "sha512-5u0IuAt1r5e2u2vSKhp3phnaf6hH89B/q7GErfPse1sdDfNI6wHVppxai28PAfAj9gwooJun6MjFWhJFLzS44A==", + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.8.tgz", + "integrity": "sha512-poZoapDqyN/rxGKQ3C6esdPiPLMkSpP2v12hoEa12KHgfPk7T1e+a+NMyJjV8HeOY3WyvL7tGRhW0NPTajTkhw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -684,16 +716,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.5", - "@angular/compiler": "18.2.5", - "@angular/core": "18.2.5", - "@angular/platform-browser": "18.2.5" + "@angular/common": "18.2.8", + "@angular/compiler": "18.2.8", + "@angular/core": "18.2.8", + "@angular/platform-browser": "18.2.8" } }, "node_modules/@angular/router": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.5.tgz", - "integrity": "sha512-OjZV1PTiSwT0ytmR0ykveLYzs4uQWf0EuIclZmWqM/bb8Q4P+gJl7/sya05nGnZsj6nHGOL0e/LhSZ3N+5p6qg==", + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.8.tgz", + "integrity": "sha512-L+olYgxIiBq+tbfayVI0cv1yOuymsw33msnGC2l/vpc9sSVfqGzESFnB4yMVU3vHtE9v6v2Y6O+iV44/b79W/g==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -702,9 +734,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.5", - "@angular/core": "18.2.5", - "@angular/platform-browser": "18.2.5", + "@angular/common": "18.2.8", + "@angular/core": "18.2.8", + "@angular/platform-browser": "18.2.8", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -3421,6 +3453,16 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", @@ -3483,9 +3525,9 @@ "license": "MIT" }, "node_modules/@eslint/js": { - "version": "9.11.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.0.tgz", - "integrity": "sha512-LPkkenkDqyzTFauZLLAPhIb48fj6drrfMvRGSL9tS3AcZBSVTllemLSNyCvHNNL2t797S/6DJNSIwRwXgMO/eQ==", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz", + "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==", "dev": true, "license": "MIT", "engines": { @@ -3529,6 +3571,30 @@ "typescript": ">=2.8.1" } }, + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -3544,9 +3610,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5070,9 +5136,9 @@ ] }, "node_modules/@ngtools/webpack": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.5.tgz", - "integrity": "sha512-L0n4eHObeqEOYRfSP+e4SeF/dmwxOIFy9xYvYCOUwOLrW4b3+a1+kkT30pqyfL72LFtpf0cmUwaWEFIcWl5PCg==", + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.9.tgz", + "integrity": "sha512-/apDvs4qevjSWoYw3h3/c/mILFrf2EgCJfBy9f3E7PEgi2tjifOIszBRrLQkVpeHAaFgEH8zKS2ol0hAmOl8sw==", "dev": true, "license": "MIT", "engines": { @@ -5510,9 +5576,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", - "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], @@ -5524,9 +5590,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", - "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], @@ -5538,9 +5604,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", - "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], @@ -5552,9 +5618,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", - "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], @@ -5566,9 +5632,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", - "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], @@ -5580,9 +5646,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", - "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], @@ -5594,9 +5660,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", - "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], @@ -5608,9 +5674,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", - "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], @@ -5622,9 +5688,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", - "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], @@ -5636,9 +5702,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", - "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], @@ -5650,9 +5716,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", - "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], @@ -5664,9 +5730,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", - "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], @@ -5678,9 +5744,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", - "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], @@ -5692,9 +5758,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", - "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], @@ -5706,9 +5772,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", - "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], @@ -5720,9 +5786,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", - "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], @@ -5761,14 +5827,14 @@ "license": "MIT" }, "node_modules/@schematics/angular": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.5.tgz", - "integrity": "sha512-tBXhk9OGT4U6VsBNbuCNl2ITDOF3NYdGrEieIHU+lHSkpJNGZUIGxCgXCETXkmXDq1pe4wFZSKelWjeqYDfX0g==", + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.9.tgz", + "integrity": "sha512-LlMHZQ6f8zrqSK24OBXi4u2MTNHNu9ZN6JXpbElq0bz/9QkUR2zy+Kk2wLpPxCwXYTZby7/xgHiTzXvG+zTdhw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "18.2.5", - "@angular-devkit/schematics": "18.2.5", + "@angular-devkit/core": "18.2.9", + "@angular-devkit/schematics": "18.2.9", "jsonc-parser": "3.3.1" }, "engines": { @@ -6088,9 +6154,9 @@ } }, "node_modules/@types/google.maps": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.58.0.tgz", - "integrity": "sha512-rZPrbNHoGxeY70uuQYFLGQqcz5mLd3pZy0u286GSugvN7PLFsHNRF2wN2QXtUgNiC33IC0LX+MD3LGAC3wN7Eg==", + "version": "3.58.1", + "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.58.1.tgz", + "integrity": "sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ==", "license": "MIT" }, "node_modules/@types/graceful-fs": { @@ -6348,17 +6414,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.2.0.tgz", - "integrity": "sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz", + "integrity": "sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.2.0", - "@typescript-eslint/type-utils": "8.2.0", - "@typescript-eslint/utils": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/type-utils": "8.11.0", + "@typescript-eslint/utils": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -6382,16 +6448,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.2.0.tgz", - "integrity": "sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz", + "integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.2.0", - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/typescript-estree": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", "debug": "^4.3.4" }, "engines": { @@ -6411,14 +6477,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz", - "integrity": "sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz", + "integrity": "sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0" + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6429,14 +6495,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.2.0.tgz", - "integrity": "sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz", + "integrity": "sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.2.0", - "@typescript-eslint/utils": "8.2.0", + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/utils": "8.11.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -6454,9 +6520,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.2.0.tgz", - "integrity": "sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", + "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==", "dev": true, "license": "MIT", "engines": { @@ -6468,16 +6534,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz", - "integrity": "sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz", + "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", @@ -6506,27 +6572,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -6543,27 +6588,17 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.2.0.tgz", - "integrity": "sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.11.0.tgz", + "integrity": "sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.2.0", - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/typescript-estree": "8.2.0" + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6577,13 +6612,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz", - "integrity": "sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz", + "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.2.0", + "@typescript-eslint/types": "8.11.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -7003,17 +7038,17 @@ } }, "node_modules/angular-eslint": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-18.3.1.tgz", - "integrity": "sha512-p3/1DfH8TpsMHUDMLECn6/1uPcHjd7/0tL8prXZuO93mZFV4Y+P9MBwLheA14tw8UXbnKWXW8SZz9hov6PaLRw==", + "version": "18.4.0", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-18.4.0.tgz", + "integrity": "sha512-fEayKOZlux9YhnZfWN8zNU0VlBRB+G2m/2T+R2njWlGpD1+XhieCVZPB9dh5Jv/wEvcfPypEWE3DgH4MqIRxKA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/builder": "18.3.1", - "@angular-eslint/eslint-plugin": "18.3.1", - "@angular-eslint/eslint-plugin-template": "18.3.1", - "@angular-eslint/schematics": "18.3.1", - "@angular-eslint/template-parser": "18.3.1" + "@angular-eslint/builder": "18.4.0", + "@angular-eslint/eslint-plugin": "18.4.0", + "@angular-eslint/eslint-plugin-template": "18.4.0", + "@angular-eslint/schematics": "18.4.0", + "@angular-eslint/template-parser": "18.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", @@ -7118,13 +7153,13 @@ "license": "Python-2.0" }, "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" + "engines": { + "node": ">= 0.4" } }, "node_modules/array-buffer-byte-length": { @@ -7158,16 +7193,6 @@ "dev": true, "license": "MIT" }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", @@ -7398,6 +7423,13 @@ "webpack": ">=5" } }, + "node_modules/babel-plugin-add-module-exports": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz", + "integrity": "sha512-3AN/9V/rKuv90NG65m4tTHsI04XrCKsWbztIcW7a8H5iIN7WlvWucRtVV0V/rT4QvtA11n5Vmp20fLwfMWqp6g==", + "dev": true, + "license": "MIT" + }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -10162,6 +10194,153 @@ "dev": true, "license": "MIT" }, + "node_modules/current-git-branch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/current-git-branch/-/current-git-branch-1.1.0.tgz", + "integrity": "sha512-n5mwGZllLsFzxDPtTmadqGe4IIBPfqPbiIRX4xgFR9VK/Bx47U+94KiVkxSKAKN6/s43TlkztS2GZpgMKzwQ8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-add-module-exports": "^0.2.1", + "execa": "^0.6.1", + "is-git-repository": "^1.0.0" + } + }, + "node_modules/current-git-branch/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/current-git-branch/node_modules/execa": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.6.3.tgz", + "integrity": "sha512-/teX3MDLFBdYUhRk8WCBYboIMUmqeizu0m9Z3YF3JWrbEh/SlZg00vLJSaAGWw3wrZ9tE0buNw79eaAPYhUuvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/current-git-branch/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/current-git-branch/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/current-git-branch/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/current-git-branch/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/current-git-branch/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/current-git-branch/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/current-git-branch/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/current-git-branch/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/current-git-branch/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/current-git-branch/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true, + "license": "ISC" + }, "node_modules/dargs": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", @@ -10483,16 +10662,6 @@ "node": ">=4" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -10551,29 +10720,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dir-glob/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -11171,29 +11317,32 @@ } }, "node_modules/eslint": { - "version": "9.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.0.tgz", - "integrity": "sha512-yVS6XODx+tMFMDFcG4+Hlh+qG7RM6cCJXtQhCKLSsr3XkLvWggHjCqjfh0XsPPnt1c56oaT6PMgW9XWQQjdHXA==", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz", + "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.11.0", + "@eslint/js": "9.13.0", "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -11203,13 +11352,11 @@ "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { @@ -11231,9 +11378,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -11248,9 +11395,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -11446,15 +11593,15 @@ } }, "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "eslint-visitor-keys": "^4.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -13852,6 +13999,152 @@ "node": ">=6" } }, + "node_modules/is-git-repository": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-git-repository/-/is-git-repository-1.1.1.tgz", + "integrity": "sha512-hxLpJytJnIZ5Og5QsxSkzmb8Qx8rGau9bio1JN/QtXcGEFuSsQYau0IiqlsCwftsfVYjF1mOq6uLdmwNSspgpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^0.6.1", + "path-is-absolute": "^1.0.1" + } + }, + "node_modules/is-git-repository/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/is-git-repository/node_modules/execa": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.6.3.tgz", + "integrity": "sha512-/teX3MDLFBdYUhRk8WCBYboIMUmqeizu0m9Z3YF3JWrbEh/SlZg00vLJSaAGWw3wrZ9tE0buNw79eaAPYhUuvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-git-repository/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-git-repository/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-git-repository/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/is-git-repository/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-git-repository/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-git-repository/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-git-repository/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-git-repository/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-git-repository/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/is-git-repository/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true, + "license": "ISC" + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -13970,16 +14263,6 @@ "node": ">=8" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", @@ -18653,9 +18936,9 @@ } }, "node_modules/ordered-binary": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.1.tgz", - "integrity": "sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.2.tgz", + "integrity": "sha512-JTo+4+4Fw7FreyAvlSLjb1BBVaxEQAacmjD3jjuyPZclpbEghTvQZbXBb2qPd2LeIMxiHwXBZUcpmG2Gl/mDEA==", "dev": true, "license": "MIT" }, @@ -18669,6 +18952,16 @@ "node": ">=0.10.0" } }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -19384,6 +19677,13 @@ "license": "MIT", "optional": true }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true, + "license": "ISC" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -20102,9 +20402,9 @@ } }, "node_modules/rollup": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", - "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "license": "MIT", "dependencies": { @@ -20118,22 +20418,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.20.0", - "@rollup/rollup-android-arm64": "4.20.0", - "@rollup/rollup-darwin-arm64": "4.20.0", - "@rollup/rollup-darwin-x64": "4.20.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", - "@rollup/rollup-linux-arm-musleabihf": "4.20.0", - "@rollup/rollup-linux-arm64-gnu": "4.20.0", - "@rollup/rollup-linux-arm64-musl": "4.20.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", - "@rollup/rollup-linux-riscv64-gnu": "4.20.0", - "@rollup/rollup-linux-s390x-gnu": "4.20.0", - "@rollup/rollup-linux-x64-gnu": "4.20.0", - "@rollup/rollup-linux-x64-musl": "4.20.0", - "@rollup/rollup-win32-arm64-msvc": "4.20.0", - "@rollup/rollup-win32-ia32-msvc": "4.20.0", - "@rollup/rollup-win32-x64-msvc": "4.20.0", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, @@ -21487,6 +21787,16 @@ "node": ">=8" } }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -22004,9 +22314,9 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", "license": "0BSD" }, "node_modules/tuf-js": { @@ -22180,15 +22490,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.2.0.tgz", - "integrity": "sha512-DmnqaPcML0xYwUzgNbM1XaKXpEb7BShYf2P1tkUmmcl8hyeG7Pj08Er7R9bNy6AufabywzJcOybQAtnD/c9DGw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.11.0.tgz", + "integrity": "sha512-cBRGnW3FSlxaYwU8KfAewxFK5uzeOAp0l2KebIlPDOT5olVi65KDG/yjBooPBG0kGW/HLkoz1c/iuBFehcS3IA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.2.0", - "@typescript-eslint/parser": "8.2.0", - "@typescript-eslint/utils": "8.2.0" + "@typescript-eslint/eslint-plugin": "8.11.0", + "@typescript-eslint/parser": "8.11.0", + "@typescript-eslint/utils": "8.11.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -22444,6 +22754,68 @@ "dev": true, "license": "MIT" }, + "node_modules/validate-branch-name": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/validate-branch-name/-/validate-branch-name-1.3.1.tgz", + "integrity": "sha512-DmNdzRIM6nhnXWdBF8Yq8aIJF1MvVt+VVd6MwDkLdIhIZ/yhxJlUcp+EwOB4Nttd4HNl53ixozKbaf5knEKXIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^8.3.0", + "cosmiconfig": "^8.1.3", + "current-git-branch": "^1.1.0" + }, + "bin": { + "validate-branch-name": "cli.js" + } + }, + "node_modules/validate-branch-name/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/validate-branch-name/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/validate-branch-name/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", diff --git a/package.json b/package.json index 5934a05..43e9efa 100644 --- a/package.json +++ b/package.json @@ -48,33 +48,33 @@ "commitlint": "commitlint" }, "dependencies": { - "@angular/animations": "^18.2.5", - "@angular/cdk": "^18.2.5", - "@angular/common": "^18.2.5", - "@angular/compiler": "^18.2.5", - "@angular/core": "^18.2.5", - "@angular/forms": "^18.2.5", - "@angular/google-maps": "^18.2.5", - "@angular/material": "^18.2.5", - "@angular/platform-browser": "^18.2.5", - "@angular/platform-browser-dynamic": "^18.2.5", - "@angular/router": "^18.2.5", + "@angular/animations": "^18.2.8", + "@angular/cdk": "^18.2.9", + "@angular/common": "^18.2.8", + "@angular/compiler": "^18.2.8", + "@angular/core": "^18.2.8", + "@angular/forms": "^18.2.8", + "@angular/google-maps": "^18.2.9", + "@angular/material": "^18.2.9", + "@angular/platform-browser": "^18.2.8", + "@angular/platform-browser-dynamic": "^18.2.8", + "@angular/router": "^18.2.8", "rxjs": "~7.8.1", - "tslib": "^2.7.0", + "tslib": "^2.8.0", "zone.js": "~0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^18.2.5", - "@angular/cli": "^18.2.5", - "@angular/compiler-cli": "^18.2.5", + "@angular-devkit/build-angular": "^18.2.9", + "@angular/cli": "^18.2.9", + "@angular/compiler-cli": "^18.2.8", "@commitlint/cli": ">=19.5.0", "@commitlint/config-conventional": ">=19.5.0", "@commitlint/format": ">=19.5.0", - "@types/google.maps": "^3.58.0", + "@types/google.maps": "^3.58.1", "@types/jest": "^29.5.13", - "angular-eslint": "18.3.1", + "angular-eslint": "18.4.0", "conventional-changelog-angular": ">=8.0.0", - "eslint": "^9.9.1", + "eslint": "^9.13.0", "husky": "^9.1.6", "is-ci": ">=3.0.1", "jest": "^29.7.0", @@ -85,6 +85,7 @@ "npm-run-all": "^4.1.5", "standard-version": ">=9.5.0", "typescript": "~5.5.2", - "typescript-eslint": "8.2.0" + "typescript-eslint": "8.11.0", + "validate-branch-name": "^1.3.1" } } diff --git a/projects/ngx-google-maps-places-api/package.json b/projects/ngx-google-maps-places-api/package.json index 62e0ca1..a40746d 100644 --- a/projects/ngx-google-maps-places-api/package.json +++ b/projects/ngx-google-maps-places-api/package.json @@ -37,7 +37,8 @@ }, "peerDependencies": { "@angular/common": "^18.0.0", - "@angular/core": "^18.0.0" + "@angular/core": "^18.0.0", + "@types/google.maps": "^3.58.0" }, "sideEffects": false } diff --git a/projects/ngx-google-maps-places-api/src/lib/ngx-google-maps-places-api.service.ts b/projects/ngx-google-maps-places-api/src/lib/ngx-google-maps-places-api.service.ts index 657455b..50fa698 100644 --- a/projects/ngx-google-maps-places-api/src/lib/ngx-google-maps-places-api.service.ts +++ b/projects/ngx-google-maps-places-api/src/lib/ngx-google-maps-places-api.service.ts @@ -36,6 +36,7 @@ export class NgxGoogleMapsPlacesApiService { */ public refreshToken(): google.maps.places.AutocompleteSessionToken { this._token = new google.maps.places.AutocompleteSessionToken(); + // console.log('refreshToken()', this._token); return this._token; } @@ -80,11 +81,12 @@ export class NgxGoogleMapsPlacesApiService { ): Observable { const placePrediction = this._isAutocompleteSuggestion(suggestionOrPrediction) ? suggestionOrPrediction.placePrediction - : suggestionOrPrediction - if (!placePrediction) { + : suggestionOrPrediction; + const place = placePrediction?.toPlace(); + if (!place) { return of(null); } - return from(placePrediction.toPlace().fetchFields({ fields })) + return from(place.fetchFields({ fields })) .pipe( tap(() => this.refreshToken()), map(({ place }) => place), @@ -117,6 +119,13 @@ export class NgxGoogleMapsPlacesApiService { 'administrative_area_level_4', 'administrative_area_level_5' ], + regionCode: [ + 'administrative_area_level_1', + 'administrative_area_level_2', + 'administrative_area_level_3', + 'administrative_area_level_4', + 'administrative_area_level_5' + ], city: [ 'locality', 'sublocality', @@ -126,7 +135,8 @@ export class NgxGoogleMapsPlacesApiService { 'sublocality_level_4' ], countryCode: [ 'country' ], - country: [ 'country' ] + country: [ 'country' ], + addressLine2: [ 'subpremise' ] }; const addressModel: AddressModel = { @@ -134,9 +144,11 @@ export class NgxGoogleMapsPlacesApiService { postalCode: '', street: '', region: '', + regionCode: '', city: '', countryCode: '', - country: '' + country: '', + addressLine2: '' }; for (const addressComponent of addressComponents) { @@ -144,7 +156,7 @@ export class NgxGoogleMapsPlacesApiService { const key = mapKey as AddressKey; const addressComponentMap = addressComponentsMap[key]; if (addressComponentMap.some((type) => addressComponent.types.includes(type))) { - if (key === 'countryCode') { + if (key === 'countryCode' || key === 'regionCode') { addressModel[key] = String(addressComponent.shortText); } else { addressModel[key] = String(addressComponent.longText); @@ -195,6 +207,6 @@ export class NgxGoogleMapsPlacesApiService { private _isAutocompleteSuggestion( suggestionOrPrediction: google.maps.places.AutocompleteSuggestion | google.maps.places.PlacePrediction ): suggestionOrPrediction is google.maps.places.AutocompleteSuggestion { - return suggestionOrPrediction && Object.hasOwn(suggestionOrPrediction, 'placePrediction'); + return suggestionOrPrediction && 'placePrediction' in suggestionOrPrediction; } } diff --git a/projects/ngx-google-maps-places-api/src/lib/ngx-google-maps-places.types.ts b/projects/ngx-google-maps-places-api/src/lib/ngx-google-maps-places.types.ts index 92be0c2..123986f 100644 --- a/projects/ngx-google-maps-places-api/src/lib/ngx-google-maps-places.types.ts +++ b/projects/ngx-google-maps-places-api/src/lib/ngx-google-maps-places.types.ts @@ -1,6 +1,6 @@ /** Defines the keys that can be used in the `AddressModel` type. */ -export type AddressKey - = 'streetNumber' | 'postalCode' | 'street' | 'region' | 'city' | 'countryCode' | 'country'; +export type AddressKey = 'streetNumber' | 'postalCode' | 'street' | 'region' | 'regionCode' + | 'city' | 'countryCode' | 'country' | 'addressLine2'; /** * Defines a type for an address model, where the values can be of type `T`. diff --git a/projects/ngx-google-maps-places-app/src/app/app.component.html b/projects/ngx-google-maps-places-app/src/app/app.component.html index 2023c07..d7561aa 100644 --- a/projects/ngx-google-maps-places-app/src/app/app.component.html +++ b/projects/ngx-google-maps-places-app/src/app/app.component.html @@ -53,6 +53,16 @@ formControlName="street" [value]="placesAutocomplete.placeDetails$()?.address?.street" /> + + + Address Line 2 (apartment, suite, a unit number) + +
@@ -75,6 +85,16 @@ formControlName="region" [value]="placesAutocomplete.placeDetails$()?.address?.region" /> + + + State/Province Code + +
diff --git a/projects/ngx-google-maps-places-app/src/app/app.component.ts b/projects/ngx-google-maps-places-app/src/app/app.component.ts index c21929a..0310652 100644 --- a/projects/ngx-google-maps-places-app/src/app/app.component.ts +++ b/projects/ngx-google-maps-places-app/src/app/app.component.ts @@ -43,8 +43,10 @@ export class AppComponent { street: new FormControl('', [ Validators.required ]), city: new FormControl('', [ Validators.required ]), region: new FormControl('', [ Validators.required ]), + regionCode: new FormControl('', [ Validators.required ]), country: new FormControl('', [ Validators.required ]), countryCode: new FormControl('', [ Validators.required ]), - postalCode: new FormControl('', [ Validators.required ]) + postalCode: new FormControl('', [ Validators.required ]), + addressLine2: new FormControl('') }); } diff --git a/projects/ngx-google-maps-places-autocomplete/README.md b/projects/ngx-google-maps-places-autocomplete/README.md index 2786599..7bd7222 100644 --- a/projects/ngx-google-maps-places-autocomplete/README.md +++ b/projects/ngx-google-maps-places-autocomplete/README.md @@ -129,8 +129,16 @@ Use the `ngxGoogleMapsPlacesAutocomplete` directive within an `matAutocomplete` formControlName="address" [matAutocomplete]="addressAutocomplete" ngxGoogleMapsPlacesAutocomplete - [fetchFields]="[ 'addressComponents', 'location', 'googleMapsURI' ]" #placesAutocomplete="ngxGoogleMapsPlacesAutocomplete" /> + @for (option of placesAutocomplete.options$(); track option.prediction.placeId) { @@ -184,6 +192,8 @@ Exported as: `ngxGoogleMapsPlacesAutocomplete` | **Input** | | | `shouldLoadPlaceDetails: boolean` | Determines whether place details should be loaded for the selected autocomplete suggestion. Default is `true`. | | `fetchFields: string[] \| undefined` | List of fields to be fetched at place details request. Default is `undefined`, which will result in passing `[ 'addressComponents' ]` to Google Places API. | +| `placesAutocompleteRequest: Omit \| undefined` | An input property that specifies the options for the Google Maps Places Autocomplete request. This property allows the user to customize the autocomplete request, such as setting the location bias, types of places to return, or other parameters. If this property is not set, the default autocomplete request options will be used. See [google.maps.places.AutocompleteRequest](https://developers.google.com/maps/documentation/javascript/reference/autocomplete-data#AutocompleteRequest) interface. | +| `placesAutocompleteDebounceTime: number \| null` | An input property that specifies the debounce time (in milliseconds) for the input event that triggers the autocomplete suggestions. If this property is not set, the default debounce time of 725 milliseconds will be used. | | **Output** | | | `optionsLoad: OutputEmitterRef` | An event that is emitted when the options for the autocomplete suggestions have been loaded. | | `placeDetailsLoad: OutputEmitterRef` | An observable signal that holds the current list of autocomplete suggestions. The suggestions are of type `NgxGoogleMapsPlacesAutocompleteSuggestion[]`. | diff --git a/projects/ngx-google-maps-places-autocomplete/package.json b/projects/ngx-google-maps-places-autocomplete/package.json index 31ae6bd..53f26f4 100644 --- a/projects/ngx-google-maps-places-autocomplete/package.json +++ b/projects/ngx-google-maps-places-autocomplete/package.json @@ -40,6 +40,7 @@ "@angular/common": "^18.0.0", "@angular/core": "^18.0.0", "@angular/material": "^18.0.0", + "@types/google.maps": "^3.58.0", "ngx-google-maps-places-api": "1.0.0" }, "sideEffects": false diff --git a/projects/ngx-google-maps-places-autocomplete/src/lib/ngx-google-maps-places-autocomplete.directive.spec.ts b/projects/ngx-google-maps-places-autocomplete/src/lib/ngx-google-maps-places-autocomplete.directive.spec.ts index a8dd66a..70a69b2 100644 --- a/projects/ngx-google-maps-places-autocomplete/src/lib/ngx-google-maps-places-autocomplete.directive.spec.ts +++ b/projects/ngx-google-maps-places-autocomplete/src/lib/ngx-google-maps-places-autocomplete.directive.spec.ts @@ -1,6 +1,6 @@ -import { EventEmitter, Injector } from '@angular/core'; -import { TestBed } from '@angular/core/testing'; -import { AbstractControl, FormControl, FormsModule, NgControl, ReactiveFormsModule } from '@angular/forms'; +import { EventEmitter } from '@angular/core'; +import { fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { FormsModule, NgControl, ReactiveFormsModule } from '@angular/forms'; import { MatAutocompleteModule, MatAutocompleteTrigger } from '@angular/material/autocomplete'; import { of } from 'rxjs'; import { NgxGoogleMapsPlacesApiService } from 'ngx-google-maps-places-api'; @@ -11,13 +11,11 @@ import { describe('NgxGoogleMapsPlacesAutocompleteDirective', () => { let directive: NgxGoogleMapsPlacesAutocompleteDirective; - let injector: Injector; let ngxGoogleMapsPlacesApiService: NgxGoogleMapsPlacesApiService; let matAutocompleteTrigger: MatAutocompleteTrigger; - let control: AbstractControl; beforeEach(() => { - injector = TestBed.configureTestingModule({ + TestBed.configureTestingModule({ imports: [ FormsModule, ReactiveFormsModule, MatAutocompleteModule ], providers: [ NgControl, @@ -25,10 +23,10 @@ describe('NgxGoogleMapsPlacesAutocompleteDirective', () => { { provide: NgxGoogleMapsPlacesApiService, useValue: { - fetchSuggestions: jest.fn(), + fetchSuggestions: jest.fn().mockReturnValue(of([])), applyBoldToMatches: jest.fn(), - fetchPlaceDetails: jest.fn(), - parseAddressComponents: jest.fn() + fetchPlaceDetails: jest.fn().mockReturnValue(of({ })), + parseAddressComponents: jest.fn().mockReturnValue({ }) } }, { @@ -37,38 +35,20 @@ describe('NgxGoogleMapsPlacesAutocompleteDirective', () => { autocomplete: { displayWith: null }, - optionSelections: new EventEmitter() + optionSelections: new EventEmitter(), + _handleInput: jest.fn() } } ] - }).inject(Injector); + }); directive = TestBed.inject(NgxGoogleMapsPlacesAutocompleteDirective); ngxGoogleMapsPlacesApiService = TestBed.inject(NgxGoogleMapsPlacesApiService); matAutocompleteTrigger = TestBed.inject(MatAutocompleteTrigger); - control = new FormControl(); - // @ts-expect-error Cannot assign because it is a read-only property. - directive['_control'] = control; - // @ts-expect-error Cannot assign because it is a read-only property. - directive['_injector'] = injector; // @ts-expect-error Cannot assign because it is a read-only property. directive['_matAutocompleteTrigger'] = matAutocompleteTrigger; }); - it('should set up valueChanges subscription in ngAfterViewInit', (done) => { - const fetchSuggestionsSpy = jest.spyOn(ngxGoogleMapsPlacesApiService, 'fetchSuggestions').mockReturnValue(of([ ])); - const optionsLoadSpy = jest.spyOn(directive.optionsLoad, 'emit'); - - directive.ngAfterViewInit(); - control.setValue('test'); - - setTimeout(() => { - expect(fetchSuggestionsSpy).toHaveBeenCalledWith('test'); - expect(optionsLoadSpy).toHaveBeenCalled(); - done(); - }, 2000); - }); - it('should set displayWith function if not already set', () => { directive.ngAfterViewInit(); @@ -85,36 +65,27 @@ describe('NgxGoogleMapsPlacesAutocompleteDirective', () => { }); it('should set up optionSelections subscription when shouldLoadPlaceDetails is true', () => { - jest.spyOn(directive, 'shouldLoadPlaceDetails').mockReturnValue(true); + jest.spyOn(directive, 'shouldLoadPlaceDetails$').mockReturnValue(true); const fetchPlaceDetailsSpy = jest.spyOn(ngxGoogleMapsPlacesApiService, 'fetchPlaceDetails').mockReturnValue(of({ } as any)); - const placeDetailsLoadSpy = jest.spyOn(directive.placeDetailsLoad, 'emit'); + const placeDetailsLoadSpy = jest.spyOn(directive.placeDetailsLoad$, 'emit'); directive.ngAfterViewInit(); - (matAutocompleteTrigger.optionSelections as any).emit({ isUserInput: true, source: { value: { prediction: {} } } }); + (matAutocompleteTrigger.optionSelections as any).emit({ isUserInput: true, source: { value: { prediction: { } } } }); expect(fetchPlaceDetailsSpy).toHaveBeenCalled(); expect(placeDetailsLoadSpy).toHaveBeenCalled(); }); it('should not set up optionSelections subscription when shouldLoadPlaceDetails is false', () => { - jest.spyOn(directive, 'shouldLoadPlaceDetails').mockReturnValue(false); + jest.spyOn(directive, 'shouldLoadPlaceDetails$').mockReturnValue(false); const fetchPlaceDetailsSpy = jest.spyOn(ngxGoogleMapsPlacesApiService, 'fetchPlaceDetails'); directive.ngAfterViewInit(); - (matAutocompleteTrigger.optionSelections as any).emit({ isUserInput: true, source: { value: { prediction: {} } } }); + (matAutocompleteTrigger.optionSelections as any).emit({ isUserInput: true, source: { value: { prediction: { } } } }); expect(fetchPlaceDetailsSpy).not.toHaveBeenCalled(); }); - it('should filter out non-string values in valueChanges', () => { - const fetchSuggestionsSpy = jest.spyOn(ngxGoogleMapsPlacesApiService, 'fetchSuggestions').mockReturnValue(of([])); - - directive.ngAfterViewInit(); - control.setValue(123); - - expect(fetchSuggestionsSpy).not.toHaveBeenCalled(); - }); - it('should return empty string when suggestion is null', () => { expect(directive.displayFn(null as any)).toBe(''); }); @@ -142,4 +113,79 @@ describe('NgxGoogleMapsPlacesAutocompleteDirective', () => { it('should handle undefined suggestion', () => { expect(directive.displayFn(undefined as any)).toBe(''); }); + + it('should handle input events with debounce correctly in _handleInput', fakeAsync(() => { + const mockInputElement = document.createElement('input'); + mockInputElement.value = 'L'; + const inputEvent = new KeyboardEvent('input', { + bubbles: true, + cancelable: true, + composed: true, + key: mockInputElement.value, + }); + Object.defineProperty(inputEvent, 'target', { value: mockInputElement }); + + const fetchSuggestionsSpy = jest.spyOn(ngxGoogleMapsPlacesApiService, 'fetchSuggestions').mockReturnValue(of([])); // Mock the return value + + directive['_handleInput'](inputEvent); + tick(725); + + expect(fetchSuggestionsSpy).toHaveBeenCalledTimes(1); + })); + + it('should fetch and process autocomplete suggestions', fakeAsync(() => { + const fetchSuggestionsSpy = jest.spyOn(ngxGoogleMapsPlacesApiService, 'fetchSuggestions').mockReturnValue( + of([ + { + placePrediction: { + mainText: 'Main', + secondaryText: 'Secondary', + text: 'Full Text' + } as any + } + ]) + ); + const mockInputElement = document.createElement('input'); + mockInputElement.value = 'L'; + const inputEvent = new KeyboardEvent('input', { + bubbles: true, + cancelable: true, + composed: true, + key: mockInputElement.value, + }); + Object.defineProperty(inputEvent, 'target', { value: mockInputElement }); + directive['_handleInput'](inputEvent); + tick(725); + + expect(fetchSuggestionsSpy).toHaveBeenCalled(); + expect(directive.options$().length).toBeGreaterThan(0); + })); + + it('should emit optionsLoad$ event when options are loaded', fakeAsync(() => { + const optionsLoadSpy = jest.spyOn(directive.optionsLoad$, 'emit'); + jest.spyOn(ngxGoogleMapsPlacesApiService, 'fetchSuggestions').mockReturnValue( + of([ + { + placePrediction: { + mainText: 'Main', + secondaryText: 'Secondary', + text: 'Full Text' + } as any + } + ]) + ); + const mockInputElement = document.createElement('input'); + mockInputElement.value = 'L'; + const inputEvent = new KeyboardEvent('input', { + bubbles: true, + cancelable: true, + composed: true, + key: mockInputElement.value, + }); + Object.defineProperty(inputEvent, 'target', { value: mockInputElement }); + directive['_handleInput'](inputEvent); + tick(725); + + expect(optionsLoadSpy).toHaveBeenCalledWith(expect.any(Array)); + })); }); diff --git a/projects/ngx-google-maps-places-autocomplete/src/lib/ngx-google-maps-places-autocomplete.directive.ts b/projects/ngx-google-maps-places-autocomplete/src/lib/ngx-google-maps-places-autocomplete.directive.ts index 6ff8128..229d49c 100644 --- a/projects/ngx-google-maps-places-autocomplete/src/lib/ngx-google-maps-places-autocomplete.directive.ts +++ b/projects/ngx-google-maps-places-autocomplete/src/lib/ngx-google-maps-places-autocomplete.directive.ts @@ -1,18 +1,8 @@ -import { - AfterViewInit, - Directive, - EnvironmentInjector, - inject, - input, - output, - runInInjectionContext, - signal -} from '@angular/core'; +import { AfterViewInit, Directive, inject, input, output, signal } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { NgControl } from '@angular/forms'; import { MatAutocompleteTrigger } from '@angular/material/autocomplete'; import { NgxGoogleMapsPlacesApiService } from 'ngx-google-maps-places-api'; -import { debounceTime, distinctUntilChanged, filter, map, switchMap, tap } from 'rxjs'; +import { debounceTime, distinctUntilChanged, filter, map, Subject, switchMap, tap } from 'rxjs'; import { NgxGoogleMapsPlacesAutocompletePlaceDetails @@ -33,24 +23,48 @@ import { textarea[matAutocomplete][ngxGoogleMapsPlacesAutocomplete] `, standalone: true, + host: { + '(input)': '_handleInput($event)', + }, exportAs: 'ngxGoogleMapsPlacesAutocomplete' }) export class NgxGoogleMapsPlacesAutocompleteDirective implements AfterViewInit { /** Determines whether place details should be loaded for the selected autocomplete suggestion. */ - public readonly shouldLoadPlaceDetails = input(true); + public readonly shouldLoadPlaceDetails$ = input(true, { alias: 'shouldLoadPlaceDetails' }); /** List of fields to be fetched at place details request. */ - public readonly fetchFields = input(undefined); + public readonly fetchFields$ = input(undefined, { alias: 'fetchFields' }); + /** + * An input property that specifies the options for the Google Maps Places Autocomplete request. + * This property allows the user to customize the autocomplete request, such as setting the + * location bias, types of places to return, or other parameters. + * If this property is not set, the default autocomplete request options will be used. + * @see https://developers.google.com/maps/documentation/javascript/reference/autocomplete-data#AutocompleteRequest + */ + public readonly placesAutocompleteRequest$ + = input | undefined>(undefined, { + alias: 'placesAutocompleteRequest' + }); + /** + * An input property that specifies the debounce time (in milliseconds) for the input event + * that triggers the autocomplete suggestions. If this property is not set, the default + * debounce time of 725 milliseconds will be used. + */ + public readonly placesAutocompleteDebounceTime$ = input(725, { + alias: 'placesAutocompleteDebounceTime' + }); /** * An event that is emitted when the options for the autocomplete suggestions have been loaded. */ - public readonly optionsLoad = output(); + public readonly optionsLoad$ + = output({ alias: 'optionsLoad' }); /** * An event that is emitted when the place details for the selected autocomplete suggestion have * been loaded. * The emitted value is the place details object, or `null` if the place details could * not be loaded. */ - public readonly placeDetailsLoad = output(); + public readonly placeDetailsLoad$ + = output({ alias: 'placeDetailsLoad' }); /** * An observable signal that holds the current list of autocomplete suggestions. * The suggestions are of type `NgxGoogleMapsPlacesAutocompleteSuggestion[]`. @@ -68,93 +82,78 @@ export class NgxGoogleMapsPlacesAutocompleteDirective implements AfterViewInit { * Places API. */ private readonly _ngxGoogleMapsPlacesApiService = inject(NgxGoogleMapsPlacesApiService); - /** - * A private readonly reference to the NgControl instance that is injected into this directive. - * The NgControl instance provides access to the form control associated with the input element - * that this directive is applied to. - */ - private readonly _control = inject(NgControl); /** * The MatAutocompleteTrigger instance provides access to the autocomplete functionality * associated with the input element that this directive is applied to. */ private readonly _matAutocompleteTrigger = inject(MatAutocompleteTrigger); /** - * The EnvironmentInjector instance provides access to the dependency injection environment for + * A private readonly Subject that emits keyboard events for the input element associated with * this directive. */ - private readonly _injector = inject(EnvironmentInjector); + private readonly _input$ = new Subject(); + + constructor() { + this._input$ + .pipe( + debounceTime(this.placesAutocompleteDebounceTime$() ?? 725), + distinctUntilChanged(), + tap((event) => this._matAutocompleteTrigger._handleInput(event)), + map((event) => event.target as HTMLInputElement), + filter(Boolean), + map((target) => target.value), + filter((value) => typeof value === 'string' && Boolean(value)), + // tap((value) => console.log('valueChanges', value)), + switchMap((value) => this._ngxGoogleMapsPlacesApiService.fetchSuggestions( + this.placesAutocompleteRequest$() + ? { ...this.placesAutocompleteRequest$(), input: value } + : value + )), + map((suggestions: google.maps.places.AutocompleteSuggestion[]) => suggestions + .filter((suggestion) => Boolean(suggestion?.placePrediction)) + .map(({ placePrediction }) => ({ + prediction: placePrediction!, + formattedMainHtml: this._ngxGoogleMapsPlacesApiService + .applyBoldToMatches(placePrediction!.mainText), + formattedSecondaryHtml: this._ngxGoogleMapsPlacesApiService + .applyBoldToMatches(placePrediction!.secondaryText), + formattedHtml: this._ngxGoogleMapsPlacesApiService + .applyBoldToMatches(placePrediction!.text) + } as NgxGoogleMapsPlacesAutocompleteSuggestion))), + // tap((predictions) => console.log('predictions', predictions)), + tap((predictions) => this.options$.set(predictions)), + tap((predictions) => this.optionsLoad$.emit(predictions)), + takeUntilDestroyed() + ) + .subscribe(); + this._matAutocompleteTrigger.optionSelections + .pipe( + filter(({ isUserInput }) => isUserInput && this.shouldLoadPlaceDetails$()), + // tap((value) => console.log('this._matAutocompleteTrigger.optionSelections', value)), + map((value) => value.source.value as NgxGoogleMapsPlacesAutocompleteSuggestion), + filter(Boolean), + switchMap((suggestion) => this._ngxGoogleMapsPlacesApiService + .fetchPlaceDetails(suggestion.prediction, this.fetchFields$())), + map((placeDetails) => ({ + place: placeDetails, + address: this._ngxGoogleMapsPlacesApiService.parseAddressComponents(placeDetails) + } as NgxGoogleMapsPlacesAutocompletePlaceDetails)), + // tap((placeDetails) => console.log('placeDetails', placeDetails)), + tap((placeDetails) => this.placeDetails$.set(placeDetails)), + tap((predictions) => this.placeDetailsLoad$.emit(predictions)), + takeUntilDestroyed() + ) + .subscribe(); + } /** - * This method is called after the directive's view has been initialized. It sets up the - * autocomplete functionality for the input element that this directive is applied to. - * It subscribes to the `valueChanges` observable of the form control associated with the input - * element, and uses the `NgxGoogleMapsPlacesApiService` to fetch autocomplete suggestions based on - * the input value. The fetched suggestions are then emitted through the `optionsLoad` event - * and stored in the `options$` observable signal. - * If the `shouldLoadPlaceDetails` flag is set to `true`, the method also sets up a subscription - * to the `optionSelections` observable of the `MatAutocompleteTrigger` instance. When a user - * selects an autocomplete suggestion, the method uses the `NgxGoogleMapsPlacesApiService` to fetch - * the place details for the selected suggestion, and emits the place details through - * the `placeDetailsLoad` event and stores them in the `placeDetails$` observable signal. - * The method also sets the `displayWith` function of the `MatAutocompleteTrigger` instance to - * the `displayFn` method of this directive, which is used to format the display of the - * autocomplete suggestions. + * Sets the display function for the autocomplete suggestions. + * This function is called by the Material Autocomplete component to display the text of each + * suggestion. */ public ngAfterViewInit(): void { - runInInjectionContext(this._injector, () => { - if (this._control.valueChanges) { - this._control.valueChanges - .pipe( - debounceTime(725), - distinctUntilChanged(), - filter((value) => typeof value === 'string'), - // tap((value) => console.log('valueChanges', value)), - switchMap((value) => this._ngxGoogleMapsPlacesApiService.fetchSuggestions(value)), - map((suggestions) => suggestions - .filter((suggestion) => Boolean(suggestion?.placePrediction)) - .map(({ placePrediction }) => ({ - prediction: placePrediction!, - formattedMainHtml: this._ngxGoogleMapsPlacesApiService - .applyBoldToMatches(placePrediction!.mainText), - formattedSecondaryHtml: this._ngxGoogleMapsPlacesApiService - .applyBoldToMatches(placePrediction!.secondaryText), - formattedHtml: this._ngxGoogleMapsPlacesApiService - .applyBoldToMatches(placePrediction!.text) - } as NgxGoogleMapsPlacesAutocompleteSuggestion))), - // tap((predictions) => console.log('predictions', predictions)), - tap((predictions) => this.options$.set(predictions)), - tap((predictions) => this.optionsLoad.emit(predictions)), - takeUntilDestroyed() - ) - .subscribe(); - } - }); if (!this._matAutocompleteTrigger.autocomplete.displayWith) { this._matAutocompleteTrigger.autocomplete.displayWith = this.displayFn; - // console.log('set autocomplete displayWith: ', this.displayFn); - } - if (this.shouldLoadPlaceDetails()) { - runInInjectionContext(this._injector, () => { - this._matAutocompleteTrigger.optionSelections - .pipe( - filter(({ isUserInput }) => isUserInput), - // tap((value) => console.log('this._matAutocompleteTrigger.optionSelections', value)), - map((value) => value.source.value as NgxGoogleMapsPlacesAutocompleteSuggestion), - filter(Boolean), - switchMap((suggestion) => this._ngxGoogleMapsPlacesApiService - .fetchPlaceDetails(suggestion.prediction, this.fetchFields())), - map((placeDetails) => ({ - place: placeDetails, - address: this._ngxGoogleMapsPlacesApiService.parseAddressComponents(placeDetails) - } as NgxGoogleMapsPlacesAutocompletePlaceDetails)), - // tap((placeDetails) => console.log('placeDetails', placeDetails)), - tap((placeDetails) => this.placeDetails$.set(placeDetails)), - tap((predictions) => this.placeDetailsLoad.emit(predictions)), - takeUntilDestroyed() - ) - .subscribe(); - }); } } @@ -167,4 +166,12 @@ export class NgxGoogleMapsPlacesAutocompleteDirective implements AfterViewInit { public displayFn(suggestion: NgxGoogleMapsPlacesAutocompleteSuggestion): string { return suggestion?.prediction?.text?.text || ''; } + + /** + * Handles the input event on the input element. + * @param event The keyboard event that triggered the input. + */ + private _handleInput(event: KeyboardEvent): void { + this._input$.next(event); + } }