From 3fb1145c6bf931e6043bb9cb7931a564d9a0448b Mon Sep 17 00:00:00 2001 From: chatenium Date: Wed, 8 Apr 2026 19:36:03 +0200 Subject: [PATCH] First commit --- README.md | 61 +- angular.json | 20 +- package-lock.json | 1748 ++++++++++++++++++- package.json | 16 +- public/Onest-ExtraBold.ttf | Bin 0 -> 64388 bytes public/Onest-Regular.ttf | Bin 0 -> 64272 bytes public/i18n/en.json | 20 + src/app/app.config.ts | 22 +- src/app/app.html | 347 +--- src/app/app.routes.ts | 7 +- src/app/{app.css => app.scss} | 0 src/app/app.ts | 22 +- src/app/chat/chat.html | 38 + src/app/chat/chat.scss | 54 + src/app/chat/chat.spec.ts | 22 + src/app/chat/chat.ts | 34 + src/app/chat/dm-list/dm-list.html | 3 + src/app/chat/dm-list/dm-list.scss | 0 src/app/chat/dm-list/dm-list.spec.ts | 22 + src/app/chat/dm-list/dm-list.ts | 35 + src/app/service-manager.spec.ts | 16 + src/app/service-manager.ts | 18 + src/app/signin/signin.html | 44 + src/app/signin/signin.scss | 34 + src/app/signin/signin.spec.ts | 22 + src/app/signin/signin.ts | 80 + src/app/storage/indexed-db.spec.ts | 16 + src/app/storage/indexed-db.ts | 165 ++ src/app/storage/key-value.spec.ts | 16 + src/app/storage/key-value.ts | 25 + src/app/storage/keyring.spec.ts | 16 + src/app/storage/keyring.ts | 34 + src/environments/environment.development.ts | 5 + src/environments/environment.ts | 5 + src/styles.css | 1 - src/styles.scss | 22 + tsconfig.json | 2 +- 37 files changed, 2498 insertions(+), 494 deletions(-) create mode 100644 public/Onest-ExtraBold.ttf create mode 100644 public/Onest-Regular.ttf create mode 100644 public/i18n/en.json rename src/app/{app.css => app.scss} (100%) create mode 100644 src/app/chat/chat.html create mode 100644 src/app/chat/chat.scss create mode 100644 src/app/chat/chat.spec.ts create mode 100644 src/app/chat/chat.ts create mode 100644 src/app/chat/dm-list/dm-list.html create mode 100644 src/app/chat/dm-list/dm-list.scss create mode 100644 src/app/chat/dm-list/dm-list.spec.ts create mode 100644 src/app/chat/dm-list/dm-list.ts create mode 100644 src/app/service-manager.spec.ts create mode 100644 src/app/service-manager.ts create mode 100644 src/app/signin/signin.html create mode 100644 src/app/signin/signin.scss create mode 100644 src/app/signin/signin.spec.ts create mode 100644 src/app/signin/signin.ts create mode 100644 src/app/storage/indexed-db.spec.ts create mode 100644 src/app/storage/indexed-db.ts create mode 100644 src/app/storage/key-value.spec.ts create mode 100644 src/app/storage/key-value.ts create mode 100644 src/app/storage/keyring.spec.ts create mode 100644 src/app/storage/keyring.ts create mode 100644 src/environments/environment.development.ts create mode 100644 src/environments/environment.ts delete mode 100644 src/styles.css create mode 100644 src/styles.scss diff --git a/README.md b/README.md index 0a50794..2bcef04 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,2 @@ -# ChateniumOnWeb - -This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 21.2.6. - -## Development server - -To start a local development server, run: - -```bash -ng serve -``` - -Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files. - -## Code scaffolding - -Angular CLI includes powerful code scaffolding tools. To generate a new component, run: - -```bash -ng generate component component-name -``` - -For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run: - -```bash -ng generate --help -``` - -## Building - -To build the project run: - -```bash -ng build -``` - -This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed. - -## Running unit tests - -To execute unit tests with the [Vitest](https://vitest.dev/) test runner, use the following command: - -```bash -ng test -``` - -## Running end-to-end tests - -For end-to-end (e2e) testing, run: - -```bash -ng e2e -``` - -Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs. - -## Additional Resources - -For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. +# Chatenium On Web +A modern web application for Chatenium compatible with a wide range of devices. diff --git a/angular.json b/angular.json index cf2c230..c22f147 100644 --- a/angular.json +++ b/angular.json @@ -2,7 +2,8 @@ "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "cli": { - "packageManager": "npm" + "packageManager": "npm", + "analytics": "66514902-9509-4324-8507-3c879a448c4a" }, "newProjectRoot": "projects", "projects": { @@ -22,10 +23,17 @@ { "glob": "**/*", "input": "public" + }, + { + "glob": "**/*", + "input": "node_modules/@taiga-ui/icons/src", + "output": "assets/taiga-ui/icons" } ], "styles": [ - "src/styles.css" + "node_modules/@taiga-ui/styles/taiga-ui-theme.less", + "node_modules/@taiga-ui/styles/taiga-ui-fonts.less", + "src/styles.scss" ] }, "configurations": { @@ -47,7 +55,13 @@ "development": { "optimization": false, "extractLicenses": false, - "sourceMap": true + "sourceMap": true, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.development.ts" + } + ] } }, "defaultConfiguration": "production" diff --git a/package-lock.json b/package-lock.json index 69aacef..fd9d28b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,25 @@ "name": "chatenium-on-web", "version": "0.0.0", "dependencies": { + "@angular/cdk": "^21.0.0", "@angular/common": "^21.2.0", "@angular/compiler": "^21.2.0", "@angular/core": "^21.2.0", "@angular/forms": "^21.2.0", "@angular/platform-browser": "^21.2.0", "@angular/router": "^21.2.0", + "@chatenium/chatenium-sdk": "^1.0.6", + "@ngx-translate/core": "^17.0.0", + "@ngx-translate/http-loader": "^17.0.0", + "@taiga-ui/addon-charts": "^5.1.0", + "@taiga-ui/addon-mobile": "^5.1.0", + "@taiga-ui/addon-table": "^5.1.0", + "@taiga-ui/cdk": "^5.1.0", + "@taiga-ui/core": "^5.1.0", + "@taiga-ui/icons": "^5.1.0", + "@taiga-ui/kit": "^5.1.0", + "@taiga-ui/layout": "^5.1.0", + "ngx-cookie-service": "^21.3.1", "rxjs": "~7.8.0", "tslib": "^2.3.0" }, @@ -22,6 +35,7 @@ "@angular/cli": "^21.2.6", "@angular/compiler-cli": "^21.2.0", "jsdom": "^28.0.0", + "less": "^4.6.4", "prettier": "^3.8.1", "typescript": "~5.9.2", "vitest": "^4.0.8" @@ -280,7 +294,7 @@ "version": "21.2.6", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.6.tgz", "integrity": "sha512-u5gPTAY7MC02uACQE39xxiFcm1hslF+ih/f2borMWnhER0JNTpHjLiLRXFkq7or7+VVHU30zfhK4XNAuO4WTIg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ajv": "8.18.0", @@ -308,7 +322,7 @@ "version": "21.2.6", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.6.tgz", "integrity": "sha512-hk2duJlPJyiMaI9MVWA5XpmlpD9C4n8qgquV/MJ7/n+ZRSwW3w1ndL5qUmA1ki+4Da54v/Rc8Wt5tUS955+93w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@angular-devkit/core": "21.2.6", @@ -423,6 +437,22 @@ } } }, + "node_modules/@angular/cdk": { + "version": "21.2.5", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.5.tgz", + "integrity": "sha512-F1sVqMAGYoiJNYYaR2cerqTo7IqpxQ3ZtMDxR3rtB0rSSd5UPOIQoqpsfSd6uH8FVnuzKaBII8Mg6YrjClFsng==", + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^21.0.0 || ^22.0.0", + "@angular/core": "^21.0.0 || ^22.0.0", + "@angular/platform-browser": "^21.0.0 || ^22.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, "node_modules/@angular/cli": { "version": "21.2.6", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.6.tgz", @@ -956,6 +986,18 @@ "specificity": "bin/cli.js" } }, + "node_modules/@chatenium/chatenium-sdk": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@chatenium/chatenium-sdk/-/chatenium-sdk-1.0.6.tgz", + "integrity": "sha512-lNrgIiXJWYc7KiQCtzWqgLQ0RpEoRWU2Z/GVEjcMyMlCMCX6Lu0g0cKj/8mREhk7kbJUAEcHnB18w5VjNicbIg==", + "dependencies": { + "@faker-js/faker": "^10.4.0", + "axios": "^1.14.0", + "dotenv": "^17.4.0", + "msw": "^2.12.14", + "uuid": "^13.0.0" + } + }, "node_modules/@csstools/color-helpers": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", @@ -1593,6 +1635,22 @@ } } }, + "node_modules/@faker-js/faker": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-10.4.0.tgz", + "integrity": "sha512-sDBWI3yLy8EcDzgobvJTWq1MJYzAkQdpjXuPukga9wXonhpMRvd1Izuo2Qgwey2OiEoRIBr35RMU9HJRoOHzpw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0", + "npm": ">=10" + } + }, "node_modules/@gar/promise-retry": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.3.tgz", @@ -1628,7 +1686,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -1663,7 +1720,6 @@ "version": "5.1.21", "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -1685,7 +1741,6 @@ "version": "10.3.2", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -1781,7 +1836,6 @@ "version": "1.0.15", "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -1960,7 +2014,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -2033,7 +2086,7 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -2162,6 +2215,50 @@ "win32" ] }, + "node_modules/@maskito/angular": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-5.2.2.tgz", + "integrity": "sha512-89J1JQE2vdmv49M/8Eow4eNZbRE6io8teM9TXplsHKurU7qnFNp8tZPY7MGsk+xbZRaL0iil102ieYJENu36Pg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "2.8.1" + }, + "peerDependencies": { + "@angular/core": ">=19.0.0", + "@angular/forms": ">=19.0.0", + "@maskito/core": "^5.2.2" + } + }, + "node_modules/@maskito/core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@maskito/core/-/core-5.2.2.tgz", + "integrity": "sha512-OFLK9NMQrz4eCgNgJ74S4x6IklqGQ71pcQToNGRzkIYnlEZbGpO+pzLREKLN/iKh4oBz8PI/9JnD3HtkN5Rl+w==", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/@maskito/kit": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-5.2.2.tgz", + "integrity": "sha512-ACuhzZ0EmMPBqi+RMbAqVPTMpQuhYVSBTLgBlyQppha1DurC4fN1fXL8MzHqbJbKiCbG2WELpl4mgyTgMcACIg==", + "license": "Apache-2.0", + "peer": true, + "peerDependencies": { + "@maskito/core": "^5.2.2" + } + }, + "node_modules/@maskito/phone": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@maskito/phone/-/phone-5.2.2.tgz", + "integrity": "sha512-OSldrjrK8nIb+8XfHVJ4KqhjInzw/mk8w/5YpIrroF9o85Usqyo22XlIwYmh/Sr9NWIuuKg2FwG/E2HAw2M7GA==", + "license": "Apache-2.0", + "peer": true, + "peerDependencies": { + "@maskito/core": "^5.2.2", + "@maskito/kit": "^5.2.2", + "libphonenumber-js": ">=1.0.0" + } + }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.26.0", "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.26.0.tgz", @@ -2287,6 +2384,23 @@ "win32" ] }, + "node_modules/@mswjs/interceptors": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", + "integrity": "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@napi-rs/nice": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", @@ -2629,6 +2743,153 @@ "@emnapi/runtime": "^1.7.1" } }, + "node_modules/@ng-web-apis/common": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-5.2.0.tgz", + "integrity": "sha512-vB6axKncJP33izmcC34EjWjzqfmGv2/PEbQLdVWU88jVCE3WWO9kOfyqVSMNCaLxu3ZC6qZRzZdIgmg4xe316A==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@types/dom-speech-recognition": "^0.0.8", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@ng-web-apis/intersection-observer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-5.2.0.tgz", + "integrity": "sha512-Y03IirbIVvUli5v41WlnFJEARF5svAkvo7hmVtVlCiK3yQdVlxiYRc/Ix0BooGTuhgTBv6L58ehInveLKyzLqg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.2.0" + } + }, + "node_modules/@ng-web-apis/mutation-observer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-5.2.0.tgz", + "integrity": "sha512-J82Q2/+RYwBZQU9JhbAbKE7p6MmWLQr/DPM59drYfyfMH0TvfMfxKtiYc+Reru3ByCTqqNNAIQ/w3c+11gDYcA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.2.0" + } + }, + "node_modules/@ng-web-apis/platform": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/platform/-/platform-5.2.0.tgz", + "integrity": "sha512-OMK9trN5Sc9IM8/5wnyNbFsjj0OPt3uC3Vsw4+tAiia7/FPDihJQWkd8VB9R+F/Xe7fOzqWCDC+ZnYADMp3vNw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@ng-web-apis/resize-observer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-5.2.0.tgz", + "integrity": "sha512-lRX6vIRGjQ5+wIT8voOiIhEck+4YSe8dhsRkEHLLrqjNQS8uQXcuDyG4kSGMLcHoExirYbRM0ATv6k1F6MXLOA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.2.0" + } + }, + "node_modules/@ng-web-apis/screen-orientation": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/screen-orientation/-/screen-orientation-5.2.0.tgz", + "integrity": "sha512-a7x7QFVQL8zESG47YRmwAHCaNrurXqPbNwsxoSL05VREi+u4p3/Sfe0WlzC7SwUkHJLqZf4RzzJuCuRa4QuI4g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.2.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@ngx-translate/core": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-17.0.0.tgz", + "integrity": "sha512-Rft2D5ns2pq4orLZjEtx1uhNuEBerUdpFUG1IcqtGuipj6SavgB8SkxtNQALNDA+EVlvsNCCjC2ewZVtUeN6rg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=16", + "@angular/core": ">=16" + } + }, + "node_modules/@ngx-translate/http-loader": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-17.0.0.tgz", + "integrity": "sha512-hgS8sa0ARjH9ll3PhkLTufeVXNI2DNR2uFKDhBgq13siUXzzVr/a31M6zgecrtwbA34iaBV01hsTMbMS8V7iIw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=16", + "@angular/core": ">=16" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "optional": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@npmcli/agent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", @@ -2837,6 +3098,28 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "license": "MIT" + }, "node_modules/@oxc-project/types": { "version": "0.113.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.113.0.tgz", @@ -3747,7 +4030,7 @@ "version": "21.2.6", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.6.tgz", "integrity": "sha512-KpLD8R2S762jbLdNEepE+b7KjhVOKPFHHdgNqhPv0NiGLdsvXSOx1e63JvFacoCZdmP7n3/gwmyT/utcVvnsag==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@angular-devkit/core": "21.2.6", @@ -3846,6 +4129,321 @@ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "license": "MIT" }, + "node_modules/@taiga-ui/addon-charts": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-5.1.0.tgz", + "integrity": "sha512-Z+n9iSEhKlyhpD/x9HWPD6vcPGNXP0orYDrYccpcsGRaTtROYzykcw1B606uWfAKAvDOmW3iIJaBNgjLac8Qbg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": ">=2.8.1" + }, + "peerDependencies": { + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.2.0", + "@taiga-ui/cdk": "5.1.0", + "@taiga-ui/core": "5.1.0", + "@taiga-ui/polymorpheus": "^5.0.0" + } + }, + "node_modules/@taiga-ui/addon-mobile": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-5.1.0.tgz", + "integrity": "sha512-5bAzttIcgppt/QzstmvAkDBEkyBfEMVqN5N8Fx8BLVRD3Um4KDcOS2wIJOL/5AY+twGujF6+tAsKSuVEwe5Siw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": ">=2.8.1" + }, + "peerDependencies": { + "@angular/cdk": ">=19.0.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.2.0", + "@ng-web-apis/platform": "^5.2.0", + "@taiga-ui/cdk": "5.1.0", + "@taiga-ui/core": "5.1.0", + "@taiga-ui/kit": "5.1.0", + "@taiga-ui/layout": "5.1.0", + "@taiga-ui/polymorpheus": "^5.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@taiga-ui/addon-table": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-table/-/addon-table-5.1.0.tgz", + "integrity": "sha512-ewCfRVWxG0vVs2+utXO26A7/UQ8JqhbB0BKcxbEomXGMxDwJ5+SDE3z6CWhBxdDwgth+gqdF1xf99MqshZDxyg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": ">=2.8.1" + }, + "peerDependencies": { + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@ng-web-apis/intersection-observer": "^5.2.0", + "@taiga-ui/cdk": "5.1.0", + "@taiga-ui/core": "5.1.0", + "@taiga-ui/i18n": "5.1.0", + "@taiga-ui/kit": "5.1.0", + "@taiga-ui/polymorpheus": "^5.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@taiga-ui/cdk": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-5.1.0.tgz", + "integrity": "sha512-wzf988cc5f6MTBsiKcLPZA2c8XwtEOAV9pBHjCN8tykjBMC600jVdczZHZdWY2MiqVHVfySnomlYkZM62IQmQg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.8.1" + }, + "optionalDependencies": { + "@angular-devkit/core": ">=19.0.0", + "@angular-devkit/schematics": ">=19.0.0", + "@schematics/angular": ">=19.0.0", + "ng-morph": "^4.8.4", + "parse5": "^7.3.0" + }, + "peerDependencies": { + "@angular/cdk": ">=19.0.0", + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@angular/forms": ">=19.0.0", + "@ng-web-apis/common": "^5.2.0", + "@ng-web-apis/mutation-observer": "^5.2.0", + "@ng-web-apis/platform": "^5.2.0", + "@ng-web-apis/resize-observer": "^5.2.0", + "@ng-web-apis/screen-orientation": "^5.2.0", + "@taiga-ui/event-plugins": "^5.0.0", + "@taiga-ui/font-watcher": "~0.5.0", + "@taiga-ui/polymorpheus": "^5.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "optional": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "optional": true, + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/@taiga-ui/core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-5.1.0.tgz", + "integrity": "sha512-thDWcJuDsgO9eItpa0KIplDSofmNnKSpSWflpzRst3DhIH1O+wfYBeebHk2keugOKU+bF+beX9Um4q38I89HvA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": ">=2.8.1" + }, + "peerDependencies": { + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@angular/forms": ">=19.0.0", + "@angular/platform-browser": ">=19.0.0", + "@angular/router": ">=19.0.0", + "@ng-web-apis/common": "^5.2.0", + "@ng-web-apis/mutation-observer": "^5.2.0", + "@ng-web-apis/platform": "^5.2.0", + "@taiga-ui/cdk": "5.1.0", + "@taiga-ui/event-plugins": "^5.0.0", + "@taiga-ui/i18n": "5.1.0", + "@taiga-ui/polymorpheus": "^5.0.0", + "@taiga-ui/styles": "5.1.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@taiga-ui/design-tokens": { + "version": "0.291.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/design-tokens/-/design-tokens-0.291.0.tgz", + "integrity": "sha512-oGLjOh/UXgJRRnz65Wp6yeUNl0ox+IWMdjKDJ6GKUKVr4TnJILDqN+hsGKJcQ+cctjRa+34QxGZO7AUtbAY1oA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@taiga-ui/event-plugins": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/event-plugins/-/event-plugins-5.0.0.tgz", + "integrity": "sha512-8AxIUn/lX4kwuDlIFmhElgBNtGDgQVC9/F+3O2A29IcMSt9693KRi8qKwToe9p3UuUsT9nnj5YeE11BtJMG0wA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": ">=16.0.0", + "@angular/platform-browser": ">=16.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@taiga-ui/font-watcher": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/font-watcher/-/font-watcher-0.5.0.tgz", + "integrity": "sha512-9QBUh3XT6KOS+pKVy4ggr0CxgiZtbDYlterUNcfXw8cswkIkiUl5VGDQdvmta60iPHqOrOd/Z/7aAUom35vX/g==", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/@taiga-ui/i18n": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-5.1.0.tgz", + "integrity": "sha512-NqCo1fK95w6aXHkvIZ3aqZOA2z+CnvD/eEEXZjbCs/Ik6QfWmGP8GbS5uwb7SzqNZz9QiVaJi5RNZtoInHf/tQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": ">=2.8.1" + }, + "peerDependencies": { + "@angular/core": ">=19.0.0", + "@ng-web-apis/common": "^5.2.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@taiga-ui/icons": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-5.1.0.tgz", + "integrity": "sha512-iRWYdYjt5PRneUSfUgPms9IHG0WbXNU9kNi/JnvMFukV/qhkBTuuvZaOv43LnBom9u/Wdsqfmi6WzUVjaxYKJw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@taiga-ui/kit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-5.1.0.tgz", + "integrity": "sha512-3k1asuOgEjDLAtkK/snO8anctfo4vmMsyr16NHcNVDRqvUeRDrWf7sdRD1uXloO0hTrJvVbKR3WnDWxnuTKm8Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": ">=2.8.1" + }, + "peerDependencies": { + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@angular/forms": ">=19.0.0", + "@angular/router": ">=19.0.0", + "@maskito/angular": "^5.2.2", + "@maskito/core": "^5.2.2", + "@maskito/kit": "^5.2.2", + "@maskito/phone": "^5.2.2", + "@ng-web-apis/common": "^5.2.0", + "@ng-web-apis/intersection-observer": "^5.2.0", + "@ng-web-apis/mutation-observer": "^5.2.0", + "@ng-web-apis/platform": "^5.2.0", + "@ng-web-apis/resize-observer": "^5.2.0", + "@taiga-ui/cdk": "5.1.0", + "@taiga-ui/core": "5.1.0", + "@taiga-ui/i18n": "5.1.0", + "@taiga-ui/polymorpheus": "^5.0.0", + "@taiga-ui/styles": "5.1.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@taiga-ui/layout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/layout/-/layout-5.1.0.tgz", + "integrity": "sha512-aibYOOv26nAPdbqHRhAVkb4te3GZLH6Cr1dtw/GyeCasJ4RovVD7Hn+MUvPR1OA3dX3t+ZLliAag++FIErGyxQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": ">=2.8.1" + }, + "peerDependencies": { + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "@taiga-ui/cdk": "5.1.0", + "@taiga-ui/core": "5.1.0", + "@taiga-ui/kit": "5.1.0", + "@taiga-ui/polymorpheus": "^5.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@taiga-ui/polymorpheus": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/polymorpheus/-/polymorpheus-5.0.0.tgz", + "integrity": "sha512-FRus7OgxYyRuETB17g1/YXYs8PAeF4x8+K4ZDfD3Ede8Vxv/XslAYZvf/Ro0wag6Uiy0kAP4bvSaIGPS1Y8Fyg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.8.1" + }, + "peerDependencies": { + "@angular/core": ">=19.0.0", + "@angular/platform-browser": ">=19.0.0" + } + }, + "node_modules/@taiga-ui/styles": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-5.1.0.tgz", + "integrity": "sha512-wWAcSm87aA0tBRcn6BUt7nVShMZBJNsOFG7QE8T7mIhG4Ss+7FCBSbbDNksWym8l69/LMIZGeAU0tc+rRSFXnw==", + "license": "Apache-2.0", + "peer": true, + "peerDependencies": { + "@taiga-ui/design-tokens": "~0.291.0" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.24.0.tgz", + "integrity": "sha512-c1xMmNHWpNselmpIqursHeOHHBTIsJLbB+NuovbTTRCNiTLEr/U9dbJ8qy0jd/O2x5pc3seWuOUN5R2IoOTp8A==", + "license": "MIT", + "optional": true, + "dependencies": { + "fast-glob": "^3.3.2", + "minimatch": "^9.0.4", + "mkdirp": "^3.0.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT", + "optional": true + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "license": "MIT", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "optional": true, + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", @@ -3899,6 +4497,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/dom-speech-recognition": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.8.tgz", + "integrity": "sha512-JgpjlGQWGc+OjjTNfyJ8Ic2w2+NOdrmEpmdVAkg+sYblx8I5ZZTeA+cfxvgUMtXXT7/WzYYR2Rrp3ZDg+l/3vA==", + "license": "MIT", + "peer": true + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -3906,6 +4511,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "license": "MIT" + }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.4.tgz", @@ -4084,7 +4702,7 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -4101,7 +4719,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -4161,7 +4779,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=12" @@ -4183,6 +4801,36 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -4193,6 +4841,23 @@ "node": ">=12" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz", + "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, "node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -4292,6 +4957,19 @@ "node": "18 || 20 || >=22" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "optional": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browserslist": { "version": "4.28.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", @@ -4379,7 +5057,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4441,7 +5118,7 @@ "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -4461,7 +5138,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "readdirp": "^5.0.0" @@ -4487,7 +5164,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "restore-cursor": "^5.0.0" @@ -4503,7 +5180,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18.20" @@ -4533,7 +5210,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, "license": "ISC", "engines": { "node": ">= 12" @@ -4590,11 +5266,17 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/code-block-writer": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "license": "MIT", + "optional": true + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -4607,7 +5289,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/colorette": { @@ -4617,6 +5298,25 @@ "dev": true, "license": "MIT" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT", + "optional": true + }, "node_modules/content-disposition": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", @@ -4668,6 +5368,22 @@ "node": ">=6.6.0" } }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/cors": { "version": "2.8.6", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", @@ -4810,6 +5526,15 @@ "dev": true, "license": "MIT" }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -4890,11 +5615,22 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dotenv": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.1.tgz", + "integrity": "sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -4979,11 +5715,24 @@ "dev": true, "license": "MIT" }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4993,7 +5742,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5010,7 +5758,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -5019,6 +5766,21 @@ "node": ">= 0.4" } }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", @@ -5065,7 +5827,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -5212,14 +5973,31 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, + "devOptional": true, "license": "MIT" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fast-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -5232,6 +6010,16 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "optional": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -5250,6 +6038,19 @@ } } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", @@ -5272,6 +6073,63 @@ "url": "https://opencollective.com/express" } }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -5324,7 +6182,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5344,7 +6201,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -5354,7 +6210,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -5367,7 +6223,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -5392,7 +6247,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -5420,6 +6274,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -5431,7 +6298,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5447,11 +6313,19 @@ "dev": true, "license": "ISC" }, + "node_modules/graphql": { + "version": "16.13.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.2.tgz", + "integrity": "sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5460,11 +6334,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -5473,6 +6361,12 @@ "node": ">= 0.4" } }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "license": "MIT" + }, "node_modules/hono": { "version": "4.12.12", "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.12.tgz", @@ -5638,6 +6532,20 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/immutable": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", @@ -5686,7 +6594,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "license": "MIT", "optional": true, "engines": { @@ -5713,7 +6620,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -5727,7 +6633,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=12" @@ -5736,6 +6642,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -5754,7 +6676,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -5763,6 +6685,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -5882,7 +6817,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/json-schema-typed": { @@ -5909,7 +6844,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/jsonparse": { @@ -5922,6 +6857,50 @@ ], "license": "MIT" }, + "node_modules/less": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/less/-/less-4.6.4.tgz", + "integrity": "sha512-OJmO5+HxZLLw0RLzkqaNHzcgEAQG7C0y3aMbwtCzIUFZsLMNNq/1IdAdHEycQ58CwUO3jPTHmoN+tE5I7FQxNg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "copy-anything": "^3.0.5", + "parse-node-version": "^1.0.1" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.12.41", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.41.tgz", + "integrity": "sha512-lsmMmGXBxXIK/VMLEj0kL6MtUs1kBGj1nTCzi6zgQoG1DEwqwt2DQyHxcLykceIxAnfE3hya7NuIh6PpC6S3fA==", + "license": "MIT", + "peer": true + }, "node_modules/listr2": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", @@ -6009,7 +6988,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-unicode-supported": "^2.0.0", @@ -6109,12 +7088,38 @@ "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/make-fetch-happen": { "version": "15.0.5", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.5.tgz", @@ -6143,7 +7148,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6179,6 +7183,57 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "optional": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -6210,7 +7265,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -6368,6 +7423,22 @@ "node": ">= 18" } }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "optional": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -6419,11 +7490,247 @@ "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" } }, + "node_modules/msw": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.13.2.tgz", + "integrity": "sha512-go2H1TIERKkC48pXiwec5l6sbNqYuvqOk3/vHGo1Zd+pq/H63oFawDQerH+WQdUw/flJFHDG7F+QdWMwhntA/A==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.41.2", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.0.2", + "graphql": "^16.12.0", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.10.1", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.0", + "type-fest": "^5.2.0", + "until-async": "^3.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/msw/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/msw/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/msw/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/msw/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/msw/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/msw/node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "license": "MIT" + }, + "node_modules/msw/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/msw/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/msw/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/msw/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/msw/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/multimatch/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT", + "optional": true + }, + "node_modules/multimatch/node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "license": "MIT", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/multimatch/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/mute-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" @@ -6448,6 +7755,38 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/needle": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.5.0.tgz", + "integrity": "sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -6458,6 +7797,70 @@ "node": ">= 0.6" } }, + "node_modules/ng-morph": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-4.8.4.tgz", + "integrity": "sha512-XwL53wCOhyaAxvoekN74ONbWUK30huzp+GpZYyC01RfaG2AX9l7YlC1mGG/l7Rx7YXtFAk85VFnNJqn2e46K8g==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "jsonc-parser": "3.3.1", + "minimatch": "10.0.1", + "multimatch": "5.0.0", + "ts-morph": "23.0.0" + }, + "peerDependencies": { + "@angular-devkit/core": ">=16.0.0", + "@angular-devkit/schematics": ">=16.0.0", + "tslib": "^2.7.0" + } + }, + "node_modules/ng-morph/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT", + "optional": true + }, + "node_modules/ng-morph/node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "license": "MIT", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ng-morph/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ngx-cookie-service": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-21.3.1.tgz", + "integrity": "sha512-8VEA2W7W2W3yPXhemJoVtXxr+3WW2DNLV4OaCIKDzLdzUUxJ6SzPHMmXXa26Pg8pa+fZxHK1hZfqJfUxr9RMBw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + }, + "peerDependencies": { + "@angular/common": "^21.0.0", + "@angular/core": "^21.0.0" + } + }, "node_modules/node-addon-api": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", @@ -6732,7 +8135,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "mimic-function": "^5.0.0" @@ -6748,7 +8151,7 @@ "version": "9.3.0", "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "chalk": "^5.6.2", @@ -6775,6 +8178,12 @@ "license": "MIT", "optional": true }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "license": "MIT" + }, "node_modules/p-map": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", @@ -6820,11 +8229,20 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/parse5": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", - "dev": true, "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -6878,7 +8296,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -6897,6 +8314,13 @@ "node": ">= 0.8" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT", + "optional": true + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -6956,14 +8380,13 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=12" @@ -6972,6 +8395,17 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/piscina": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.4.tgz", @@ -7112,6 +8546,23 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -7138,6 +8589,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -7168,7 +8640,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -7185,11 +8657,20 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7199,7 +8680,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "onetime": "^7.0.0", @@ -7222,6 +8703,23 @@ "node": ">= 4" } }, + "node_modules/rettime": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.10.1.tgz", + "integrity": "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==", + "license": "MIT" + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "optional": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", @@ -7323,6 +8821,30 @@ "node": ">= 18" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -7390,6 +8912,17 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "optional": true, + "engines": { + "node": ">=11.0.0" + } + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -7580,7 +9113,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -7669,7 +9201,7 @@ "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "engines": { "node": ">= 12" @@ -7755,7 +9287,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -7772,7 +9303,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.1.tgz", "integrity": "sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -7781,11 +9312,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "license": "MIT" + }, "node_modules/string-width": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "get-east-asian-width": "^1.5.0", @@ -7802,7 +9339,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" @@ -7821,6 +9358,18 @@ "dev": true, "license": "MIT" }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tar": { "version": "7.5.13", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", @@ -7896,7 +9445,6 @@ "version": "7.0.28", "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.28.tgz", "integrity": "sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==", - "dev": true, "license": "MIT", "dependencies": { "tldts-core": "^7.0.28" @@ -7909,9 +9457,21 @@ "version": "7.0.28", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.28.tgz", "integrity": "sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==", - "dev": true, "license": "MIT" }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -7926,7 +9486,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "tldts": "^7.0.5" @@ -7948,6 +9507,17 @@ "node": ">=20" } }, + "node_modules/ts-morph": { + "version": "23.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-23.0.0.tgz", + "integrity": "sha512-FcvFx7a9E8TUe6T3ShihXJLiJOiqyafzFKUO4aqIHDUCIvADdGNShcbc2W5PMr3LerXRv7mafvFZ9lRENxJmug==", + "license": "MIT", + "optional": true, + "dependencies": { + "@ts-morph/common": "~0.24.0", + "code-block-writer": "^13.0.1" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -7969,6 +9539,21 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/type-fest": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz", + "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", @@ -7988,7 +9573,7 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -8018,6 +9603,15 @@ "node": ">= 0.8" } }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -8049,6 +9643,19 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, "node_modules/validate-npm-package-name": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", @@ -8341,7 +9948,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -8356,7 +9962,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8366,7 +9971,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -8382,14 +9986,12 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8399,7 +10001,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -8414,7 +10015,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -8451,7 +10051,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "license": "ISC", "engines": { "node": ">=10" @@ -8514,7 +10113,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -8527,7 +10126,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" diff --git a/package.json b/package.json index 430d5cf..43bf9d8 100644 --- a/package.json +++ b/package.json @@ -11,12 +11,25 @@ "private": true, "packageManager": "npm@11.8.0", "dependencies": { + "@angular/cdk": "^21.0.0", "@angular/common": "^21.2.0", "@angular/compiler": "^21.2.0", "@angular/core": "^21.2.0", "@angular/forms": "^21.2.0", "@angular/platform-browser": "^21.2.0", "@angular/router": "^21.2.0", + "@chatenium/chatenium-sdk": "^1.0.6", + "@ngx-translate/core": "^17.0.0", + "@ngx-translate/http-loader": "^17.0.0", + "@taiga-ui/addon-charts": "^5.1.0", + "@taiga-ui/addon-mobile": "^5.1.0", + "@taiga-ui/addon-table": "^5.1.0", + "@taiga-ui/cdk": "^5.1.0", + "@taiga-ui/core": "^5.1.0", + "@taiga-ui/icons": "^5.1.0", + "@taiga-ui/kit": "^5.1.0", + "@taiga-ui/layout": "^5.1.0", + "ngx-cookie-service": "^21.3.1", "rxjs": "~7.8.0", "tslib": "^2.3.0" }, @@ -25,8 +38,9 @@ "@angular/cli": "^21.2.6", "@angular/compiler-cli": "^21.2.0", "jsdom": "^28.0.0", + "less": "^4.6.4", "prettier": "^3.8.1", "typescript": "~5.9.2", "vitest": "^4.0.8" } -} \ No newline at end of file +} diff --git a/public/Onest-ExtraBold.ttf b/public/Onest-ExtraBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a2486ce3e1787f3c31c365f331fdffa6e251e190 GIT binary patch literal 64388 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 O>NjfTdktnp5dUAPV<=7l literal 0 HcmV?d00001 diff --git a/public/Onest-Regular.ttf b/public/Onest-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dec9f7a23b8c9ffb2d11b65b5f9fe255e3f9472f GIT binary patch literal 64272 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

_$t;`VA%JRMf~|}XG5(LP>1gwgu3f`( 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 literal 0 HcmV?d00001 diff --git a/public/i18n/en.json b/public/i18n/en.json new file mode 100644 index 0000000..e41de95 --- /dev/null +++ b/public/i18n/en.json @@ -0,0 +1,20 @@ +{ + "signIn": { + "formTitle": "Sign in", + "mainInput": { + "label": "Username, email or phone number", + "placeholder": "bob, bob@example.com, +36201234567" + }, + "password": { + "label": "Password" + }, + "emailButton": "Sign in with email code", + "smsButton": "Sign in with SMS code", + "signInButton": "Sign in", + "errors": { + "unameMailPhoneRequired": "Username, email or phone number is required", + "passwordRequired": "Password is required", + "passwordIncorrect": "Password is incorrect" + } + } +} diff --git a/src/app/app.config.ts b/src/app/app.config.ts index cb1270e..597063c 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -1,11 +1,23 @@ -import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core'; -import { provideRouter } from '@angular/router'; +import {provideTaiga} from '@taiga-ui/core'; +import {ApplicationConfig, provideBrowserGlobalErrorListeners} from '@angular/core'; +import {provideRouter} from '@angular/router'; -import { routes } from './app.routes'; +import {routes} from './app.routes'; +import {provideTranslateService} from '@ngx-translate/core'; +import {provideTranslateHttpLoader} from '@ngx-translate/http-loader'; export const appConfig: ApplicationConfig = { providers: [ provideBrowserGlobalErrorListeners(), - provideRouter(routes) - ] + provideRouter(routes), + provideTaiga(), + provideTranslateService({ + fallbackLang: "en", + lang: "hu", + loader: provideTranslateHttpLoader({ + prefix: "/i18n/", + suffix: ".json" + }) + }) + ], }; diff --git a/src/app/app.html b/src/app/app.html index a1c4296..3485821 100644 --- a/src/app/app.html +++ b/src/app/app.html @@ -1,344 +1,3 @@ - - - - - - - - - - - -

-
-
- -

Hello, {{ title() }}

-

Congratulations! Your app is running. 🎉

-
- -
-
- @for (item of [ - { title: 'Explore the Docs', link: 'https://angular.dev' }, - { title: 'Learn with Tutorials', link: 'https://angular.dev/tutorials' }, - { title: 'Prompt and best practices for AI', link: 'https://angular.dev/ai/develop-with-ai'}, - { title: 'CLI Docs', link: 'https://angular.dev/tools/cli' }, - { title: 'Angular Language Service', link: 'https://angular.dev/tools/language-service' }, - { title: 'Angular DevTools', link: 'https://angular.dev/tools/devtools' }, - ]; track item.title) { - - {{ item.title }} - - - - - } -
- -
-
-
- - - - - - - - - - - + + + diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index dc39edb..efb39d8 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,3 +1,8 @@ import { Routes } from '@angular/router'; +import {SignIn} from './signin/signin'; +import {Chat} from './chat/chat'; -export const routes: Routes = []; +export const routes: Routes = [ + { path: 'signin', component: SignIn }, + { path: 'chat', component: Chat }, +]; diff --git a/src/app/app.css b/src/app/app.scss similarity index 100% rename from src/app/app.css rename to src/app/app.scss diff --git a/src/app/app.ts b/src/app/app.ts index d3917bf..e826466 100644 --- a/src/app/app.ts +++ b/src/app/app.ts @@ -1,12 +1,26 @@ -import { Component, signal } from '@angular/core'; +import { TuiRoot } from '@taiga-ui/core'; +import {Component, inject, OnInit, signal} from '@angular/core'; import { RouterOutlet } from '@angular/router'; +import { environment as env } from '../environments/environment'; +import {environment, SDKConfig} from '@chatenium/chatenium-sdk/core/environment'; +import {IndexedDB} from './storage/indexed-db'; @Component({ selector: 'app-root', - imports: [RouterOutlet], + imports: [RouterOutlet, TuiRoot], templateUrl: './app.html', - styleUrl: './app.css' + styleUrl: './app.scss', }) -export class App { +export class App implements OnInit { + indexedDb = inject(IndexedDB) + protected readonly title = signal('Chatenium-On-Web'); + + ngOnInit() { + environment.overwrite({ + cdnUrl: env.cdn_url, + apiUrl: env.api_url, + wsUrl: env.ws_url, + }); + } } diff --git a/src/app/chat/chat.html b/src/app/chat/chat.html new file mode 100644 index 0000000..903faf6 --- /dev/null +++ b/src/app/chat/chat.html @@ -0,0 +1,38 @@ +@if (serviceManager.currentSession() == null) { +
+ +
+} @else { +
+ + +
+
+ {{serviceManager.currentSession()|json}} + +
+
+
+} diff --git a/src/app/chat/chat.scss b/src/app/chat/chat.scss new file mode 100644 index 0000000..a314cdb --- /dev/null +++ b/src/app/chat/chat.scss @@ -0,0 +1,54 @@ +#layout { + display: grid; + grid-template-columns: 20% 80%; + height: 100svh; + + #chatnav { + display: grid; + grid-template-columns: 25% 75%; + + aside { + padding: 15px; + + #mode_switcher { + position: absolute; + top: 10%; + display: flex; + flex-direction: column; + width: 50px; + height: 150px; + + &::before { + height: 50px; + } + + button { + height: 50px; + } + } + + #bottom_btn { + position: absolute; + bottom: 2%; + width: 50px; + height: 50px; + } + } + + main { + padding: 25px; + } + } + + #content { + width: 100%; + padding: 10px; + + #content_tint { + height: 100%; + border-radius: 20px; + background: var(--tui-background-base-alt); + padding: 15px; + } + } +} diff --git a/src/app/chat/chat.spec.ts b/src/app/chat/chat.spec.ts new file mode 100644 index 0000000..b510cbc --- /dev/null +++ b/src/app/chat/chat.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { Chat } from './chat'; + +describe('Chat', () => { + let component: Chat; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [Chat], + }).compileComponents(); + + fixture = TestBed.createComponent(Chat); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/chat/chat.ts b/src/app/chat/chat.ts new file mode 100644 index 0000000..3184b5e --- /dev/null +++ b/src/app/chat/chat.ts @@ -0,0 +1,34 @@ +import {Component, inject, OnInit} from '@angular/core'; +import {RouterOutlet} from '@angular/router'; +import {TuiSegmented} from '@taiga-ui/kit'; +import {TuiButton, TuiIcon, TuiLoader} from '@taiga-ui/core'; +import {SessionManager} from '@chatenium/chatenium-sdk/services/sessionManager'; +import {ServiceManager} from '../service-manager'; +import {IndexedDB} from '../storage/indexed-db'; +import {DmList} from './dm-list/dm-list'; +import {JsonPipe} from '@angular/common'; + +@Component({ + selector: 'app-chat', + imports: [ + RouterOutlet, + TuiSegmented, + TuiIcon, + TuiButton, + TuiLoader, + DmList, + JsonPipe + ], + templateUrl: './chat.html', + styleUrl: './chat.scss', +}) +export class Chat implements OnInit { + serviceManager = inject(ServiceManager) + indexedDb = inject(IndexedDB) + + async ngOnInit() { + this.indexedDb.openDatabase().then(async () => { + this.serviceManager.currentSession.set(await this.serviceManager.sessionManager.loadPreferredSession()) + }) + } +} diff --git a/src/app/chat/dm-list/dm-list.html b/src/app/chat/dm-list/dm-list.html new file mode 100644 index 0000000..de3073c --- /dev/null +++ b/src/app/chat/dm-list/dm-list.html @@ -0,0 +1,3 @@ +@for (chat of chats(); track chat.chatid) { + {{chat.chatid}} +} diff --git a/src/app/chat/dm-list/dm-list.scss b/src/app/chat/dm-list/dm-list.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/chat/dm-list/dm-list.spec.ts b/src/app/chat/dm-list/dm-list.spec.ts new file mode 100644 index 0000000..17bc90b --- /dev/null +++ b/src/app/chat/dm-list/dm-list.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DmList } from './dm-list'; + +describe('DmList', () => { + let component: DmList; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DmList], + }).compileComponents(); + + fixture = TestBed.createComponent(DmList); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/chat/dm-list/dm-list.ts b/src/app/chat/dm-list/dm-list.ts new file mode 100644 index 0000000..d6d0c05 --- /dev/null +++ b/src/app/chat/dm-list/dm-list.ts @@ -0,0 +1,35 @@ +import {Component, inject, input, OnInit, signal} from '@angular/core'; +import {ChatService} from '@chatenium/chatenium-sdk/services/chatService'; +import {IndexedDB} from '../../storage/indexed-db'; +import {Chat} from '@chatenium/chatenium-sdk/domain/chatService.schema'; +import {JsonPipe} from '@angular/common'; + +@Component({ + selector: 'app-dm-list', + imports: [ + JsonPipe + ], + templateUrl: './dm-list.html', + styleUrl: './dm-list.scss', +}) +export class DmList implements OnInit { + userid = input("") + token = input("") + + indexedDb = inject(IndexedDB) + + service: ChatService | null = null + chats = signal([]) + chatsStatus = 0 + + async ngOnInit() { + this.service = new ChatService(this.userid(), this.token(), this.indexedDb.getApi(), () => {}) + try { + this.chats.set(await this.service.get()) + this.chatsStatus = 1 + } catch (e) { + console.error(e) + this.chatsStatus = 2 + } + } +} diff --git a/src/app/service-manager.spec.ts b/src/app/service-manager.spec.ts new file mode 100644 index 0000000..1825788 --- /dev/null +++ b/src/app/service-manager.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ServiceManager } from './service-manager'; + +describe('ServiceManager', () => { + let service: ServiceManager; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ServiceManager); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/service-manager.ts b/src/app/service-manager.ts new file mode 100644 index 0000000..c2cc209 --- /dev/null +++ b/src/app/service-manager.ts @@ -0,0 +1,18 @@ +import {inject, Injectable, signal} from '@angular/core'; +import {IndexedDB} from './storage/indexed-db'; +import {Keyring} from './storage/keyring'; +import {KeyValue} from './storage/key-value'; +import {SessionManager} from '@chatenium/chatenium-sdk/services/sessionManager'; +import {Session} from '@chatenium/chatenium-sdk/domain/sessionManager.schema'; + +@Injectable({ + providedIn: 'root', +}) +export class ServiceManager { + database = inject(IndexedDB) + keyring = inject(Keyring) + keyValue = inject(KeyValue) + + sessionManager = new SessionManager(this.database.getApi(), this.keyring.getApi(), this.keyValue.getApi()) + currentSession = signal(null) +} diff --git a/src/app/signin/signin.html b/src/app/signin/signin.html new file mode 100644 index 0000000..4203707 --- /dev/null +++ b/src/app/signin/signin.html @@ -0,0 +1,44 @@ +
+
+
+

{{"signIn.formTitle"|translate}}

+
+ +
+ + + + + + @if (signInForm.controls["unameMailPhone"].dirty) { + @if (signInForm.controls["unameMailPhone"].hasError("required")) { + + } + } + + + + + + + @if (signInForm.controls["password"].dirty) { + @if (signInForm.controls["password"].hasError("required")) { + + } @else if (signInForm.controls["password"].hasError("incorrect")) { + + } + } + +
+ + +
+
+ +
+ +
+
+
diff --git a/src/app/signin/signin.scss b/src/app/signin/signin.scss new file mode 100644 index 0000000..ddd33ac --- /dev/null +++ b/src/app/signin/signin.scss @@ -0,0 +1,34 @@ +#holder { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + + form { + width: 50%; + height: 45%; + border-radius: 35px; + background: var(--tui-background-base-alt); + padding: 20px; + display: flex; + flex-direction: column; + justify-content: center; + + main { + display: flex; + flex-direction: column; + gap: 10px; + + #methods { + width: 100%; + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 10px; + } + } + + footer { + margin-top: 30px; + } + } +} diff --git a/src/app/signin/signin.spec.ts b/src/app/signin/signin.spec.ts new file mode 100644 index 0000000..6b55e9a --- /dev/null +++ b/src/app/signin/signin.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { Signin } from './signin'; + +describe('Signin', () => { + let component: Signin; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [Signin], + }).compileComponents(); + + fixture = TestBed.createComponent(Signin); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/signin/signin.ts b/src/app/signin/signin.ts new file mode 100644 index 0000000..c145ecb --- /dev/null +++ b/src/app/signin/signin.ts @@ -0,0 +1,80 @@ +import {Component, inject, OnInit, signal} from '@angular/core'; +import {TuiAppearance, TuiButton, TuiError, TuiErrorDirective, TuiIcon, TuiInput, TuiTextfield} from '@taiga-ui/core'; +import {TranslatePipe} from '@ngx-translate/core'; +import {TuiButtonGroup, TuiPassword} from '@taiga-ui/kit'; +import {FormControl, FormGroup, ReactiveFormsModule, Validators} from '@angular/forms'; +import {AuthService} from '@chatenium/chatenium-sdk/services/authService'; +import {AuthMethods} from '@chatenium/chatenium-sdk/domain/authService.schema'; +import {SessionManager} from '@chatenium/chatenium-sdk/services/sessionManager'; +import {ServiceManager} from '../service-manager'; +import {IndexedDB} from '../storage/indexed-db'; +import {PublicUserData} from '@chatenium/chatenium-sdk/domain/common.schema'; + +@Component({ + selector: 'app-signin', + imports: [ + TuiAppearance, + TranslatePipe, + TuiTextfield, + TuiInput, + TuiButton, + TuiButtonGroup, + TuiPassword, + TuiIcon, + ReactiveFormsModule, + TuiErrorDirective, + TuiError + ], + templateUrl: './signin.html', + styleUrl: './signin.scss', +}) +export class SignIn implements OnInit { + indexedDb = inject(IndexedDB) + + service = new AuthService() + serviceManager = new ServiceManager() + methods = signal({sms: false, email: false, password: false}) + + private clickEvent = signal(0) + + signInForm = new FormGroup({ + unameMailPhone: new FormControl('', { + validators: [Validators.required] + }), + password: new FormControl('', { + validators: [Validators.required] + }) + }) + + timeoutId: any; + + async checkAuthMethods(unameMailPhone: string | null) { + console.log("Called") + clearTimeout(this.timeoutId); + + this.timeoutId = setTimeout(async () => { + this.methods.set({sms: false, password: false, email: false}) + this.methods.set(await this.service.getAuthMethods(unameMailPhone ?? "")) + }, 500) + } + + async passwordSignIn(unameMailPhone: string | null, password: string | null) { + try { + const resp = await this.service.loginPasswordAuth(unameMailPhone ?? "", password ?? "") + this.serviceManager.sessionManager.addSession({ + pfp: resp.pfp, + userid: resp.userid, + username: resp.username, + displayName: resp.displayName, + }, resp.token) + console.log("Logged in") + } catch (e) { + console.error(e) + this.signInForm.controls['password'].setErrors({incorrect: true}) + } + } + + ngOnInit() { + this.indexedDb.openDatabase() + } +} diff --git a/src/app/storage/indexed-db.spec.ts b/src/app/storage/indexed-db.spec.ts new file mode 100644 index 0000000..ad25f93 --- /dev/null +++ b/src/app/storage/indexed-db.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { IndexedDB } from './indexed-db'; + +describe('IndexedDB', () => { + let service: IndexedDB; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(IndexedDB); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/storage/indexed-db.ts b/src/app/storage/indexed-db.ts new file mode 100644 index 0000000..294843a --- /dev/null +++ b/src/app/storage/indexed-db.ts @@ -0,0 +1,165 @@ +import {inject, Injectable} from '@angular/core'; +import {TuiAlertService} from '@taiga-ui/core'; +import {DatabaseAPI} from '@chatenium/chatenium-sdk/storage/database'; + +@Injectable({ + providedIn: 'root' +}) +export class IndexedDB { + private dbVersion = 1 + private db: IDBDatabase | null = null + + getApi(): DatabaseAPI { + return { + get: async (collection, key) => { + return await this.get(collection, key) + }, + set: (collection, key, value) => { + return this.putObject(collection, value, key); + }, + flush: () => {}, + delete: (collection, key) => { + return this.delete(collection, key); + } + } + } + + openDatabase(): Promise { + return new Promise(resolve => { + const request = indexedDB.open("cache", this.dbVersion); + + request.onupgradeneeded = (e: IDBVersionChangeEvent) => { + const db = (e.target as IDBOpenDBRequest).result; + db.createObjectStore('sessions', { keyPath: 'id' }) + db.createObjectStore('chats', { keyPath: 'id' }) + db.createObjectStore('networks', { keyPath: 'id' }) + db.createObjectStore('files', { keyPath: 'id' }) + db.createObjectStore('messages', { keyPath: 'id' }) + } + + request.onsuccess = (event: Event) => { + this.db = (event.target as IDBOpenDBRequest).result; + console.log("Indexed DB Successfully opened") + resolve() + } + + request.onerror = _ => { + const request = indexedDB.deleteDatabase("cache"); + request.onsuccess = _ => { + setTimeout(() => { + console.log("Recreated the database.") + location.reload() + }, 1500) + } + + request.onerror = _ => { + console.error("Fatal error. Cannot access indexedDB, check if access is not blocked.") + } + } + }) + } + + public putObject(storeName: string, data: any, id: string) { + if (this.db) { + const request = this.db.transaction([storeName], 'readwrite') + .objectStore(storeName) + .put({id: id, data: data}) + + request.onerror = _ => { + console.error("[IDB] ERROR: Adding data failed.") + } + } else { + console.error("[IDB] ERROR: DB Not open. Retrying in 500ms...") + + setTimeout(() => { + console.log("Retrying now...") + this.putObject(storeName, data, id) + }, 1000) + } + } + + clearObjectStore(storeName: string) { + return new Promise((resolve, reject) => { + if (this.db) { + const transaction = this.db.transaction([storeName], "readwrite"); + const store = transaction.objectStore(storeName); + const request = store.clear(); + + request.onsuccess = () => { + resolve("Ok"); + }; + + request.onerror = () => { + console.error("Getting chats cache failed"); + reject([]); + }; + } else { + console.error("DB NOT OPEN (CLEAROBJECTSTORE)") + } + }); + } + + + getAll(storeName: string): Promise { + return new Promise((resolve, reject) => { + if (this.db) { + const transaction = this.db.transaction([storeName], "readonly"); + const store = transaction.objectStore(storeName); + const request = store.getAll(); + + request.onsuccess = () => { + resolve(request.result.map((data) => data.data)); + }; + + request.onerror = () => { + console.error("Getting chats cache failed"); + reject([]); + }; + } else { + console.error("DB NOT OPEN (GETALL)") + } + }); + } + + get(storeName: string, key: string): Promise { + return new Promise((resolve, reject) => { + if (this.db) { + const transaction = this.db.transaction([storeName], "readonly"); + const store = transaction.objectStore(storeName); + const request = store.get(key); + + request.onsuccess = () => { + resolve(request.result == null ? [] : request.result.data); + }; + + request.onerror = () => { + console.error("Getting chats cache failed"); + reject([]); + }; + } else { + console.error("[IDB GET] ERROR: DB Not open.") + } + }); + } + + delete(storeName: string, key: string): Promise { + return new Promise((resolve, reject) => { + if (this.db) { + const transaction = this.db.transaction([storeName], "readonly"); + const store = transaction.objectStore(storeName); + const request = store.delete(key); + + request.onsuccess = () => { + resolve(); + }; + + request.onerror = () => { + console.error("Getting chats cache failed"); + reject([]); + }; + } else { + console.error("[IDB GET] ERROR: DB Not open.") + } + }); + } +} diff --git a/src/app/storage/key-value.spec.ts b/src/app/storage/key-value.spec.ts new file mode 100644 index 0000000..728af74 --- /dev/null +++ b/src/app/storage/key-value.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { KeyValue } from './key-value'; + +describe('KeyValue', () => { + let service: KeyValue; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(KeyValue); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/storage/key-value.ts b/src/app/storage/key-value.ts new file mode 100644 index 0000000..ac90135 --- /dev/null +++ b/src/app/storage/key-value.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import {KeyringAPI} from '@chatenium/chatenium-sdk/storage/keyring'; +import {KeyValueAPI} from '@chatenium/chatenium-sdk/storage/keyvalue'; + +@Injectable({ + providedIn: 'root', +}) +export class KeyValue { + getApi(): KeyValueAPI { + return { + set: (key, value) => { + localStorage.setItem(key, value) + }, + get: key => { + return new Promise(r => r(localStorage.getItem(key) ?? "")) + }, + delete: key => { + return localStorage.removeItem(key) + }, + flush: () => { + return localStorage.clear() + } + } + } +} diff --git a/src/app/storage/keyring.spec.ts b/src/app/storage/keyring.spec.ts new file mode 100644 index 0000000..9d6dff6 --- /dev/null +++ b/src/app/storage/keyring.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { Keyring } from './keyring'; + +describe('Keyring', () => { + let service: Keyring; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(Keyring); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/storage/keyring.ts b/src/app/storage/keyring.ts new file mode 100644 index 0000000..fc9df7a --- /dev/null +++ b/src/app/storage/keyring.ts @@ -0,0 +1,34 @@ +import {inject, Injectable} from '@angular/core'; +import {CookieService} from 'ngx-cookie-service'; +import {KeyringAPI} from '@chatenium/chatenium-sdk/storage/keyring'; + +@Injectable({ + providedIn: 'root', +}) +export class Keyring { + cookieService = inject(CookieService) + + getApi(): KeyringAPI { + return { + set: (key, value) => { + this.cookieService.set(key, value) + }, + get: key => { + return new Promise(r => r(this.cookieService.get(key))) + }, + delete: key => { + return this.cookieService.delete(key) + }, + getAll: () => { + return new Promise(r => { + const cookies = this.cookieService.getAll() + let resp: string[] = [] + for (const key in cookies) { + resp.push(key) + } + r(resp) + }) + } + } + } +} diff --git a/src/environments/environment.development.ts b/src/environments/environment.development.ts new file mode 100644 index 0000000..2afe09d --- /dev/null +++ b/src/environments/environment.development.ts @@ -0,0 +1,5 @@ +export const environment = { + api_url: "http://localhost:3000", + cdn_url: "http://localhost:4000", + ws_url: "ws://localhost:3000", +}; diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 0000000..c3ff8e7 --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,5 @@ +export const environment = { + api_url: "https://api.chatenium.hu", + cdn_url: "https://cdn.chatenium.hu", + ws_url: "wss://cdn.chatenium.hu", +}; diff --git a/src/styles.css b/src/styles.css deleted file mode 100644 index 90d4ee0..0000000 --- a/src/styles.css +++ /dev/null @@ -1 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 0000000..b51f3d6 --- /dev/null +++ b/src/styles.scss @@ -0,0 +1,22 @@ +/* You can add global styles to this file, and also import other style files */ +body { + margin: 0; + padding: 0; + background: var(--tui-background-base); +} + +*, *::before, *::after { + font-family: "Onest", serif !important; + box-sizing: border-box; +} + +@font-face { + font-family: "Onest"; + src: url("/Onest-Regular.ttf") +} + +@font-face { + font-family: "Onest"; + src: url("/Onest-ExtraBold.ttf"); + font-weight: bold; +} diff --git a/tsconfig.json b/tsconfig.json index 2ab7442..9dccbc7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,7 +13,7 @@ "experimentalDecorators": true, "importHelpers": true, "target": "ES2022", - "module": "preserve" + "module": "preserve", }, "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false,