From 94b6bf483b9c2c6df2b3cca8899a7b0c1f0c39a4 Mon Sep 17 00:00:00 2001
From: Richard Russell <2265225+rars@users.noreply.github.com>
Date: Thu, 14 Mar 2024 20:51:24 +0000
Subject: [PATCH] feat(ngx-diff): add `ngx-unified-diff` component to replace
`inline-diff`; deprecate `inline-diff`
---
README.md | 82 +-
package-lock.json | 1012 +++++++++--------
package.json | 2 +-
projects/ngx-diff/package.json | 2 +-
.../inline-diff/inline-diff.component.html | 55 +-
.../inline-diff/inline-diff.component.scss | 144 ---
.../inline-diff/inline-diff.component.spec.ts | 44 +-
.../inline-diff/inline-diff.component.ts | 332 +-----
.../unified-diff/unified-diff.component.html | 48 +
.../unified-diff/unified-diff.component.scss | 144 +++
.../unified-diff.component.spec.ts | 81 ++
.../unified-diff/unified-diff.component.ts | 352 ++++++
12 files changed, 1232 insertions(+), 1066 deletions(-)
create mode 100644 projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.html
create mode 100644 projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.scss
create mode 100644 projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.spec.ts
create mode 100644 projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.ts
diff --git a/README.md b/README.md
index cd7476f..0083561 100644
--- a/README.md
+++ b/README.md
@@ -7,15 +7,15 @@ Angular component library for displaying diffs of text. [Demo](https://rars.gith
## Quickstart
1. Install `ngx-diff` modules from npm:
- ```
+ ```bash
npm install ngx-diff diff-match-patch-ts --save
```
2. Either:
- 2.1. If you are using this component in an NgModule-based setting, add `InlineDiffComponent` to your module's `imports`:
+ 2.1. If you are using this component in an NgModule-based setting, add `UnifiedDiffComponent` or `SideBySideDiffComponent` to your module's `imports`:
```typescript
- import { InlineDiffComponent } from 'ngx-diff';
+ import { UnifiedDiffComponent } from 'ngx-diff';
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
@@ -24,17 +24,17 @@ Angular component library for displaying diffs of text. [Demo](https://rars.gith
@NgModule({
declarations: [AppComponent],
- imports: [BrowserModule, InlineDiffComponent],
+ imports: [BrowserModule, UnifiedDiffComponent],
providers: [],
bootstrap: [AppComponent],
})
export class AppModule {}
```
- 2.2. Or if you are using this component in a standalone component setting, add `InlineDiffComponent` to your component's `imports`:
+ 2.2. Or if you are using this component in a standalone component setting, add `UnifiedDiffComponent` or `SideBySideDiffComponent` to your component's `imports`:
```typescript
- import { InlineDiffComponent } from 'ngx-diff';
+ import { SideBySideDiffComponent } from 'ngx-diff';
import { Component } from '@angular/core';
@@ -43,43 +43,70 @@ Angular component library for displaying diffs of text. [Demo](https://rars.gith
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
standalone: true,
- imports: [InlineDiffComponent],
+ imports: [SideBySideDiffComponent],
})
export class AppComponent {
// ...
}
```
-3. Use the `inline-diff` component by setting the `oldText` and `newText` attributes:
+3. Use the `ngx-unified-diff` component by setting the `before` and `after` attributes:
+
+ ```HTML
+
+ ```
+
+ or use the `ngx-side-by-side-diff` component by setting the `before` and `after` attributes:
+
```HTML
-
+
```
+### Upgrading from v7.0.0
+
+In v8.0.0, `inline-diff` component has been deprecated and users should switch to the `ngx-unified-diff` component that has been added and provides equivalent functionality. `inline-diff` will be removed in the next release.
+
## Theming
-For version 3+, you can customise the appearance of the diff through various CSS variable settings. For example, in your `styles.scss` file, define:
+For version 3+, you can customise the appearance of the diff through various CSS variable settings. If you are not using the latest version, refer to the `README.md` file in earlier releases.
+
+In version 8.0.0, a light and dark theme was introduced. This should be imported to your application `styles.scss` file or equivalent.
+
+```scss
+@import 'ngx-diff/styles/default-theme';
+```
+
+You can then use the provided `ngx-diff-light-theme` or `ngx-diff-dark-theme` classes.
+
+### Custom theme
+
+To create your own theme, override the relevant CSS variables; for example, in your `styles.scss` file, define:
```SCSS
-:root .my-custom-ngx-diff-theme {
- --ngx-diff-border-color: #888888;
- --ngx-diff-font-size: 1rem;
+.my-custom-ngx-diff-theme {
+ --ngx-diff-border-color: #dfdfdf;
+ --ngx-diff-font-size: 0.9rem;
--ngx-diff-font-family: Consolas, Courier, monospace;
- --ngx-diff-font-color: #000000;
- --ngx-diff-title-bar-padding: 0.5rem;
- --ngx-diff-title-font-weight: 600;
- --ngx-diff-line-number-font-color: #484848;
- --ngx-diff-line-number-hover-font-color: #ffffff;
- --ngx-diff-selected-border-color: #ff8000;
+ --ngx-diff-font-color: #000;
+ --ngx-diff-line-number-font-color: #aaaaaa;
+ --ngx-diff-line-number-hover-font-color: #484848;
+
+ --ngx-diff-selected-border-width: 0;
+ --ngx-diff-selected-border-color: #000;
+ --ngx-diff-selected-line-background-color: #d6f1ff;
+
--ngx-diff-line-number-width: 2rem;
--ngx-diff-border-width: 1px;
--ngx-diff-line-left-padding: 1rem;
--ngx-diff-bottom-spacer-height: 1rem;
+ --ngx-diff-title-bar-padding: 0.5rem;
+ --ngx-diff-title-font-weight: 600;
--ngx-diff-insert-color: #d6ffd6;
--ngx-diff-delete-color: #ffd6d6;
--ngx-diff-equal-color: #ffffff;
--ngx-diff-mix-color: #000;
- --ngx-diff-light-mix-percentage: 2%;
+ --ngx-diff-light-mix-percentage: 4%;
--ngx-diff-heavy-mix-percentage: 10%;
}
```
@@ -87,13 +114,14 @@ For version 3+, you can customise the appearance of the diff through various CSS
Then use this class in your desired component in your HTML template:
```HTML
-
+
```
It is recommended to use these settings rather than attempt to override styles based upon DOM structure or class names that are internal details that may change.
diff --git a/package-lock.json b/package-lock.json
index cfbb480..b5552c4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ngx-diff",
- "version": "7.0.0",
+ "version": "8.0.0-alpha.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ngx-diff",
- "version": "7.0.0",
+ "version": "8.0.0-alpha.0",
"dependencies": {
"@angular/animations": "^17.0.0",
"@angular/common": "^17.0.0",
@@ -68,25 +68,25 @@
}
},
"node_modules/@ampproject/remapping": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
- "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
"dev": true,
"dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@angular-devkit/architect": {
- "version": "0.1702.2",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1702.2.tgz",
- "integrity": "sha512-qBvif8/NquFUqVQgs4U+8wXh/rQZv+YlYwg6eDZly1bIaTd/k9spko/seTtNT1OpK/Be+GLo5IbiQ7i2SON3iQ==",
+ "version": "0.1703.0",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.0.tgz",
+ "integrity": "sha512-2X2cswI4TIwtQxCe5U9f4jeiDjAb8r89XLpU0QwEHyZyWx02uhYHO3FDMJq/NxCS95IUAQOBGBhbD4ey4Hl9cQ==",
"dev": true,
"dependencies": {
- "@angular-devkit/core": "17.2.2",
+ "@angular-devkit/core": "17.3.0",
"rxjs": "7.8.1"
},
"engines": {
@@ -96,70 +96,70 @@
}
},
"node_modules/@angular-devkit/build-angular": {
- "version": "17.2.2",
- "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.2.2.tgz",
- "integrity": "sha512-K55xBiWBfxD4wmxLR2viOPbBryOk6YaZeNr72IMkp1yIrIy1BES6LDJi7R9fDW7+TprqZdM4B91Tkc+BCwYQzQ==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.0.tgz",
+ "integrity": "sha512-mC70mZK/liITM4VlGL6hmYPkVsZwAb+X3TxwodBl/g8p/sYijDhK/4QJHzmcHTxLYQQS6nS5CUcr9ARQFkGN2w==",
"dev": true,
"dependencies": {
- "@ampproject/remapping": "2.2.1",
- "@angular-devkit/architect": "0.1702.2",
- "@angular-devkit/build-webpack": "0.1702.2",
- "@angular-devkit/core": "17.2.2",
- "@babel/core": "7.23.9",
+ "@ampproject/remapping": "2.3.0",
+ "@angular-devkit/architect": "0.1703.0",
+ "@angular-devkit/build-webpack": "0.1703.0",
+ "@angular-devkit/core": "17.3.0",
+ "@babel/core": "7.24.0",
"@babel/generator": "7.23.6",
"@babel/helper-annotate-as-pure": "7.22.5",
"@babel/helper-split-export-declaration": "7.22.6",
"@babel/plugin-transform-async-generator-functions": "7.23.9",
"@babel/plugin-transform-async-to-generator": "7.23.3",
- "@babel/plugin-transform-runtime": "7.23.9",
- "@babel/preset-env": "7.23.9",
- "@babel/runtime": "7.23.9",
+ "@babel/plugin-transform-runtime": "7.24.0",
+ "@babel/preset-env": "7.24.0",
+ "@babel/runtime": "7.24.0",
"@discoveryjs/json-ext": "0.5.7",
- "@ngtools/webpack": "17.2.2",
+ "@ngtools/webpack": "17.3.0",
"@vitejs/plugin-basic-ssl": "1.1.0",
"ansi-colors": "4.1.3",
- "autoprefixer": "10.4.17",
+ "autoprefixer": "10.4.18",
"babel-loader": "9.1.3",
"babel-plugin-istanbul": "6.1.1",
"browserslist": "^4.21.5",
"copy-webpack-plugin": "11.0.0",
- "critters": "0.0.20",
+ "critters": "0.0.22",
"css-loader": "6.10.0",
- "esbuild-wasm": "0.20.0",
+ "esbuild-wasm": "0.20.1",
"fast-glob": "3.3.2",
"http-proxy-middleware": "2.0.6",
- "https-proxy-agent": "7.0.2",
- "inquirer": "9.2.14",
+ "https-proxy-agent": "7.0.4",
+ "inquirer": "9.2.15",
"jsonc-parser": "3.2.1",
"karma-source-map-support": "1.4.0",
"less": "4.2.0",
"less-loader": "11.1.0",
"license-webpack-plugin": "4.0.2",
"loader-utils": "3.2.1",
- "magic-string": "0.30.7",
- "mini-css-extract-plugin": "2.8.0",
+ "magic-string": "0.30.8",
+ "mini-css-extract-plugin": "2.8.1",
"mrmime": "2.0.0",
"open": "8.4.2",
"ora": "5.4.1",
"parse5-html-rewriting-stream": "7.0.0",
"picomatch": "4.0.1",
- "piscina": "4.3.1",
+ "piscina": "4.4.0",
"postcss": "8.4.35",
- "postcss-loader": "8.1.0",
+ "postcss-loader": "8.1.1",
"resolve-url-loader": "5.0.0",
"rxjs": "7.8.1",
- "sass": "1.70.0",
- "sass-loader": "14.1.0",
+ "sass": "1.71.1",
+ "sass-loader": "14.1.1",
"semver": "7.6.0",
"source-map-loader": "5.0.0",
"source-map-support": "0.5.21",
- "terser": "5.27.0",
+ "terser": "5.29.1",
"tree-kill": "1.2.2",
"tslib": "2.6.2",
- "undici": "6.6.2",
- "vite": "5.0.12",
+ "undici": "6.7.1",
+ "vite": "5.1.5",
"watchpack": "2.4.0",
- "webpack": "5.90.1",
+ "webpack": "5.90.3",
"webpack-dev-middleware": "6.1.1",
"webpack-dev-server": "4.15.1",
"webpack-merge": "5.10.0",
@@ -171,7 +171,7 @@
"yarn": ">= 1.13.0"
},
"optionalDependencies": {
- "esbuild": "0.20.0"
+ "esbuild": "0.20.1"
},
"peerDependencies": {
"@angular/compiler-cli": "^17.0.0",
@@ -186,7 +186,7 @@
"ng-packagr": "^17.0.0",
"protractor": "^7.0.0",
"tailwindcss": "^2.0.0 || ^3.0.0",
- "typescript": ">=5.2 <5.4"
+ "typescript": ">=5.2 <5.5"
},
"peerDependenciesMeta": {
"@angular/localize": {
@@ -225,12 +225,12 @@
}
},
"node_modules/@angular-devkit/build-webpack": {
- "version": "0.1702.2",
- "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1702.2.tgz",
- "integrity": "sha512-+c7rHD2Se1VD9i9uPEYHqhq8hTnsUAn5LfeJCLS8g7FU8T42tDSC/k1qWxHp7d99kf7ecg2BvYcZDlYaBUnl3A==",
+ "version": "0.1703.0",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.0.tgz",
+ "integrity": "sha512-IEaLzV5lolURJhMKM4naW6pYTDjI5E8I+97o/kbSa0yakvGOBwg7yRmfc54T1M0Z4nmifPsj4OVRGhBaa6dgXA==",
"dev": true,
"dependencies": {
- "@angular-devkit/architect": "0.1702.2",
+ "@angular-devkit/architect": "0.1703.0",
"rxjs": "7.8.1"
},
"engines": {
@@ -244,9 +244,9 @@
}
},
"node_modules/@angular-devkit/core": {
- "version": "17.2.2",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.2.2.tgz",
- "integrity": "sha512-bKMi6bBkEeN4a3qTxCykhrAvE0ESHhKO38Qh1bN/8QSyvKVAEyVAVls5W9IN5GKRHvXgEn9aw+DSzRnPpy9nyw==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.0.tgz",
+ "integrity": "sha512-ldErhMYq8rcFOhWQ0syQdLy6IYb/LL0erigj7gCMOf59oJgM7B13o/ZTOCvyJttUZ9IP0HB98Gi3epEuJ30VLg==",
"dev": true,
"dependencies": {
"ajv": "8.12.0",
@@ -271,14 +271,14 @@
}
},
"node_modules/@angular-devkit/schematics": {
- "version": "17.2.2",
- "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.2.2.tgz",
- "integrity": "sha512-t6dBhHvto9BEIo+Kew0+YyIS3TV1SEd4MActUk+zF4NNQyJ8wRUHL+8glUKB6ZWPyCTYSinJ+QKn/3yytELTHg==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.0.tgz",
+ "integrity": "sha512-EW4Y8W/KTlvvT2fw3bh9hY7quDF2b9EaF+KftEqoDRWYbw0tlF8hWIdlfA6JxQC12d6uefh3kDNj5am0Il2oNQ==",
"dev": true,
"dependencies": {
- "@angular-devkit/core": "17.2.2",
+ "@angular-devkit/core": "17.3.0",
"jsonc-parser": "3.2.1",
- "magic-string": "0.30.7",
+ "magic-string": "0.30.8",
"ora": "5.4.1",
"rxjs": "7.8.1"
},
@@ -566,9 +566,9 @@
}
},
"node_modules/@angular/animations": {
- "version": "17.2.3",
- "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.2.3.tgz",
- "integrity": "sha512-eQcN6hC/dXISEYC/TjRuQJgfdZieBROBlXrS+BxRbsy9T4/QeKxChC3yiNxTmdxl5mvjLKvQTXHR8X0AWc07/Q==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.0.tgz",
+ "integrity": "sha512-H7R3c2E479CPpaX6bU84F8u4JV+IFEfM8BUOgrbcI9tF16m6C2eJbl8IqNuW0yADuTarRSlOT7TW0qyrmcxhRw==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -576,23 +576,23 @@
"node": "^18.13.0 || >=20.9.0"
},
"peerDependencies": {
- "@angular/core": "17.2.3"
+ "@angular/core": "17.3.0"
}
},
"node_modules/@angular/cli": {
- "version": "17.2.2",
- "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.2.2.tgz",
- "integrity": "sha512-cGGOnOTjU1bHBAU+5LMR1vfjUSmIY204pUcRAHu6xq1Qp8jm0Wf1lYOG1KrzpDezKa8d0WZe6FIVlxsCZRRYSw==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.0.tgz",
+ "integrity": "sha512-xwxlimNP4MECkdzjc0+m7lGxighcH0ncAfEo9yUo+r+4EFalB/Q7DAQPIU1xkbBk8iJwcFhGFAnS1IeLur15kQ==",
"dev": true,
"dependencies": {
- "@angular-devkit/architect": "0.1702.2",
- "@angular-devkit/core": "17.2.2",
- "@angular-devkit/schematics": "17.2.2",
- "@schematics/angular": "17.2.2",
+ "@angular-devkit/architect": "0.1703.0",
+ "@angular-devkit/core": "17.3.0",
+ "@angular-devkit/schematics": "17.3.0",
+ "@schematics/angular": "17.3.0",
"@yarnpkg/lockfile": "1.1.0",
"ansi-colors": "4.1.3",
- "ini": "4.1.1",
- "inquirer": "9.2.14",
+ "ini": "4.1.2",
+ "inquirer": "9.2.15",
"jsonc-parser": "3.2.1",
"npm-package-arg": "11.0.1",
"npm-pick-manifest": "9.0.0",
@@ -614,9 +614,9 @@
}
},
"node_modules/@angular/common": {
- "version": "17.2.3",
- "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.2.3.tgz",
- "integrity": "sha512-XR3rWS4W7/+RknyJMUUo9E81mSeyUznpclqTZ+Hy7+i4Naeso0qcRaIyr6JJmB5UGvlnfT1MlH9Fj78Dc80NEw==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.0.tgz",
+ "integrity": "sha512-JnS6jbLl2RxsvGFUOBGeoyviNLEjZKRhn3uK4Ein3DENPv0BeSFMjif9Dp4ReUCnqoD4QQVG0X/r1GFaqHn2pw==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -624,14 +624,14 @@
"node": "^18.13.0 || >=20.9.0"
},
"peerDependencies": {
- "@angular/core": "17.2.3",
+ "@angular/core": "17.3.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
- "version": "17.2.3",
- "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.2.3.tgz",
- "integrity": "sha512-U2okLZ+4ipD5zTv32pMp+RsrM3kkP0XneSsIMPRpYZZfKgfnGLIwkRx6FoVoBwByugng6lBG/PiIe8DhRU/HFg==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.0.tgz",
+ "integrity": "sha512-lZBD5mFq7SzFJydZwW2jvnQGmtcU1s3e548hl4MSZpRgt13m5UmBQKbyMOvVN2WxKvWKlmDlywsAJlMSXepYig==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -639,7 +639,7 @@
"node": "^18.13.0 || >=20.9.0"
},
"peerDependencies": {
- "@angular/core": "17.2.3"
+ "@angular/core": "17.3.0"
},
"peerDependenciesMeta": {
"@angular/core": {
@@ -648,9 +648,9 @@
}
},
"node_modules/@angular/compiler-cli": {
- "version": "17.2.3",
- "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.2.3.tgz",
- "integrity": "sha512-mATybangypneXwO270VQeIw3N0avzc2Lpvdb8nm9WZYj23AcTUzpUUKOn63HtJdwMT5J2GjkyZFSRXisiPmpkA==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.0.tgz",
+ "integrity": "sha512-ewo+pb0QUC69Ey15z4vPteoBeO81HitqplysOoeXbyVBjMnKmZl3343wx7ukgcI97lmj4d38d1r4AnIoO5n/Vw==",
"dev": true,
"dependencies": {
"@babel/core": "7.23.9",
@@ -671,14 +671,59 @@
"node": "^18.13.0 || >=20.9.0"
},
"peerDependencies": {
- "@angular/compiler": "17.2.3",
- "typescript": ">=5.2 <5.4"
+ "@angular/compiler": "17.3.0",
+ "typescript": ">=5.2 <5.5"
+ }
+ },
+ "node_modules/@angular/compiler-cli/node_modules/@babel/core": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz",
+ "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-compilation-targets": "^7.23.6",
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@babel/helpers": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@babel/template": "^7.23.9",
+ "@babel/traverse": "^7.23.9",
+ "@babel/types": "^7.23.9",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
}
},
"node_modules/@angular/core": {
- "version": "17.2.3",
- "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.2.3.tgz",
- "integrity": "sha512-DU+RdUB4E4I489R2P2hOrgkCDJNXlVaTzYixpgeDnuldCIYM0MatEzjor9DYNL3EDCayHF+M4HlVOcn6T/IVPQ==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.0.tgz",
+ "integrity": "sha512-umwsNFl/wEMTCUVvNl5iieEgHA+ESxSMcjedZGFWNGnpUxKTgYFYNG41/1wNZfPrS0+uRPHuYU9IHD+NR2s/Rw==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -691,9 +736,9 @@
}
},
"node_modules/@angular/forms": {
- "version": "17.2.3",
- "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.2.3.tgz",
- "integrity": "sha512-v+/6pimht808F5XpmVTNV4/109s+A7m3nadQP97qvIDsrtwrPPZR7cST+DRioG2C41VwtjXM0HVbIon/3ydo6A==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.0.tgz",
+ "integrity": "sha512-TnLOake1fQCmmGEOZbTjP2gbKerZ/bfEMuiFfoe7R2rUvKl4xHGAHp99bqf7bUyAbB8ZgmPZc9/VHrrts8UNyA==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -701,25 +746,25 @@
"node": "^18.13.0 || >=20.9.0"
},
"peerDependencies": {
- "@angular/common": "17.2.3",
- "@angular/core": "17.2.3",
- "@angular/platform-browser": "17.2.3",
+ "@angular/common": "17.3.0",
+ "@angular/core": "17.3.0",
+ "@angular/platform-browser": "17.3.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/language-service": {
- "version": "17.2.3",
- "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.2.3.tgz",
- "integrity": "sha512-H4LUs2Ftdlk1iqHqC7jRcbHmnNRy53OUlBYNkjRkTsthOI4WqsiSqAp5Frrni3erBqpZ2ik86cbMEyEXcfjRhw==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.3.0.tgz",
+ "integrity": "sha512-h4bwuyeAmZkoeCM/KvhWW+p2xjKiVt4GfSWZsIuW5ilfJt7hmkUFGyu0ABCjt6fiNQRrS2tvBZdXxk+A+zX8KQ==",
"dev": true,
"engines": {
"node": "^18.13.0 || >=20.9.0"
}
},
"node_modules/@angular/platform-browser": {
- "version": "17.2.3",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.2.3.tgz",
- "integrity": "sha512-bFi+H8avyCjwSBy+zpOKmqx852MRH8fkuZa4XgwKCPJRay8BfSCjHdtIo3eokUNPMu9JsyXM7HYKIfzLu5y6LA==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.0.tgz",
+ "integrity": "sha512-sIquvbq04KMOdpk1VdVFt7kVhOk/Rk+hI3M4raarMK5EbZ16nLYzpqjc2OZetUpKy6LB/FemClgNUShj9NlrqA==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -727,9 +772,9 @@
"node": "^18.13.0 || >=20.9.0"
},
"peerDependencies": {
- "@angular/animations": "17.2.3",
- "@angular/common": "17.2.3",
- "@angular/core": "17.2.3"
+ "@angular/animations": "17.3.0",
+ "@angular/common": "17.3.0",
+ "@angular/core": "17.3.0"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -738,9 +783,9 @@
}
},
"node_modules/@angular/platform-browser-dynamic": {
- "version": "17.2.3",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.2.3.tgz",
- "integrity": "sha512-K8CsHbmG2nvV1jrNN9PYxyA0zJNoIWp+qf2udvPhG8rJ+Pyw61qmptrarpQUUkr8ONOtjwtOsnKa9/w+15nExw==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.0.tgz",
+ "integrity": "sha512-oX5AG0aSjmB89SyJZGyabr6uwfWd7yJM+krcrzHxFbVhvDCwdi9G+B0ADmaUn1shaXDseOFiLpo3R/oagd2fTA==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -748,16 +793,16 @@
"node": "^18.13.0 || >=20.9.0"
},
"peerDependencies": {
- "@angular/common": "17.2.3",
- "@angular/compiler": "17.2.3",
- "@angular/core": "17.2.3",
- "@angular/platform-browser": "17.2.3"
+ "@angular/common": "17.3.0",
+ "@angular/compiler": "17.3.0",
+ "@angular/core": "17.3.0",
+ "@angular/platform-browser": "17.3.0"
}
},
"node_modules/@angular/router": {
- "version": "17.2.3",
- "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.2.3.tgz",
- "integrity": "sha512-8UPjMzI98xZ6cDNm0MzHd9hFq6aOQJGmgxKDUPIG2h74glRwwbiewpo5hPo2EGIF8BLvQmmAm9ytr5zesHu0cg==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.0.tgz",
+ "integrity": "sha512-OBMAfjaSfEdEYqfYsAemDvknYZV69ABFf06hhduNLhB5QgbPrZCbNptnlrCPx4YDrzcANj2hrcyAmAVNTk8Giw==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -765,9 +810,9 @@
"node": "^18.13.0 || >=20.9.0"
},
"peerDependencies": {
- "@angular/common": "17.2.3",
- "@angular/core": "17.2.3",
- "@angular/platform-browser": "17.2.3",
+ "@angular/common": "17.3.0",
+ "@angular/core": "17.3.0",
+ "@angular/platform-browser": "17.3.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
@@ -793,9 +838,9 @@
}
},
"node_modules/@babel/core": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz",
- "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz",
+ "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==",
"dev": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
@@ -803,11 +848,11 @@
"@babel/generator": "^7.23.6",
"@babel/helper-compilation-targets": "^7.23.6",
"@babel/helper-module-transforms": "^7.23.3",
- "@babel/helpers": "^7.23.9",
- "@babel/parser": "^7.23.9",
- "@babel/template": "^7.23.9",
- "@babel/traverse": "^7.23.9",
- "@babel/types": "^7.23.9",
+ "@babel/helpers": "^7.24.0",
+ "@babel/parser": "^7.24.0",
+ "@babel/template": "^7.24.0",
+ "@babel/traverse": "^7.24.0",
+ "@babel/types": "^7.24.0",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -960,9 +1005,9 @@
}
},
"node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz",
- "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==",
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz",
+ "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==",
"dev": true,
"dependencies": {
"@babel/helper-compilation-targets": "^7.22.6",
@@ -2151,13 +2196,13 @@
}
},
"node_modules/@babel/plugin-transform-runtime": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz",
- "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz",
+ "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==",
"dev": true,
"dependencies": {
"@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.24.0",
"babel-plugin-polyfill-corejs2": "^0.4.8",
"babel-plugin-polyfill-corejs3": "^0.9.0",
"babel-plugin-polyfill-regenerator": "^0.5.5",
@@ -2319,14 +2364,14 @@
}
},
"node_modules/@babel/preset-env": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz",
- "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz",
+ "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.23.5",
"@babel/helper-compilation-targets": "^7.23.6",
- "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.24.0",
"@babel/helper-validator-option": "^7.23.5",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3",
@@ -2379,7 +2424,7 @@
"@babel/plugin-transform-new-target": "^7.23.3",
"@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4",
"@babel/plugin-transform-numeric-separator": "^7.23.4",
- "@babel/plugin-transform-object-rest-spread": "^7.23.4",
+ "@babel/plugin-transform-object-rest-spread": "^7.24.0",
"@babel/plugin-transform-object-super": "^7.23.3",
"@babel/plugin-transform-optional-catch-binding": "^7.23.4",
"@babel/plugin-transform-optional-chaining": "^7.23.4",
@@ -2442,9 +2487,9 @@
"dev": true
},
"node_modules/@babel/runtime": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz",
- "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz",
+ "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==",
"dev": true,
"dependencies": {
"regenerator-runtime": "^0.14.0"
@@ -2535,9 +2580,9 @@
}
},
"node_modules/@commitlint/config-conventional": {
- "version": "18.6.2",
- "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-18.6.2.tgz",
- "integrity": "sha512-PcgSYg1AKGQIwDQKbaHtJsfqYy4uJTC7crLVZ83lfjcPaec4Pry2vLeaWej7ao2KsT20l9dWoMPpEGg8LWdUuA==",
+ "version": "18.6.3",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-18.6.3.tgz",
+ "integrity": "sha512-8ZrRHqF6je+TRaFoJVwszwnOXb/VeYrPmTwPhf0WxpzpGTcYy1p0SPyZ2eRn/sRi/obnWAcobtDAq6+gJQQNhQ==",
"dependencies": {
"@commitlint/types": "^18.6.1",
"conventional-changelog-conventionalcommits": "^7.0.2"
@@ -2953,9 +2998,9 @@
}
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.0.tgz",
- "integrity": "sha512-fGFDEctNh0CcSwsiRPxiaqX0P5rq+AqE0SRhYGZ4PX46Lg1FNR6oCxJghf8YgY0WQEgQuh3lErUFE4KxLeRmmw==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz",
+ "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==",
"cpu": [
"ppc64"
],
@@ -2969,9 +3014,9 @@
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.0.tgz",
- "integrity": "sha512-3bMAfInvByLHfJwYPJRlpTeaQA75n8C/QKpEaiS4HrFWFiJlNI0vzq/zCjBrhAYcPyVPG7Eo9dMrcQXuqmNk5g==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz",
+ "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==",
"cpu": [
"arm"
],
@@ -2985,9 +3030,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.0.tgz",
- "integrity": "sha512-aVpnM4lURNkp0D3qPoAzSG92VXStYmoVPOgXveAUoQBWRSuQzt51yvSju29J6AHPmwY1BjH49uR29oyfH1ra8Q==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz",
+ "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==",
"cpu": [
"arm64"
],
@@ -3001,9 +3046,9 @@
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.0.tgz",
- "integrity": "sha512-uK7wAnlRvjkCPzh8jJ+QejFyrP8ObKuR5cBIsQZ+qbMunwR8sbd8krmMbxTLSrDhiPZaJYKQAU5Y3iMDcZPhyQ==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz",
+ "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==",
"cpu": [
"x64"
],
@@ -3017,9 +3062,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.0.tgz",
- "integrity": "sha512-AjEcivGAlPs3UAcJedMa9qYg9eSfU6FnGHJjT8s346HSKkrcWlYezGE8VaO2xKfvvlZkgAhyvl06OJOxiMgOYQ==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz",
+ "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==",
"cpu": [
"arm64"
],
@@ -3033,9 +3078,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.0.tgz",
- "integrity": "sha512-bsgTPoyYDnPv8ER0HqnJggXK6RyFy4PH4rtsId0V7Efa90u2+EifxytE9pZnsDgExgkARy24WUQGv9irVbTvIw==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz",
+ "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==",
"cpu": [
"x64"
],
@@ -3049,9 +3094,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.0.tgz",
- "integrity": "sha512-kQ7jYdlKS335mpGbMW5tEe3IrQFIok9r84EM3PXB8qBFJPSc6dpWfrtsC/y1pyrz82xfUIn5ZrnSHQQsd6jebQ==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz",
+ "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==",
"cpu": [
"arm64"
],
@@ -3065,9 +3110,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.0.tgz",
- "integrity": "sha512-uG8B0WSepMRsBNVXAQcHf9+Ko/Tr+XqmK7Ptel9HVmnykupXdS4J7ovSQUIi0tQGIndhbqWLaIL/qO/cWhXKyQ==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz",
+ "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==",
"cpu": [
"x64"
],
@@ -3081,9 +3126,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.0.tgz",
- "integrity": "sha512-2ezuhdiZw8vuHf1HKSf4TIk80naTbP9At7sOqZmdVwvvMyuoDiZB49YZKLsLOfKIr77+I40dWpHVeY5JHpIEIg==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz",
+ "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==",
"cpu": [
"arm"
],
@@ -3097,9 +3142,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.0.tgz",
- "integrity": "sha512-uTtyYAP5veqi2z9b6Gr0NUoNv9F/rOzI8tOD5jKcCvRUn7T60Bb+42NDBCWNhMjkQzI0qqwXkQGo1SY41G52nw==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz",
+ "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==",
"cpu": [
"arm64"
],
@@ -3113,9 +3158,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.0.tgz",
- "integrity": "sha512-c88wwtfs8tTffPaoJ+SQn3y+lKtgTzyjkD8NgsyCtCmtoIC8RDL7PrJU05an/e9VuAke6eJqGkoMhJK1RY6z4w==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz",
+ "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==",
"cpu": [
"ia32"
],
@@ -3129,9 +3174,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.0.tgz",
- "integrity": "sha512-lR2rr/128/6svngnVta6JN4gxSXle/yZEZL3o4XZ6esOqhyR4wsKyfu6qXAL04S4S5CgGfG+GYZnjFd4YiG3Aw==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz",
+ "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==",
"cpu": [
"loong64"
],
@@ -3145,9 +3190,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.0.tgz",
- "integrity": "sha512-9Sycc+1uUsDnJCelDf6ZNqgZQoK1mJvFtqf2MUz4ujTxGhvCWw+4chYfDLPepMEvVL9PDwn6HrXad5yOrNzIsQ==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz",
+ "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==",
"cpu": [
"mips64el"
],
@@ -3161,9 +3206,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.0.tgz",
- "integrity": "sha512-CoWSaaAXOZd+CjbUTdXIJE/t7Oz+4g90A3VBCHLbfuc5yUQU/nFDLOzQsN0cdxgXd97lYW/psIIBdjzQIwTBGw==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz",
+ "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==",
"cpu": [
"ppc64"
],
@@ -3177,9 +3222,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.0.tgz",
- "integrity": "sha512-mlb1hg/eYRJUpv8h/x+4ShgoNLL8wgZ64SUr26KwglTYnwAWjkhR2GpoKftDbPOCnodA9t4Y/b68H4J9XmmPzA==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz",
+ "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==",
"cpu": [
"riscv64"
],
@@ -3193,9 +3238,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.0.tgz",
- "integrity": "sha512-fgf9ubb53xSnOBqyvWEY6ukBNRl1mVX1srPNu06B6mNsNK20JfH6xV6jECzrQ69/VMiTLvHMicQR/PgTOgqJUQ==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz",
+ "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==",
"cpu": [
"s390x"
],
@@ -3209,9 +3254,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.0.tgz",
- "integrity": "sha512-H9Eu6MGse++204XZcYsse1yFHmRXEWgadk2N58O/xd50P9EvFMLJTQLg+lB4E1cF2xhLZU5luSWtGTb0l9UeSg==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz",
+ "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==",
"cpu": [
"x64"
],
@@ -3225,9 +3270,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.0.tgz",
- "integrity": "sha512-lCT675rTN1v8Fo+RGrE5KjSnfY0x9Og4RN7t7lVrN3vMSjy34/+3na0q7RIfWDAj0e0rCh0OL+P88lu3Rt21MQ==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz",
+ "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==",
"cpu": [
"x64"
],
@@ -3241,9 +3286,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.0.tgz",
- "integrity": "sha512-HKoUGXz/TOVXKQ+67NhxyHv+aDSZf44QpWLa3I1lLvAwGq8x1k0T+e2HHSRvxWhfJrFxaaqre1+YyzQ99KixoA==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz",
+ "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==",
"cpu": [
"x64"
],
@@ -3257,9 +3302,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.0.tgz",
- "integrity": "sha512-GDwAqgHQm1mVoPppGsoq4WJwT3vhnz/2N62CzhvApFD1eJyTroob30FPpOZabN+FgCjhG+AgcZyOPIkR8dfD7g==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz",
+ "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==",
"cpu": [
"x64"
],
@@ -3273,9 +3318,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.0.tgz",
- "integrity": "sha512-0vYsP8aC4TvMlOQYozoksiaxjlvUcQrac+muDqj1Fxy6jh9l9CZJzj7zmh8JGfiV49cYLTorFLxg7593pGldwQ==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz",
+ "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==",
"cpu": [
"arm64"
],
@@ -3289,9 +3334,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.0.tgz",
- "integrity": "sha512-p98u4rIgfh4gdpV00IqknBD5pC84LCub+4a3MO+zjqvU5MVXOc3hqR2UgT2jI2nh3h8s9EQxmOsVI3tyzv1iFg==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz",
+ "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==",
"cpu": [
"ia32"
],
@@ -3305,9 +3350,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.0.tgz",
- "integrity": "sha512-NgJnesu1RtWihtTtXGFMU5YSE6JyyHPMxCwBZK7a6/8d31GuSo9l0Ss7w1Jw5QnKUawG6UEehs883kcXf5fYwg==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz",
+ "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==",
"cpu": [
"x64"
],
@@ -3465,15 +3510,6 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
- "node_modules/@fastify/busboy": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
- "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
- "dev": true,
- "engines": {
- "node": ">=14"
- }
- },
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
@@ -3755,13 +3791,13 @@
}
},
"node_modules/@jridgewell/source-map": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
- "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
"dev": true,
"dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
@@ -3787,21 +3823,21 @@
"dev": true
},
"node_modules/@ljharb/through": {
- "version": "2.3.12",
- "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.12.tgz",
- "integrity": "sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==",
+ "version": "2.3.13",
+ "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz",
+ "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.5"
+ "call-bind": "^1.0.7"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/@ngtools/webpack": {
- "version": "17.2.2",
- "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.2.2.tgz",
- "integrity": "sha512-HgvClGO6WVq4VA5d0ZvlDG5hrj8lQzRH99Gt87URm7G8E5XkatysdOsMqUQsJz+OwFWhP4PvTRWVblpBDiDl/A==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.0.tgz",
+ "integrity": "sha512-wNTCDPPEtjP4mxYerLVLCMwOCTEOD2HqZMVXD8pJbarrGPMuoyglUZuqNSIS5KVqR+fFez6JEUnMvC3QSqf58w==",
"dev": true,
"engines": {
"node": "^18.13.0 || >=20.9.0",
@@ -3810,7 +3846,7 @@
},
"peerDependencies": {
"@angular/compiler-cli": "^17.0.0",
- "typescript": ">=5.2 <5.4",
+ "typescript": ">=5.2 <5.5",
"webpack": "^5.54.0"
}
},
@@ -4402,9 +4438,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz",
- "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz",
+ "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==",
"cpu": [
"arm"
],
@@ -4415,9 +4451,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz",
- "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz",
+ "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==",
"cpu": [
"arm64"
],
@@ -4428,9 +4464,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz",
- "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz",
+ "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==",
"cpu": [
"arm64"
],
@@ -4441,9 +4477,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz",
- "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz",
+ "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==",
"cpu": [
"x64"
],
@@ -4454,9 +4490,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz",
- "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz",
+ "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==",
"cpu": [
"arm"
],
@@ -4467,9 +4503,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz",
- "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz",
+ "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==",
"cpu": [
"arm64"
],
@@ -4480,9 +4516,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz",
- "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz",
+ "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==",
"cpu": [
"arm64"
],
@@ -4493,9 +4529,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz",
- "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz",
+ "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==",
"cpu": [
"riscv64"
],
@@ -4506,9 +4542,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz",
- "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz",
+ "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==",
"cpu": [
"x64"
],
@@ -4519,9 +4555,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz",
- "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz",
+ "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==",
"cpu": [
"x64"
],
@@ -4532,9 +4568,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz",
- "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz",
+ "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==",
"cpu": [
"arm64"
],
@@ -4545,9 +4581,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz",
- "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz",
+ "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==",
"cpu": [
"ia32"
],
@@ -4558,9 +4594,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz",
- "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz",
+ "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==",
"cpu": [
"x64"
],
@@ -4571,9 +4607,9 @@
]
},
"node_modules/@rollup/wasm-node": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.12.0.tgz",
- "integrity": "sha512-sqy3+YvV/uWX6bPZOR5PlEdH6xyMPXoelllRQ/uZ13tzy9f4pXZTbajnoWN8IHHXwTNKPiLzsePLiDEVmkxMNw==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.13.0.tgz",
+ "integrity": "sha512-oFX11wzU7RTaiW06WBtRpzIVN/oaG0I3XkevNO0brBklYnY9zpLhTfksN4b+TdBt6CfXV/KdVhdWLbb0fQIR7A==",
"dev": true,
"dependencies": {
"@types/estree": "1.0.5"
@@ -4590,13 +4626,13 @@
}
},
"node_modules/@schematics/angular": {
- "version": "17.2.2",
- "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.2.2.tgz",
- "integrity": "sha512-Q3VAQ/S4gj8D1JPWgWG4enDdDZUu8mUXWVRG1rOi4sHgOF5zgPieQFp3LXqMUgOncmzbXrctkbO6NKc4N2FAag==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.0.tgz",
+ "integrity": "sha512-QqugP4Uyxk966VaUb/Jk5LQ5rE1BV4v2TmniPZtN3GZ6MDkpvPnFvlysvoq6y+7uiRhCLiT1DsBIwc9vXz3vWA==",
"dev": true,
"dependencies": {
- "@angular-devkit/core": "17.2.2",
- "@angular-devkit/schematics": "17.2.2",
+ "@angular-devkit/core": "17.3.0",
+ "@angular-devkit/schematics": "17.3.0",
"jsonc-parser": "3.2.1"
},
"engines": {
@@ -4977,9 +5013,9 @@
"integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag=="
},
"node_modules/@types/node": {
- "version": "20.11.24",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz",
- "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==",
+ "version": "20.11.27",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.27.tgz",
+ "integrity": "sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg==",
"dependencies": {
"undici-types": "~5.26.4"
}
@@ -5470,9 +5506,9 @@
}
},
"node_modules/@webassemblyjs/ast": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
- "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz",
+ "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==",
"dev": true,
"dependencies": {
"@webassemblyjs/helper-numbers": "1.11.6",
@@ -5492,9 +5528,9 @@
"dev": true
},
"node_modules/@webassemblyjs/helper-buffer": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
- "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==",
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz",
+ "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==",
"dev": true
},
"node_modules/@webassemblyjs/helper-numbers": {
@@ -5515,15 +5551,15 @@
"dev": true
},
"node_modules/@webassemblyjs/helper-wasm-section": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
- "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz",
+ "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==",
"dev": true,
"dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/helper-buffer": "1.12.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.11.6"
+ "@webassemblyjs/wasm-gen": "1.12.1"
}
},
"node_modules/@webassemblyjs/ieee754": {
@@ -5551,28 +5587,28 @@
"dev": true
},
"node_modules/@webassemblyjs/wasm-edit": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
- "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz",
+ "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==",
"dev": true,
"dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/helper-buffer": "1.12.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/helper-wasm-section": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.11.6",
- "@webassemblyjs/wasm-opt": "1.11.6",
- "@webassemblyjs/wasm-parser": "1.11.6",
- "@webassemblyjs/wast-printer": "1.11.6"
+ "@webassemblyjs/helper-wasm-section": "1.12.1",
+ "@webassemblyjs/wasm-gen": "1.12.1",
+ "@webassemblyjs/wasm-opt": "1.12.1",
+ "@webassemblyjs/wasm-parser": "1.12.1",
+ "@webassemblyjs/wast-printer": "1.12.1"
}
},
"node_modules/@webassemblyjs/wasm-gen": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
- "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz",
+ "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==",
"dev": true,
"dependencies": {
- "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/ast": "1.12.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
"@webassemblyjs/ieee754": "1.11.6",
"@webassemblyjs/leb128": "1.11.6",
@@ -5580,24 +5616,24 @@
}
},
"node_modules/@webassemblyjs/wasm-opt": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
- "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz",
+ "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==",
"dev": true,
"dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-buffer": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.11.6",
- "@webassemblyjs/wasm-parser": "1.11.6"
+ "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/helper-buffer": "1.12.1",
+ "@webassemblyjs/wasm-gen": "1.12.1",
+ "@webassemblyjs/wasm-parser": "1.12.1"
}
},
"node_modules/@webassemblyjs/wasm-parser": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
- "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz",
+ "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==",
"dev": true,
"dependencies": {
- "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/ast": "1.12.1",
"@webassemblyjs/helper-api-error": "1.11.6",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
"@webassemblyjs/ieee754": "1.11.6",
@@ -5606,12 +5642,12 @@
}
},
"node_modules/@webassemblyjs/wast-printer": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
- "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz",
+ "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==",
"dev": true,
"dependencies": {
- "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/ast": "1.12.1",
"@xtuc/long": "4.2.2"
}
},
@@ -6096,9 +6132,9 @@
"dev": true
},
"node_modules/autoprefixer": {
- "version": "10.4.17",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz",
- "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==",
+ "version": "10.4.18",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz",
+ "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==",
"dev": true,
"funding": [
{
@@ -6115,8 +6151,8 @@
}
],
"dependencies": {
- "browserslist": "^4.22.2",
- "caniuse-lite": "^1.0.30001578",
+ "browserslist": "^4.23.0",
+ "caniuse-lite": "^1.0.30001591",
"fraction.js": "^4.3.7",
"normalize-range": "^0.1.2",
"picocolors": "^1.0.0",
@@ -6201,13 +6237,13 @@
}
},
"node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.4.8",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz",
- "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==",
+ "version": "0.4.10",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz",
+ "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.22.6",
- "@babel/helper-define-polyfill-provider": "^0.5.0",
+ "@babel/helper-define-polyfill-provider": "^0.6.1",
"semver": "^6.3.1"
},
"peerDependencies": {
@@ -6236,6 +6272,22 @@
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
+ "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz",
+ "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
"node_modules/babel-plugin-polyfill-regenerator": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz",
@@ -6248,6 +6300,22 @@
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
+ "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz",
+ "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -6590,9 +6658,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001594",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz",
- "integrity": "sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==",
+ "version": "1.0.30001597",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz",
+ "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==",
"dev": true,
"funding": [
{
@@ -8176,9 +8244,9 @@
}
},
"node_modules/critters": {
- "version": "0.0.20",
- "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz",
- "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==",
+ "version": "0.0.22",
+ "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz",
+ "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==",
"dev": true,
"dependencies": {
"chalk": "^4.1.0",
@@ -8187,7 +8255,7 @@
"domhandler": "^5.0.2",
"htmlparser2": "^8.0.2",
"postcss": "^8.4.23",
- "pretty-bytes": "^5.3.0"
+ "postcss-media-query-parser": "^0.2.3"
}
},
"node_modules/critters/node_modules/ansi-styles": {
@@ -8854,9 +8922,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.4.692",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.692.tgz",
- "integrity": "sha512-d5rZRka9n2Y3MkWRN74IoAsxR0HK3yaAt7T50e3iT9VZmCCQDT3geXUO5ZRMhDToa1pkCeQXuNo+0g+NfDOVPA==",
+ "version": "1.4.705",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.705.tgz",
+ "integrity": "sha512-LKqhpwJCLhYId2VVwEzFXWrqQI5n5zBppz1W9ehhTlfYU8CUUW6kClbN8LHF/v7flMgRdETS772nqywJ+ckVAw==",
"dev": true
},
"node_modules/emoji-regex": {
@@ -8945,9 +9013,9 @@
}
},
"node_modules/enhanced-resolve": {
- "version": "5.15.1",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz",
- "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==",
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz",
+ "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -9152,9 +9220,9 @@
}
},
"node_modules/esbuild": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.0.tgz",
- "integrity": "sha512-6iwE3Y2RVYCME1jLpBqq7LQWK3MW6vjV2bZy6gt/WrqkY+WE74Spyc0ThAOYpMtITvnjX09CrC6ym7A/m9mebA==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz",
+ "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==",
"dev": true,
"hasInstallScript": true,
"optional": true,
@@ -9165,35 +9233,35 @@
"node": ">=12"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.20.0",
- "@esbuild/android-arm": "0.20.0",
- "@esbuild/android-arm64": "0.20.0",
- "@esbuild/android-x64": "0.20.0",
- "@esbuild/darwin-arm64": "0.20.0",
- "@esbuild/darwin-x64": "0.20.0",
- "@esbuild/freebsd-arm64": "0.20.0",
- "@esbuild/freebsd-x64": "0.20.0",
- "@esbuild/linux-arm": "0.20.0",
- "@esbuild/linux-arm64": "0.20.0",
- "@esbuild/linux-ia32": "0.20.0",
- "@esbuild/linux-loong64": "0.20.0",
- "@esbuild/linux-mips64el": "0.20.0",
- "@esbuild/linux-ppc64": "0.20.0",
- "@esbuild/linux-riscv64": "0.20.0",
- "@esbuild/linux-s390x": "0.20.0",
- "@esbuild/linux-x64": "0.20.0",
- "@esbuild/netbsd-x64": "0.20.0",
- "@esbuild/openbsd-x64": "0.20.0",
- "@esbuild/sunos-x64": "0.20.0",
- "@esbuild/win32-arm64": "0.20.0",
- "@esbuild/win32-ia32": "0.20.0",
- "@esbuild/win32-x64": "0.20.0"
+ "@esbuild/aix-ppc64": "0.20.1",
+ "@esbuild/android-arm": "0.20.1",
+ "@esbuild/android-arm64": "0.20.1",
+ "@esbuild/android-x64": "0.20.1",
+ "@esbuild/darwin-arm64": "0.20.1",
+ "@esbuild/darwin-x64": "0.20.1",
+ "@esbuild/freebsd-arm64": "0.20.1",
+ "@esbuild/freebsd-x64": "0.20.1",
+ "@esbuild/linux-arm": "0.20.1",
+ "@esbuild/linux-arm64": "0.20.1",
+ "@esbuild/linux-ia32": "0.20.1",
+ "@esbuild/linux-loong64": "0.20.1",
+ "@esbuild/linux-mips64el": "0.20.1",
+ "@esbuild/linux-ppc64": "0.20.1",
+ "@esbuild/linux-riscv64": "0.20.1",
+ "@esbuild/linux-s390x": "0.20.1",
+ "@esbuild/linux-x64": "0.20.1",
+ "@esbuild/netbsd-x64": "0.20.1",
+ "@esbuild/openbsd-x64": "0.20.1",
+ "@esbuild/sunos-x64": "0.20.1",
+ "@esbuild/win32-arm64": "0.20.1",
+ "@esbuild/win32-ia32": "0.20.1",
+ "@esbuild/win32-x64": "0.20.1"
}
},
"node_modules/esbuild-wasm": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.0.tgz",
- "integrity": "sha512-Lc9KeQCg1Zf8kCtfDXgy29rx0x8dOuhDWbkP76Wc64q7ctOOc1Zv1C39AxiE+y4N6ONyXtJk4HKpM7jlU7/jSA==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.1.tgz",
+ "integrity": "sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==",
"dev": true,
"bin": {
"esbuild": "bin/esbuild"
@@ -11332,9 +11400,9 @@
}
},
"node_modules/hasown": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz",
- "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dependencies": {
"function-bind": "^1.1.2"
},
@@ -11547,9 +11615,9 @@
}
},
"node_modules/https-proxy-agent": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
- "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
+ "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==",
"dev": true,
"dependencies": {
"agent-base": "^7.0.2",
@@ -11722,9 +11790,9 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/ini": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
- "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz",
+ "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==",
"dev": true,
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -11740,9 +11808,9 @@
}
},
"node_modules/inquirer": {
- "version": "9.2.14",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.14.tgz",
- "integrity": "sha512-4ByIMt677Iz5AvjyKrDpzaepIyMewNvDcvwpVVRZNmy9dLakVoVgdCHZXbK1SlVJra1db0JZ6XkJyHsanpdrdQ==",
+ "version": "9.2.15",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz",
+ "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==",
"dev": true,
"dependencies": {
"@ljharb/through": "^2.3.12",
@@ -13533,9 +13601,9 @@
}
},
"node_modules/magic-string": {
- "version": "0.30.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz",
- "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==",
+ "version": "0.30.8",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz",
+ "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==",
"dev": true,
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.4.15"
@@ -13728,9 +13796,9 @@
}
},
"node_modules/mini-css-extract-plugin": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.0.tgz",
- "integrity": "sha512-CxmUYPFcTgET1zImteG/LZOy/4T5rTojesQXkSNBiquhydn78tfbCE9sjIjnJ/UcjNjOC1bphTCCW5rrS7cXAg==",
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz",
+ "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==",
"dev": true,
"dependencies": {
"schema-utils": "^4.0.0",
@@ -14110,9 +14178,9 @@
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
},
"node_modules/ng-packagr": {
- "version": "17.2.1",
- "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-17.2.1.tgz",
- "integrity": "sha512-Y0qukNaNkDfDp2gyJQ76pG4tKmENDNXiUacSvxmXZF5sCPM4DWS+SL5cZTqNFur70eocRTrWqtOoARSIPA1WMg==",
+ "version": "17.3.0",
+ "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-17.3.0.tgz",
+ "integrity": "sha512-kMSqxeDgv88SWCoapWNRRN1UdBgwu9/Pw/j7u2WFGmzrIWUFivNWBBSSL94kMxr2La+Z9wMwiL8EwKNvmCpg2A==",
"dev": true,
"dependencies": {
"@rollup/plugin-json": "^6.0.1",
@@ -14152,7 +14220,7 @@
"@angular/compiler-cli": "^17.0.0 || ^17.2.0-next.0 || ^17.3.0-next.0",
"tailwindcss": "^2.0.0 || ^3.0.0",
"tslib": "^2.3.0",
- "typescript": ">=5.2 <5.4"
+ "typescript": ">=5.2 <5.5"
},
"peerDependenciesMeta": {
"tailwindcss": {
@@ -14250,15 +14318,6 @@
"node": ">=8"
}
},
- "node_modules/ng-packagr/node_modules/piscina": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.4.0.tgz",
- "integrity": "sha512-+AQduEJefrOApE4bV7KRmp3N2JnnyErlVqq4P/jmko4FPz9Z877BCccl/iB3FdrWSUkvbGV9Kan/KllJgat3Vg==",
- "dev": true,
- "optionalDependencies": {
- "nice-napi": "^1.0.2"
- }
- },
"node_modules/ng-packagr/node_modules/pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -15393,9 +15452,9 @@
}
},
"node_modules/piscina": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.3.1.tgz",
- "integrity": "sha512-MBj0QYm3hJQ/C/wIXTN1OCYC8uQ4BBJ4LVele2P4ZwVQAH04vkk8E1SpDbuemLAL1dZorbuOob9rYqJeWCcCRg==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.4.0.tgz",
+ "integrity": "sha512-+AQduEJefrOApE4bV7KRmp3N2JnnyErlVqq4P/jmko4FPz9Z877BCccl/iB3FdrWSUkvbGV9Kan/KllJgat3Vg==",
"dev": true,
"optionalDependencies": {
"nice-napi": "^1.0.2"
@@ -15536,9 +15595,9 @@
}
},
"node_modules/postcss-loader": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.0.tgz",
- "integrity": "sha512-AbperNcX3rlob7Ay7A/HQcrofug1caABBkopoFeOQMspZBqcqj6giYn1Bwey/0uiOPAcR+NQD0I2HC7rXzk91w==",
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz",
+ "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==",
"dev": true,
"dependencies": {
"cosmiconfig": "^9.0.0",
@@ -15610,6 +15669,12 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/postcss-media-query-parser": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+ "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
+ "dev": true
+ },
"node_modules/postcss-modules-extract-imports": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
@@ -15670,9 +15735,9 @@
}
},
"node_modules/postcss-selector-parser": {
- "version": "6.0.15",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
- "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
+ "version": "6.0.16",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
+ "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
"dev": true,
"dependencies": {
"cssesc": "^3.0.0",
@@ -15712,18 +15777,6 @@
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
- "node_modules/pretty-bytes": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
- "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/pretty-format": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
@@ -16405,9 +16458,9 @@
}
},
"node_modules/rollup": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz",
- "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==",
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz",
+ "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==",
"dev": true,
"dependencies": {
"@types/estree": "1.0.5"
@@ -16420,19 +16473,19 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.12.0",
- "@rollup/rollup-android-arm64": "4.12.0",
- "@rollup/rollup-darwin-arm64": "4.12.0",
- "@rollup/rollup-darwin-x64": "4.12.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.12.0",
- "@rollup/rollup-linux-arm64-gnu": "4.12.0",
- "@rollup/rollup-linux-arm64-musl": "4.12.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.12.0",
- "@rollup/rollup-linux-x64-gnu": "4.12.0",
- "@rollup/rollup-linux-x64-musl": "4.12.0",
- "@rollup/rollup-win32-arm64-msvc": "4.12.0",
- "@rollup/rollup-win32-ia32-msvc": "4.12.0",
- "@rollup/rollup-win32-x64-msvc": "4.12.0",
+ "@rollup/rollup-android-arm-eabi": "4.13.0",
+ "@rollup/rollup-android-arm64": "4.13.0",
+ "@rollup/rollup-darwin-arm64": "4.13.0",
+ "@rollup/rollup-darwin-x64": "4.13.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.13.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.13.0",
+ "@rollup/rollup-linux-arm64-musl": "4.13.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.13.0",
+ "@rollup/rollup-linux-x64-gnu": "4.13.0",
+ "@rollup/rollup-linux-x64-musl": "4.13.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.13.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.13.0",
+ "@rollup/rollup-win32-x64-msvc": "4.13.0",
"fsevents": "~2.3.2"
}
},
@@ -16477,13 +16530,13 @@
}
},
"node_modules/safe-array-concat": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz",
- "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+ "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.5",
- "get-intrinsic": "^1.2.2",
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4",
"has-symbols": "^1.0.3",
"isarray": "^2.0.5"
},
@@ -16537,9 +16590,9 @@
"dev": true
},
"node_modules/sass": {
- "version": "1.70.0",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz",
- "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==",
+ "version": "1.71.1",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz",
+ "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==",
"dev": true,
"dependencies": {
"chokidar": ">=3.0.0 <4.0.0",
@@ -16554,9 +16607,9 @@
}
},
"node_modules/sass-loader": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.1.0.tgz",
- "integrity": "sha512-LS2mLeFWA+orYxHNu+O18Xe4jR0kyamNOOUsE3NyBP4DvIL+8stHpNX0arYTItdPe80kluIiJ7Wfe/9iHSRO0Q==",
+ "version": "14.1.1",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.1.1.tgz",
+ "integrity": "sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==",
"dev": true,
"dependencies": {
"neo-async": "^2.6.2"
@@ -16828,17 +16881,17 @@
}
},
"node_modules/set-function-length": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz",
- "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
"dev": true,
"dependencies": {
- "define-data-property": "^1.1.2",
+ "define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.3",
+ "get-intrinsic": "^1.2.4",
"gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.1"
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -17686,9 +17739,9 @@
"dev": true
},
"node_modules/terser": {
- "version": "5.27.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz",
- "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==",
+ "version": "5.29.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz",
+ "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==",
"dev": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
@@ -17924,9 +17977,9 @@
}
},
"node_modules/ts-api-utils": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz",
- "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+ "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
"dev": true,
"engines": {
"node": ">=16"
@@ -18100,9 +18153,9 @@
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
},
"node_modules/typescript": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
- "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+ "version": "5.4.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz",
+ "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -18162,13 +18215,10 @@
}
},
"node_modules/undici": {
- "version": "6.6.2",
- "resolved": "https://registry.npmjs.org/undici/-/undici-6.6.2.tgz",
- "integrity": "sha512-vSqvUE5skSxQJ5sztTZ/CdeJb1Wq0Hf44hlYMciqHghvz+K88U0l7D6u1VsndoFgskDcnU+nG3gYmMzJVzd9Qg==",
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.7.1.tgz",
+ "integrity": "sha512-+Wtb9bAQw6HYWzCnxrPTMVEV3Q1QjYanI0E4q02ehReMuquQdLTEFEYbfs7hcImVYKcQkWSwT6buEmSVIiDDtQ==",
"dev": true,
- "dependencies": {
- "@fastify/busboy": "^2.0.0"
- },
"engines": {
"node": ">=18.0"
}
@@ -18361,13 +18411,13 @@
}
},
"node_modules/vite": {
- "version": "5.0.12",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz",
- "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==",
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz",
+ "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==",
"dev": true,
"dependencies": {
"esbuild": "^0.19.3",
- "postcss": "^8.4.32",
+ "postcss": "^8.4.35",
"rollup": "^4.2.0"
},
"bin": {
@@ -18862,9 +18912,9 @@
}
},
"node_modules/webpack": {
- "version": "5.90.1",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz",
- "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==",
+ "version": "5.90.3",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz",
+ "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==",
"dev": true,
"dependencies": {
"@types/eslint-scope": "^3.7.3",
@@ -19214,16 +19264,16 @@
}
},
"node_modules/which-typed-array": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz",
- "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==",
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+ "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
"dev": true,
"dependencies": {
- "available-typed-arrays": "^1.0.6",
- "call-bind": "^1.0.5",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
- "has-tostringtag": "^1.0.1"
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
diff --git a/package.json b/package.json
index 1a0d60b..f9fa003 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ngx-diff",
- "version": "7.0.0",
+ "version": "8.0.0-alpha.0",
"type": "module",
"scripts": {
"ng": "ng",
diff --git a/projects/ngx-diff/package.json b/projects/ngx-diff/package.json
index b4d57dc..a5c800a 100644
--- a/projects/ngx-diff/package.json
+++ b/projects/ngx-diff/package.json
@@ -1,6 +1,6 @@
{
"name": "ngx-diff",
- "version": "7.0.0",
+ "version": "8.0.0-alpha.0",
"peerDependencies": {
"@angular/common": ">=17.0.0",
"@angular/core": ">=17.0.0",
diff --git a/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.html b/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.html
index 693930d..07ed223 100644
--- a/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.html
+++ b/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.html
@@ -1,48 +1,7 @@
-
- @if (title) {
- {{ title }}
- }
- +++ {{ diffSummary.numLinesAdded }}
- --- {{ diffSummary.numLinesRemoved }}
-
-@if (isContentEqual) {
-
-
There are no changes to display.
-
-}
-@if (!isContentEqual) {
-
-
- @for (lineDiff of calculatedDiff; track lineDiff; let idx = $index) {
-
-
{{ lineDiff.lineNumberInOldText | lineNumber }}
-
{{ lineDiff.lineNumberInNewText | lineNumber }}
-
- }
-
-
-
-
- @for (lineDiff of calculatedDiff; track lineDiff) {
-
- }
-
-
-
-
-}
+
diff --git a/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.scss b/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.scss
index b53ca66..e69de29 100644
--- a/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.scss
+++ b/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.scss
@@ -1,144 +0,0 @@
-div.inline-diff-title-bar {
- background-color: var(--ngx-diff-margin-background-color);
- color: var(--ngx-diff-font-color);
- font-family: var(--ngx-diff-font-family);
- font-size: var(--ngx-diff-font-size);
- font-weight: var(--ngx-diff-title-font-weight);
- padding: var(--ngx-diff-title-bar-padding);
- border-top: var(--ngx-diff-border-width) solid var(--ngx-diff-border-color);
- border-left: var(--ngx-diff-border-width) solid var(--ngx-diff-border-color);
- border-right: var(--ngx-diff-border-width) solid var(--ngx-diff-border-color);
-}
-
-div.inline-diff-no-changes-text {
- font-family: var(--ngx-diff-font-family);
- font-size: var(--ngx-diff-font-size);
- font-weight: var(--ngx-diff-title-font-weight);
- padding: var(--ngx-diff-title-bar-padding);
- background-color: var(--ngx-diff-equal-background-color);
- color: var(--ngx-diff-font-color);
- flex-grow: 1;
-}
-
-.inline-diff-summary-lines-added {
- color: var(--ngx-diff-insert-color-darkest);
-}
-
-.inline-diff-summary-lines-removed {
- color: var(--ngx-diff-delete-color-darkest);
-}
-
-div.inline-diff {
- display: flex;
- flex-direction: row;
- border: var(--ngx-diff-border-width) solid var(--ngx-diff-border-color);
- font-family: var(--ngx-diff-font-family);
-}
-
-div.inline-diff-content {
- position: relative;
- top: 0px;
- left: 0px;
- flex-grow: 1;
- overflow-x: auto;
- overflow-y: hidden;
-}
-
-div.inline-diff-content-wrapper {
- position: absolute;
- top: 0px;
- left: 0px;
- display: flex;
- flex-direction: column;
- align-items: stretch;
- width: 100%;
-}
-
-div.inline-diff-old {
- width: var(--ngx-diff-line-number-width);
- text-align: center;
- font-size: var(--ngx-diff-font-size);
-}
-
-div.inline-diff-new {
- width: var(--ngx-diff-line-number-width);
- text-align: center;
- border-right: var(--ngx-diff-border-width) solid var(--border-color);
- font-size: var(--ngx-diff-font-size);
-}
-
-div.inline-diff-text {
- white-space: pre;
- padding-left: var(--ngx-diff-line-left-padding);
- font-size: var(--ngx-diff-font-size);
- color: var(--ngx-diff-font-color);
-}
-
-.inline-diff-equal {
- background-color: var(--ngx-diff-margin-background-color);
-
- &.line-content {
- background-color: var(--ngx-diff-equal-background-color);
- }
-}
-
-.inline-diff-delete {
- background-color: var(--ngx-diff-delete-color-darker);
-
- &.line-content {
- background-color: var(--ngx-diff-deleted-background-color);
- }
-}
-
-.inline-diff-insert {
- background-color: var(--ngx-diff-insert-color-darker);
-
- &.line-content {
- background-color: var(--ngx-diff-inserted-background-color);
- }
-}
-
-.inline-diff-delete > div {
- display: inline-block;
-}
-
-.inline-diff-insert > div {
- display: inline-block;
-}
-
-.inline-diff-equal > div {
- display: inline-block;
-}
-
-.dmp-margin-bottom-spacer {
- height: var(--ngx-diff-bottom-spacer-height);
- background-color: var(--ngx-diff-margin-background-color);
- border-right: var(--ngx-diff-border-width) solid var(--border-color);
-
- &.line-content {
- background-color: var(--ngx-diff-equal-background-color);
- }
-}
-
-.line-selector {
- color: var(--ngx-diff-line-number-font-color);
-
- &:hover {
- cursor: pointer;
- color: var(--ngx-diff-line-number-hover-font-color);
- }
-
- &.selected {
- border-top: var(--ngx-diff-selected-border-width) solid var(--ngx-diff-selected-border-color);
- border-left: var(--ngx-diff-selected-border-width) solid var(--ngx-diff-selected-border-color);
- border-bottom: var(--ngx-diff-selected-border-width) solid var(--ngx-diff-selected-border-color);
- background-color: var(--ngx-diff-selected-line-background-color);
- }
-}
-
-.line-content.selected {
- border-top: var(--ngx-diff-selected-border-width) solid var(--ngx-diff-selected-border-color);
- border-right: var(--ngx-diff-selected-border-width) solid var(--ngx-diff-selected-border-color);
- border-bottom: var(--ngx-diff-selected-border-width) solid var(--ngx-diff-selected-border-color);
- background-color: var(--ngx-diff-selected-line-background-color);
-}
diff --git a/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.spec.ts b/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.spec.ts
index 5c9b560..7ccf705 100644
--- a/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.spec.ts
+++ b/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.spec.ts
@@ -2,10 +2,10 @@ import { Diff, DiffOp } from 'diff-match-patch-ts';
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { LineDiffType } from '../../common/line-diff-type';
import { LineNumberPipe } from '../../pipes/line-number/line-number.pipe';
import { DiffMatchPatchService } from '../../services/diff-match-patch/diff-match-patch.service';
import { InlineDiffComponent } from './inline-diff.component';
+import { UnifiedDiffComponent } from '../unified-diff/unified-diff.component';
class DiffMatchPatchServiceMock {
// eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars, no-underscore-dangle, id-blacklist, id-match
@@ -25,7 +25,7 @@ describe('InlineDiffComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- imports: [InlineDiffComponent, LineNumberPipe],
+ imports: [InlineDiffComponent, UnifiedDiffComponent, LineNumberPipe],
providers: [{ provide: DiffMatchPatchService, useClass: DiffMatchPatchServiceMock }],
}).compileComponents();
@@ -37,44 +37,4 @@ describe('InlineDiffComponent', () => {
it('should create', () => {
expect(component).toBeTruthy();
});
-
- it('should have 8 line diffs', () => {
- expect(component.calculatedDiff.length).toBe(8);
- });
-
- it('should have correct line numbers', () => {
- const leftLineNumbers = component.calculatedDiff.map((x) => x.lineNumberInOldText);
- expect(leftLineNumbers).toEqual([1, 2, null, null, 3, 4, 5, 6]);
-
- const rightLineNumbers = component.calculatedDiff.map((x) => x.lineNumberInNewText);
- expect(rightLineNumbers).toEqual([1, 2, 3, 4, null, null, 5, 6]);
- });
-
- it('should have correct class annotations', () => {
- const classes = component.calculatedDiff.map((x) => x.type);
- expect(classes).toEqual([
- LineDiffType.Equal,
- LineDiffType.Equal,
- LineDiffType.Insert,
- LineDiffType.Insert,
- LineDiffType.Delete,
- LineDiffType.Delete,
- LineDiffType.Equal,
- LineDiffType.Equal,
- ]);
- });
-
- it('should have correct line contents', () => {
- const contents = component.calculatedDiff.map((x) => x.line);
- expect(contents).toEqual([
- 'Diff One A',
- 'Diff One B',
- 'Diff Two A',
- 'Diff Two B',
- 'Diff Three A',
- 'Diff Three B',
- 'Diff Four A',
- 'Diff Four B',
- ]);
- });
});
diff --git a/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.ts b/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.ts
index 6f44223..f747197 100644
--- a/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.ts
+++ b/projects/ngx-diff/src/lib/components/inline-diff/inline-diff.component.ts
@@ -1,32 +1,21 @@
-import { Diff, DiffOp } from 'diff-match-patch-ts';
+import { Component, EventEmitter, Input, Output } from '@angular/core';
-import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core';
-
-import { IDiffCalculation } from '../../common/diff-calculation.interface';
-import { LineDiffType } from '../../common/line-diff-type';
import { LineSelectEvent } from '../../common/line-select-event';
-import { DiffMatchPatchService } from '../../services/diff-match-patch/diff-match-patch.service';
-import { LineNumberPipe } from '../../pipes/line-number/line-number.pipe';
-import { NgClass } from '@angular/common';
-
-type LineDiff = {
- type: LineDiffType;
- lineNumberInOldText: number | null;
- lineNumberInNewText: number | null;
- line: string;
- args?: { skippedLines?: string[]; lineInOldText?: number | null; lineInNewText?: number | null };
- cssClass: string;
-};
+import { UnifiedDiffComponent } from '../unified-diff/unified-diff.component';
+/**
+ * This is now just a wrapper around ngx-unified-diff.
+ * @deprecated use ngx-unified-diff instead.
+ */
@Component({
// eslint-disable-next-line @angular-eslint/component-selector
selector: 'inline-diff',
templateUrl: './inline-diff.component.html',
styleUrls: ['./inline-diff.component.scss'],
standalone: true,
- imports: [NgClass, LineNumberPipe],
+ imports: [UnifiedDiffComponent],
})
-export class InlineDiffComponent implements OnInit, OnChanges {
+export class InlineDiffComponent {
/**
* Optional title to be displayed at the top of the diff.
*/
@@ -46,308 +35,7 @@ export class InlineDiffComponent implements OnInit, OnChanges {
@Output()
public selectedLineChange = new EventEmitter();
- public diffSummary = {
- numLinesAdded: 0,
- numLinesRemoved: 0,
- };
- public calculatedDiff: LineDiff[] = [];
- public selectedLine?: LineDiff;
- public isContentEqual: boolean = false;
-
- public constructor(private readonly dmp: DiffMatchPatchService) {}
-
- public ngOnInit(): void {
- this.updateHtml();
- }
-
- public ngOnChanges(): void {
- this.updateHtml();
- }
-
- public selectLine(index: number, lineDiff: LineDiff): void {
- this.selectedLine = lineDiff;
- const { type, lineNumberInOldText, lineNumberInNewText, line } = lineDiff;
-
- if (type === LineDiffType.Placeholder) {
- this.expandPlaceholder(index, lineDiff);
- this.selectedLine = undefined;
- }
-
- this.selectedLineChange.emit({
- index,
- type,
- lineNumberInOldText,
- lineNumberInNewText,
- line,
- });
- }
-
- private expandPlaceholder(index: number, placeholder: LineDiff): void {
- const replacementLines = this.getPlaceholderReplacementLines(placeholder);
- this.calculatedDiff.splice(index, 1, ...replacementLines);
- }
-
- private getPlaceholderReplacementLines(placeholder: LineDiff): LineDiff[] {
- const skippedLines = placeholder.args?.skippedLines ?? [];
- const lineInOldText = placeholder.args?.lineInOldText ?? 0;
- const lineInNewText = placeholder.args?.lineInNewText ?? 0;
-
- if (this.lineContextSize && skippedLines.length > 2 * this.lineContextSize) {
- const prefix = skippedLines.slice(0, this.lineContextSize);
- const remainingSkippedLines = skippedLines.slice(
- this.lineContextSize,
- skippedLines.length - this.lineContextSize,
- );
- const suffix = skippedLines.slice(
- skippedLines.length - this.lineContextSize,
- skippedLines.length,
- );
-
- const prefixLines = this.createLineDiffs(prefix, lineInOldText, lineInNewText);
-
- const newPlaceholder: LineDiff = {
- type: LineDiffType.Placeholder,
- lineNumberInOldText: null,
- lineNumberInNewText: null,
- line: `... ${remainingSkippedLines.length} hidden lines ...`,
- args: {
- skippedLines: remainingSkippedLines,
- lineInOldText: lineInOldText + prefix.length,
- lineInNewText: lineInNewText + prefix.length,
- },
- cssClass: this.getCssClass(LineDiffType.Placeholder),
- };
-
- const numberOfPrefixAndSkippedLines = prefix.length + remainingSkippedLines.length;
-
- const suffixLines = this.createLineDiffs(
- suffix,
- lineInOldText + numberOfPrefixAndSkippedLines,
- lineInNewText + numberOfPrefixAndSkippedLines,
- );
-
- return [...prefixLines, newPlaceholder, ...suffixLines];
- }
-
- return this.createLineDiffs(skippedLines, lineInOldText, lineInNewText);
- }
-
- private createLineDiffs(
- lines: string[],
- startLineInOldText: number,
- startLineInNewText: number,
- ): LineDiff[] {
- let lineNumberInOldText = startLineInOldText;
- let lineNumberInNewText = startLineInNewText;
-
- const cssClass = this.getCssClass(LineDiffType.Equal);
- const linesToInsert: LineDiff[] = [];
-
- for (const line of lines) {
- linesToInsert.push({
- type: LineDiffType.Equal,
- lineNumberInOldText,
- lineNumberInNewText,
- line: line,
- cssClass,
- });
- lineNumberInOldText++;
- lineNumberInNewText++;
- }
-
- return linesToInsert;
- }
-
- private updateHtml(): void {
- if (typeof this.oldText === 'number' || typeof this.oldText === 'boolean') {
- this.oldText = this.oldText.toString();
- }
- if (typeof this.newText === 'number' || typeof this.newText === 'boolean') {
- this.newText = this.newText.toString();
- }
- this.calculateLineDiff(this.dmp.computeLineDiff(this.oldText ?? '', this.newText ?? ''));
- }
-
- private calculateLineDiff(diffs: Diff[]): void {
- const diffCalculation: IDiffCalculation = {
- lineInNewText: 1,
- lineInOldText: 1,
- lines: [],
- };
-
- this.isContentEqual = diffs.length === 1 && diffs[0][0] === DiffOp.Equal;
- if (this.isContentEqual) {
- this.calculatedDiff = [];
- this.diffSummary = {
- numLinesAdded: 0,
- numLinesRemoved: 0,
- };
- return;
- }
-
- for (let i = 0; i < diffs.length; i++) {
- const diff = diffs[i];
- const diffLines: string[] = diff[1].split(/\r?\n/);
-
- // If the original line had a \r\n at the end then remove the
- // empty string after it.
- if (diffLines[diffLines.length - 1].length === 0) {
- diffLines.pop();
- }
-
- switch (diff[0]) {
- case DiffOp.Equal: {
- const isFirstDiff = i === 0;
- const isLastDiff = i === diffs.length - 1;
- this.outputEqualDiff(diffLines, diffCalculation, isFirstDiff, isLastDiff);
- break;
- }
- case DiffOp.Delete: {
- this.outputDeleteDiff(diffLines, diffCalculation);
- break;
- }
- case DiffOp.Insert: {
- this.outputInsertDiff(diffLines, diffCalculation);
- break;
- }
- }
- }
-
- this.calculatedDiff = diffCalculation.lines.map(
- ({ type, lineNumberInOldText, lineNumberInNewText, line, args }) => {
- return {
- type,
- lineNumberInOldText,
- lineNumberInNewText,
- line,
- args,
- cssClass: this.getCssClass(type),
- };
- },
- );
-
- this.diffSummary = {
- numLinesAdded: this.calculatedDiff.filter((x) => x.type === LineDiffType.Insert).length,
- numLinesRemoved: this.calculatedDiff.filter((x) => x.type === LineDiffType.Delete).length,
- };
- }
-
- /* If the number of diffLines is greater than lineContextSize then we may need to adjust the diff
- * that is output.
- * > If the first diff of a document is DiffOp.Equal then the leading lines can be dropped
- * leaving the last 'lineContextSize' lines for context.
- * > If the last diff of a document is DiffOp.Equal then the trailing lines can be dropped
- * leaving the first 'lineContextSize' lines for context.
- * > If the diff is a DiffOp.Equal occurs in the middle then the diffs either side of it must be
- * DiffOp.Insert or DiffOp.Delete. If it has more than 2 * 'lineContextSize' lines of content
- * then the middle lines are dropped leaving the first 'lineContextSize' and last 'lineContextSize'
- * lines for context. A special line is inserted with '...' indicating that content is skipped.
- *
- * A document cannot consist of a single Diff with DiffOp.Equal and reach this function because
- * in this case the calculateLineDiff method returns early.
- */
- private outputEqualDiff(
- diffLines: string[],
- diffCalculation: IDiffCalculation,
- isFirstDiff: boolean,
- isLastDiff: boolean,
- ): void {
- if (this.lineContextSize && diffLines.length > this.lineContextSize) {
- if (isFirstDiff) {
- // Take the last 'lineContextSize' lines from the first diff
- const lineIncrement = diffLines.length - this.lineContextSize;
- diffCalculation.lineInOldText += lineIncrement;
- diffCalculation.lineInNewText += lineIncrement;
- diffLines = diffLines.slice(diffLines.length - this.lineContextSize, diffLines.length);
- } else if (isLastDiff) {
- // Take only the first 'lineContextSize' lines from the final diff
- diffLines = diffLines.slice(0, this.lineContextSize);
- } else if (diffLines.length > 2 * this.lineContextSize) {
- // Take the first 'lineContextSize' lines from this diff to provide context for the last diff
- this.outputEqualDiffLines(diffLines.slice(0, this.lineContextSize), diffCalculation);
-
- const skippedLines = diffLines.slice(
- this.lineContextSize,
- diffLines.length - this.lineContextSize,
- );
-
- // Output a special line indicating that some content is equal and has been skipped
- diffCalculation.lines.push({
- type: LineDiffType.Placeholder,
- lineNumberInOldText: null,
- lineNumberInNewText: null,
- line: `... ${skippedLines.length} hidden lines ...`,
- args: {
- skippedLines,
- lineInOldText: diffCalculation.lineInOldText,
- lineInNewText: diffCalculation.lineInNewText,
- },
- });
- const numberOfSkippedLines = diffLines.length - 2 * this.lineContextSize;
- diffCalculation.lineInOldText += numberOfSkippedLines;
- diffCalculation.lineInNewText += numberOfSkippedLines;
-
- // Take the last 'lineContextSize' lines from this diff to provide context for the next diff
- this.outputEqualDiffLines(
- diffLines.slice(diffLines.length - this.lineContextSize),
- diffCalculation,
- );
- // This if branch has already output the diff lines so we return early to avoid outputting the lines
- // at the end of the method.
- return;
- }
- }
- this.outputEqualDiffLines(diffLines, diffCalculation);
- }
-
- private outputEqualDiffLines(diffLines: string[], diffCalculation: IDiffCalculation): void {
- for (const line of diffLines) {
- diffCalculation.lines.push({
- type: LineDiffType.Equal,
- lineNumberInOldText: diffCalculation.lineInOldText,
- lineNumberInNewText: diffCalculation.lineInNewText,
- line,
- });
- diffCalculation.lineInOldText++;
- diffCalculation.lineInNewText++;
- }
- }
-
- private outputDeleteDiff(diffLines: string[], diffCalculation: IDiffCalculation): void {
- for (const line of diffLines) {
- diffCalculation.lines.push({
- type: LineDiffType.Delete,
- lineNumberInOldText: diffCalculation.lineInOldText,
- lineNumberInNewText: null,
- line,
- });
- diffCalculation.lineInOldText++;
- }
- }
-
- private outputInsertDiff(diffLines: string[], diffCalculation: IDiffCalculation): void {
- for (const line of diffLines) {
- diffCalculation.lines.push({
- type: LineDiffType.Insert,
- lineNumberInOldText: null,
- lineNumberInNewText: diffCalculation.lineInNewText,
- line,
- });
- diffCalculation.lineInNewText++;
- }
- }
-
- private getCssClass(type: LineDiffType): string {
- switch (type) {
- case LineDiffType.Placeholder:
- case LineDiffType.Equal:
- return 'inline-diff-equal';
- case LineDiffType.Insert:
- return 'inline-diff-insert';
- case LineDiffType.Delete:
- return 'inline-diff-delete';
- default:
- return 'unknown';
- }
+ protected onSelectedLineChange(event: LineSelectEvent): void {
+ this.selectedLineChange.emit(event);
}
}
diff --git a/projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.html b/projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.html
new file mode 100644
index 0000000..b8094b5
--- /dev/null
+++ b/projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.html
@@ -0,0 +1,48 @@
+
+ @if (title) {
+ {{ title }}
+ }
+ +++ {{ diffSummary.numLinesAdded }}
+ --- {{ diffSummary.numLinesRemoved }}
+
+@if (isContentEqual) {
+
+
There are no changes to display.
+
+}
+@if (!isContentEqual) {
+
+
+ @for (lineDiff of calculatedDiff; track lineDiff; let idx = $index) {
+
+
{{ lineDiff.lineNumberInOldText | lineNumber }}
+
{{ lineDiff.lineNumberInNewText | lineNumber }}
+
+ }
+
+
+
+
+ @for (lineDiff of calculatedDiff; track lineDiff) {
+
+ }
+
+
+
+
+}
diff --git a/projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.scss b/projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.scss
new file mode 100644
index 0000000..440e5bb
--- /dev/null
+++ b/projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.scss
@@ -0,0 +1,144 @@
+div.ufd-diff-title-bar {
+ background-color: var(--ngx-diff-margin-background-color);
+ color: var(--ngx-diff-font-color);
+ font-family: var(--ngx-diff-font-family);
+ font-size: var(--ngx-diff-font-size);
+ font-weight: var(--ngx-diff-title-font-weight);
+ padding: var(--ngx-diff-title-bar-padding);
+ border-top: var(--ngx-diff-border-width) solid var(--ngx-diff-border-color);
+ border-left: var(--ngx-diff-border-width) solid var(--ngx-diff-border-color);
+ border-right: var(--ngx-diff-border-width) solid var(--ngx-diff-border-color);
+}
+
+div.ufd-diff-no-changes-text {
+ font-family: var(--ngx-diff-font-family);
+ font-size: var(--ngx-diff-font-size);
+ font-weight: var(--ngx-diff-title-font-weight);
+ padding: var(--ngx-diff-title-bar-padding);
+ background-color: var(--ngx-diff-equal-background-color);
+ color: var(--ngx-diff-font-color);
+ flex-grow: 1;
+}
+
+.ufd-diff-summary-lines-added {
+ color: var(--ngx-diff-insert-color-darkest);
+}
+
+.ufd-diff-summary-lines-removed {
+ color: var(--ngx-diff-delete-color-darkest);
+}
+
+div.ufd-diff {
+ display: flex;
+ flex-direction: row;
+ border: var(--ngx-diff-border-width) solid var(--ngx-diff-border-color);
+ font-family: var(--ngx-diff-font-family);
+}
+
+div.ufd-diff-content {
+ position: relative;
+ top: 0px;
+ left: 0px;
+ flex-grow: 1;
+ overflow-x: auto;
+ overflow-y: hidden;
+}
+
+div.ufd-diff-content-wrapper {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ display: flex;
+ flex-direction: column;
+ align-items: stretch;
+ width: 100%;
+}
+
+div.ufd-diff-old {
+ width: var(--ngx-diff-line-number-width);
+ text-align: center;
+ font-size: var(--ngx-diff-font-size);
+}
+
+div.ufd-diff-new {
+ width: var(--ngx-diff-line-number-width);
+ text-align: center;
+ border-right: var(--ngx-diff-border-width) solid var(--border-color);
+ font-size: var(--ngx-diff-font-size);
+}
+
+div.ufd-diff-text {
+ white-space: pre;
+ padding-left: var(--ngx-diff-line-left-padding);
+ font-size: var(--ngx-diff-font-size);
+ color: var(--ngx-diff-font-color);
+}
+
+.ufd-diff-equal {
+ background-color: var(--ngx-diff-margin-background-color);
+
+ &.line-content {
+ background-color: var(--ngx-diff-equal-background-color);
+ }
+}
+
+.ufd-diff-delete {
+ background-color: var(--ngx-diff-delete-color-darker);
+
+ &.line-content {
+ background-color: var(--ngx-diff-deleted-background-color);
+ }
+}
+
+.ufd-diff-insert {
+ background-color: var(--ngx-diff-insert-color-darker);
+
+ &.line-content {
+ background-color: var(--ngx-diff-inserted-background-color);
+ }
+}
+
+.ufd-diff-delete > div {
+ display: inline-block;
+}
+
+.ufd-diff-insert > div {
+ display: inline-block;
+}
+
+.ufd-diff-equal > div {
+ display: inline-block;
+}
+
+.dmp-margin-bottom-spacer {
+ height: var(--ngx-diff-bottom-spacer-height);
+ background-color: var(--ngx-diff-margin-background-color);
+ border-right: var(--ngx-diff-border-width) solid var(--border-color);
+
+ &.line-content {
+ background-color: var(--ngx-diff-equal-background-color);
+ }
+}
+
+.line-selector {
+ color: var(--ngx-diff-line-number-font-color);
+
+ &:hover {
+ cursor: pointer;
+ color: var(--ngx-diff-line-number-hover-font-color);
+ }
+
+ &.selected {
+ border-top: var(--ngx-diff-selected-border-width) solid var(--ngx-diff-selected-border-color);
+ border-left: var(--ngx-diff-selected-border-width) solid var(--ngx-diff-selected-border-color);
+ border-bottom: var(--ngx-diff-selected-border-width) solid var(--ngx-diff-selected-border-color);
+ background-color: var(--ngx-diff-selected-line-background-color);
+ }
+}
+
+.line-content.selected {
+ border-top: var(--ngx-diff-selected-border-width) solid var(--ngx-diff-selected-border-color);
+ border-right: var(--ngx-diff-selected-border-width) solid var(--ngx-diff-selected-border-color);
+ border-bottom: var(--ngx-diff-selected-border-width) solid var(--ngx-diff-selected-border-color);
+ background-color: var(--ngx-diff-selected-line-background-color);
+}
diff --git a/projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.spec.ts b/projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.spec.ts
new file mode 100644
index 0000000..f8f50ca
--- /dev/null
+++ b/projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.spec.ts
@@ -0,0 +1,81 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { UnifiedDiffComponent } from './unified-diff.component';
+
+import { Diff, DiffOp } from 'diff-match-patch-ts';
+
+import { LineDiffType } from '../../common/line-diff-type';
+import { LineNumberPipe } from '../../pipes/line-number/line-number.pipe';
+import { DiffMatchPatchService } from '../../services/diff-match-patch/diff-match-patch.service';
+
+class DiffMatchPatchServiceMock {
+ // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars, no-underscore-dangle, id-blacklist, id-match
+ public computeLineDiff(_oldText: string, _newText: string): Diff[] {
+ return [
+ [DiffOp.Equal, 'Diff One A\r\nDiff One B\r\n'],
+ [DiffOp.Insert, 'Diff Two A\r\nDiff Two B\r\n'],
+ [DiffOp.Delete, 'Diff Three A\r\nDiff Three B'],
+ [DiffOp.Equal, 'Diff Four A\r\nDiff Four B\r\n'],
+ ];
+ }
+}
+
+describe('UnifiedDiffComponent', () => {
+ let component: UnifiedDiffComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [UnifiedDiffComponent, LineNumberPipe],
+ providers: [{ provide: DiffMatchPatchService, useClass: DiffMatchPatchServiceMock }],
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(UnifiedDiffComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+
+ it('should have 8 line diffs', () => {
+ expect(component.calculatedDiff.length).toBe(8);
+ });
+
+ it('should have correct line numbers', () => {
+ const leftLineNumbers = component.calculatedDiff.map((x) => x.lineNumberInOldText);
+ expect(leftLineNumbers).toEqual([1, 2, null, null, 3, 4, 5, 6]);
+
+ const rightLineNumbers = component.calculatedDiff.map((x) => x.lineNumberInNewText);
+ expect(rightLineNumbers).toEqual([1, 2, 3, 4, null, null, 5, 6]);
+ });
+
+ it('should have correct class annotations', () => {
+ const classes = component.calculatedDiff.map((x) => x.type);
+ expect(classes).toEqual([
+ LineDiffType.Equal,
+ LineDiffType.Equal,
+ LineDiffType.Insert,
+ LineDiffType.Insert,
+ LineDiffType.Delete,
+ LineDiffType.Delete,
+ LineDiffType.Equal,
+ LineDiffType.Equal,
+ ]);
+ });
+
+ it('should have correct line contents', () => {
+ const contents = component.calculatedDiff.map((x) => x.line);
+ expect(contents).toEqual([
+ 'Diff One A',
+ 'Diff One B',
+ 'Diff Two A',
+ 'Diff Two B',
+ 'Diff Three A',
+ 'Diff Three B',
+ 'Diff Four A',
+ 'Diff Four B',
+ ]);
+ });
+});
diff --git a/projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.ts b/projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.ts
new file mode 100644
index 0000000..e705d80
--- /dev/null
+++ b/projects/ngx-diff/src/lib/components/unified-diff/unified-diff.component.ts
@@ -0,0 +1,352 @@
+import { Diff, DiffOp } from 'diff-match-patch-ts';
+
+import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core';
+
+import { IDiffCalculation } from '../../common/diff-calculation.interface';
+import { LineDiffType } from '../../common/line-diff-type';
+import { LineSelectEvent } from '../../common/line-select-event';
+import { DiffMatchPatchService } from '../../services/diff-match-patch/diff-match-patch.service';
+import { LineNumberPipe } from '../../pipes/line-number/line-number.pipe';
+import { NgClass } from '@angular/common';
+
+type LineDiff = {
+ type: LineDiffType;
+ lineNumberInOldText: number | null;
+ lineNumberInNewText: number | null;
+ line: string;
+ args?: { skippedLines?: string[]; lineInOldText?: number | null; lineInNewText?: number | null };
+ cssClass: string;
+};
+
+@Component({
+ selector: 'ngx-unified-diff',
+ standalone: true,
+ imports: [NgClass, LineNumberPipe],
+ templateUrl: './unified-diff.component.html',
+ styleUrl: './unified-diff.component.scss',
+})
+export class UnifiedDiffComponent implements OnInit, OnChanges {
+ /**
+ * Optional title to be displayed at the top of the diff.
+ */
+ @Input({ required: false })
+ public title?: string;
+ @Input({ required: true })
+ public before: string | number | boolean | undefined;
+ @Input({ required: true })
+ public after: string | number | boolean | undefined;
+ /**
+ * The number of lines of context to provide either side of a DiffOp.Insert or DiffOp.Delete diff.
+ * Context is taken from a DiffOp.Equal section.
+ */
+ @Input({ required: false })
+ public lineContextSize?: number;
+
+ @Output()
+ public selectedLineChange = new EventEmitter();
+
+ public diffSummary = {
+ numLinesAdded: 0,
+ numLinesRemoved: 0,
+ };
+ public calculatedDiff: LineDiff[] = [];
+ public selectedLine?: LineDiff;
+ public isContentEqual: boolean = false;
+
+ public constructor(private readonly dmp: DiffMatchPatchService) {}
+
+ public ngOnInit(): void {
+ this.updateHtml();
+ }
+
+ public ngOnChanges(): void {
+ this.updateHtml();
+ }
+
+ public selectLine(index: number, lineDiff: LineDiff): void {
+ this.selectedLine = lineDiff;
+ const { type, lineNumberInOldText, lineNumberInNewText, line } = lineDiff;
+
+ if (type === LineDiffType.Placeholder) {
+ this.expandPlaceholder(index, lineDiff);
+ this.selectedLine = undefined;
+ }
+
+ this.selectedLineChange.emit({
+ index,
+ type,
+ lineNumberInOldText,
+ lineNumberInNewText,
+ line,
+ });
+ }
+
+ private expandPlaceholder(index: number, placeholder: LineDiff): void {
+ const replacementLines = this.getPlaceholderReplacementLines(placeholder);
+ this.calculatedDiff.splice(index, 1, ...replacementLines);
+ }
+
+ private getPlaceholderReplacementLines(placeholder: LineDiff): LineDiff[] {
+ const skippedLines = placeholder.args?.skippedLines ?? [];
+ const lineInOldText = placeholder.args?.lineInOldText ?? 0;
+ const lineInNewText = placeholder.args?.lineInNewText ?? 0;
+
+ if (this.lineContextSize && skippedLines.length > 2 * this.lineContextSize) {
+ const prefix = skippedLines.slice(0, this.lineContextSize);
+ const remainingSkippedLines = skippedLines.slice(
+ this.lineContextSize,
+ skippedLines.length - this.lineContextSize,
+ );
+ const suffix = skippedLines.slice(
+ skippedLines.length - this.lineContextSize,
+ skippedLines.length,
+ );
+
+ const prefixLines = this.createLineDiffs(prefix, lineInOldText, lineInNewText);
+
+ const newPlaceholder: LineDiff = {
+ type: LineDiffType.Placeholder,
+ lineNumberInOldText: null,
+ lineNumberInNewText: null,
+ line: `... ${remainingSkippedLines.length} hidden lines ...`,
+ args: {
+ skippedLines: remainingSkippedLines,
+ lineInOldText: lineInOldText + prefix.length,
+ lineInNewText: lineInNewText + prefix.length,
+ },
+ cssClass: this.getCssClass(LineDiffType.Placeholder),
+ };
+
+ const numberOfPrefixAndSkippedLines = prefix.length + remainingSkippedLines.length;
+
+ const suffixLines = this.createLineDiffs(
+ suffix,
+ lineInOldText + numberOfPrefixAndSkippedLines,
+ lineInNewText + numberOfPrefixAndSkippedLines,
+ );
+
+ return [...prefixLines, newPlaceholder, ...suffixLines];
+ }
+
+ return this.createLineDiffs(skippedLines, lineInOldText, lineInNewText);
+ }
+
+ private createLineDiffs(
+ lines: string[],
+ startLineInOldText: number,
+ startLineInNewText: number,
+ ): LineDiff[] {
+ let lineNumberInOldText = startLineInOldText;
+ let lineNumberInNewText = startLineInNewText;
+
+ const cssClass = this.getCssClass(LineDiffType.Equal);
+ const linesToInsert: LineDiff[] = [];
+
+ for (const line of lines) {
+ linesToInsert.push({
+ type: LineDiffType.Equal,
+ lineNumberInOldText,
+ lineNumberInNewText,
+ line: line,
+ cssClass,
+ });
+ lineNumberInOldText++;
+ lineNumberInNewText++;
+ }
+
+ return linesToInsert;
+ }
+
+ private updateHtml(): void {
+ if (typeof this.before === 'number' || typeof this.before === 'boolean') {
+ this.before = this.before.toString();
+ }
+ if (typeof this.after === 'number' || typeof this.after === 'boolean') {
+ this.after = this.after.toString();
+ }
+ this.calculateLineDiff(this.dmp.computeLineDiff(this.before ?? '', this.after ?? ''));
+ }
+
+ private calculateLineDiff(diffs: Diff[]): void {
+ const diffCalculation: IDiffCalculation = {
+ lineInNewText: 1,
+ lineInOldText: 1,
+ lines: [],
+ };
+
+ this.isContentEqual = diffs.length === 1 && diffs[0][0] === DiffOp.Equal;
+ if (this.isContentEqual) {
+ this.calculatedDiff = [];
+ this.diffSummary = {
+ numLinesAdded: 0,
+ numLinesRemoved: 0,
+ };
+ return;
+ }
+
+ for (let i = 0; i < diffs.length; i++) {
+ const diff = diffs[i];
+ const diffLines: string[] = diff[1].split(/\r?\n/);
+
+ // If the original line had a \r\n at the end then remove the
+ // empty string after it.
+ if (diffLines[diffLines.length - 1].length === 0) {
+ diffLines.pop();
+ }
+
+ switch (diff[0]) {
+ case DiffOp.Equal: {
+ const isFirstDiff = i === 0;
+ const isLastDiff = i === diffs.length - 1;
+ this.outputEqualDiff(diffLines, diffCalculation, isFirstDiff, isLastDiff);
+ break;
+ }
+ case DiffOp.Delete: {
+ this.outputDeleteDiff(diffLines, diffCalculation);
+ break;
+ }
+ case DiffOp.Insert: {
+ this.outputInsertDiff(diffLines, diffCalculation);
+ break;
+ }
+ }
+ }
+
+ this.calculatedDiff = diffCalculation.lines.map(
+ ({ type, lineNumberInOldText, lineNumberInNewText, line, args }) => {
+ return {
+ type,
+ lineNumberInOldText,
+ lineNumberInNewText,
+ line,
+ args,
+ cssClass: this.getCssClass(type),
+ };
+ },
+ );
+
+ this.diffSummary = {
+ numLinesAdded: this.calculatedDiff.filter((x) => x.type === LineDiffType.Insert).length,
+ numLinesRemoved: this.calculatedDiff.filter((x) => x.type === LineDiffType.Delete).length,
+ };
+ }
+
+ /* If the number of diffLines is greater than lineContextSize then we may need to adjust the diff
+ * that is output.
+ * > If the first diff of a document is DiffOp.Equal then the leading lines can be dropped
+ * leaving the last 'lineContextSize' lines for context.
+ * > If the last diff of a document is DiffOp.Equal then the trailing lines can be dropped
+ * leaving the first 'lineContextSize' lines for context.
+ * > If the diff is a DiffOp.Equal occurs in the middle then the diffs either side of it must be
+ * DiffOp.Insert or DiffOp.Delete. If it has more than 2 * 'lineContextSize' lines of content
+ * then the middle lines are dropped leaving the first 'lineContextSize' and last 'lineContextSize'
+ * lines for context. A special line is inserted with '...' indicating that content is skipped.
+ *
+ * A document cannot consist of a single Diff with DiffOp.Equal and reach this function because
+ * in this case the calculateLineDiff method returns early.
+ */
+ private outputEqualDiff(
+ diffLines: string[],
+ diffCalculation: IDiffCalculation,
+ isFirstDiff: boolean,
+ isLastDiff: boolean,
+ ): void {
+ if (this.lineContextSize && diffLines.length > this.lineContextSize) {
+ if (isFirstDiff) {
+ // Take the last 'lineContextSize' lines from the first diff
+ const lineIncrement = diffLines.length - this.lineContextSize;
+ diffCalculation.lineInOldText += lineIncrement;
+ diffCalculation.lineInNewText += lineIncrement;
+ diffLines = diffLines.slice(diffLines.length - this.lineContextSize, diffLines.length);
+ } else if (isLastDiff) {
+ // Take only the first 'lineContextSize' lines from the final diff
+ diffLines = diffLines.slice(0, this.lineContextSize);
+ } else if (diffLines.length > 2 * this.lineContextSize) {
+ // Take the first 'lineContextSize' lines from this diff to provide context for the last diff
+ this.outputEqualDiffLines(diffLines.slice(0, this.lineContextSize), diffCalculation);
+
+ const skippedLines = diffLines.slice(
+ this.lineContextSize,
+ diffLines.length - this.lineContextSize,
+ );
+
+ // Output a special line indicating that some content is equal and has been skipped
+ diffCalculation.lines.push({
+ type: LineDiffType.Placeholder,
+ lineNumberInOldText: null,
+ lineNumberInNewText: null,
+ line: `... ${skippedLines.length} hidden lines ...`,
+ args: {
+ skippedLines,
+ lineInOldText: diffCalculation.lineInOldText,
+ lineInNewText: diffCalculation.lineInNewText,
+ },
+ });
+ const numberOfSkippedLines = diffLines.length - 2 * this.lineContextSize;
+ diffCalculation.lineInOldText += numberOfSkippedLines;
+ diffCalculation.lineInNewText += numberOfSkippedLines;
+
+ // Take the last 'lineContextSize' lines from this diff to provide context for the next diff
+ this.outputEqualDiffLines(
+ diffLines.slice(diffLines.length - this.lineContextSize),
+ diffCalculation,
+ );
+ // This if branch has already output the diff lines so we return early to avoid outputting the lines
+ // at the end of the method.
+ return;
+ }
+ }
+ this.outputEqualDiffLines(diffLines, diffCalculation);
+ }
+
+ private outputEqualDiffLines(diffLines: string[], diffCalculation: IDiffCalculation): void {
+ for (const line of diffLines) {
+ diffCalculation.lines.push({
+ type: LineDiffType.Equal,
+ lineNumberInOldText: diffCalculation.lineInOldText,
+ lineNumberInNewText: diffCalculation.lineInNewText,
+ line,
+ });
+ diffCalculation.lineInOldText++;
+ diffCalculation.lineInNewText++;
+ }
+ }
+
+ private outputDeleteDiff(diffLines: string[], diffCalculation: IDiffCalculation): void {
+ for (const line of diffLines) {
+ diffCalculation.lines.push({
+ type: LineDiffType.Delete,
+ lineNumberInOldText: diffCalculation.lineInOldText,
+ lineNumberInNewText: null,
+ line,
+ });
+ diffCalculation.lineInOldText++;
+ }
+ }
+
+ private outputInsertDiff(diffLines: string[], diffCalculation: IDiffCalculation): void {
+ for (const line of diffLines) {
+ diffCalculation.lines.push({
+ type: LineDiffType.Insert,
+ lineNumberInOldText: null,
+ lineNumberInNewText: diffCalculation.lineInNewText,
+ line,
+ });
+ diffCalculation.lineInNewText++;
+ }
+ }
+
+ private getCssClass(type: LineDiffType): string {
+ switch (type) {
+ case LineDiffType.Placeholder:
+ case LineDiffType.Equal:
+ return 'ufd-diff-equal';
+ case LineDiffType.Insert:
+ return 'ufd-diff-insert';
+ case LineDiffType.Delete:
+ return 'ufd-diff-delete';
+ default:
+ return 'unknown';
+ }
+ }
+}