Compare commits

...

36 Commits

Author SHA1 Message Date
Matthew Beck 8017617fd9 release: cut the v21.2.4 release 2026-03-12 12:58:02 -06:00
Kristiyan Kostadinov ed2d324f9c fix(compiler): disallow translations of iframe src
Fixes that the compiler was allowing translations of `src` attributes in iframes which can be a security issue.

(cherry picked from commit 78dea55351)
2026-03-12 10:01:31 -07:00
Kristiyan Kostadinov d1dcd16c5b fix(core): sanitize translated form attributes
Fixes that we weren't sanitizing the `form` and `formaction` attributes when they're used together with translations.

(cherry picked from commit de0eb4c656)
2026-03-12 10:01:30 -07:00
Jessica Janiuk abbd8797bb fix(core): reverts "feat(core): add support for nested animations"
This reverts commit ea2016a6dc.

This reverts the support for nested animations due to the global scope of how nested animations were gathered.
This caused issues where on route navigations, all child nodes with animations would be queued and run before the navigation would occur.
We'll be revisiting the nested animations with a more tightened scope of when those leave animations will occur.

fixes: #67552
(cherry picked from commit 999c14eaab)
2026-03-12 09:58:07 -07:00
Angular Robot c06e3a0bb4 build: update bazel dependencies
See associated pull request for more information.
2026-03-11 14:41:33 -07:00
wokis 8ba2844da5 docs: document coverageExclude option for excluding files from coverage
(cherry picked from commit 3d25953e69)
2026-03-11 21:31:10 +00:00
Jon Snow 74698d58ec docs(forms): clarify zoneless change detection for reactive FormArray updates
Document that reactive forms model mutations such as FormArray.push() do not schedule component change detection in zoneless applications and show the recommended ways to notify Angular.

Fixes #65536

(cherry picked from commit 88235a0d12)
2026-03-11 14:13:27 -07:00
Andrew Scott a7e3d764e5 release: bump VSCode extension version to 21.2.3 (#67629) 2026-03-11 14:09:57 -07:00
Alan Agius 7907e982ee test: remove duplicate tests
These tests are duplicate and have been removed.
2026-03-11 13:35:26 -07:00
Alan Agius adda6c5c10 build: update aspect_rules_js to 3.0.2
This updates the major version of `aspect_rules_js`.
2026-03-11 13:35:26 -07:00
Andrew Scott e7593653be release: cut the v21.2.3 release 2026-03-11 12:03:13 -07:00
JoostK 21b1c3b2ee fix(core): include signal debug names in their toString() representation
The `toString()` implementations in the primitives package intended to include
the debug name, yet the debug name was evaluated during construction before it
could ever have been assigned. This commit fixes that.

The Angular wrappers override the `toString()` representation to evaluate signals
ad-hoc instead of showing their internal state, and this commit aligns their
behavior to include the debug name in `toString` as well.

(cherry picked from commit b401c18674)
2026-03-11 18:28:39 +00:00
SkyZeroZx 6c73aaca30 refactor(common): Removes unused generic type parameters from KeyValueDiffers
Remove unused generic type parameters from KeyValueDiffers methods

(cherry picked from commit 0837d25a70)
2026-03-11 17:49:15 +00:00
Matthieu Riegler c98eab794c refactor(core): remove old resource params
G3 has been cleaned up we can drop those.

(cherry picked from commit 4842f5a3b7)
2026-03-11 17:44:16 +00:00
Thomas Willberger d45fced21b docs: remove duplicate aria-hidden attribute in angular aria ngTree example
(cherry picked from commit eafce6ed09)
2026-03-11 17:03:13 +00:00
SkyZeroZx ed48c41f65 refactor(compiler-cli): simplifies IncrementalCompilation.fresh
Removes the `ts.Program` argument from the `IncrementalCompilation.fresh` method.

(cherry picked from commit 66e72efef4)
2026-03-11 16:41:05 +00:00
Ibrahim Hussien 75135586d6 docs: combine multiple documentation improvements into one PR
(cherry picked from commit 903d51e855)
2026-03-11 16:29:49 +00:00
Angular Robot ff697707ba build: update pnpm to v10.32.0
See associated pull request for more information.
2026-03-11 09:28:49 -07:00
SkyZeroZx 7d76103999 docs(docs-infra): fix close button clickability and prevent layout shift
Adjust the z-index to ensure the close button remains clickable.

Also remove an unnecessary `position: relative` that was causing
layout shifts in the docs UI, which resulted in a visible and
unintended layout movement.

(cherry picked from commit 3ce1d9a755)
2026-03-11 16:28:10 +00:00
Matthieu Riegler 575f3023c1 refactor(core): interface cleanup
Should be fine to land this time.

(cherry picked from commit a675950e44)
2026-03-10 19:44:36 +00:00
Andrew Scott 4c86ed382d refactor(compiler-cli): abstract type check block metadata to be AST-free
This commit refactors the template type checking metadata interfaces to use detached, serializable metadata rather than retaining direct references to ts.Node or ts.Declaration instances.

A new tcb_adapter translates traditional TypeScript AST-bound metadata into these decoupled structures. This abstraction lays the groundwork for supporting native preprocessors (such as Rust or ts-go) which serialize metadata over JSON rather than passing live TypeScript objects.

Key changes:
- Introduced TcbDirectiveMetadata, TcbComponentMetadata, TcbReferenceMetadata, and TcbPipeMetadata to replace TypeCheckableDirectiveMeta where appropriate.
- Substituted deep TS compilation AST references with string module names and source spans to preserve out-of-band diagnostic capabilities.
- Detached generic typeParameters and transformType properties into synthesized, standalone TS mappings.
- Updated generateTypeCheckBlock and corresponding Operations to consume the new metadata.
2026-03-10 12:39:18 -07:00
Kristiyan Kostadinov 224e60ecb1 fix(core): sanitize translated attribute bindings with interpolations
Fixes that we weren't sanitizing attribute bindings with interpolations if they're marked for translation, for example: `<a href="{{evilLink}}" i18n-href></a>`.

Also adds a bit more test coverage for our sanitization.

(cherry picked from commit 8630319f74)
2026-03-10 18:13:54 +00:00
Kristiyan Kostadinov 492e7560e6 build: include localize in dev app
Includes `$localize` in the dev app so it's easier to test some code paths.

(cherry picked from commit f80ac30875)
2026-03-10 18:13:53 +00:00
Jon Snow 09638ec7c3 docs(core): clarify provideZoneChangeDetection usage in v21+
Clarify that provideZoneChangeDetection() is used to opt applications into NgZone/ZoneJS-based change detection and to configure NgZone options such as eventCoalescing.

Fixes #67498

(cherry picked from commit 196933863b)
2026-03-10 17:21:13 +00:00
Guseyn ab35383285 docs: fix first-app code getHousingLocationById housing.service.ts
1. Get location by Id work with `${this.url}/${id}`
2. Method getHousingLocationById returned empty object, api return object type, locationJson[0] ?? {} - give in result empty object.

(cherry picked from commit 9794e756f9)
2026-03-10 17:02:43 +00:00
Angular Robot 934e2732b3 build: lock file maintenance
See associated pull request for more information.
2026-03-10 09:59:30 -07:00
Guseyn c20dabda2a docs: fix first-app 13 step docs code row numbers
Fix docs code row numbers.

(cherry picked from commit 7bc7c57636)
2026-03-10 16:59:08 +00:00
Kristiyan Kostadinov 62a97f7e4b fix(core): ensure definitions compile
Includes the following changes to make sure the definitions for injectable compiler:
1. The types for the `factory` function now include the `parent` parameter.
2. `ɵɵFactoryDeclaration` is now defined as a function. We need this since the provider definition gets passed into the inejctable definition by reference.
3. `ɵɵdefineInjectable`, `ɵɵdefineNgModule` and `ɵɵdefinePipe` now return the typed definition, rather than `unknown`. This aligns with what we do for components and directives.

(cherry picked from commit f9ede9ec98)
2026-03-10 16:58:22 +00:00
Eugene Serkin 106cf4ee90 docs: Update migration docs for vitest
This update fixes minor grammar mistakes

(cherry picked from commit 20496988b1)
2026-03-10 16:23:53 +00:00
Angular Robot 024e307ab0 build: update pnpm to v10.31.0
See associated pull request for more information.
2026-03-09 17:00:10 -07:00
SkyZeroZx 77b035eca6 docs: Adds @see links and update defer reference
(cherry picked from commit 6073493c5b)
2026-03-09 23:59:43 +00:00
Sonu Kapoor 4a9b715b3a test(forms): cover transformedValue without FormField context
Adds a test verifying that `transformedValue` exposes parse errors via
the returned signal's `parseErrors()` property when no FormField
context is present.

This ensures that:
- parse errors are still observable without DI-based field propagation
- the model is not updated when `parse` omits `value`
- valid input clears parse errors and updates the model

This test protects the documented contract that DI-based error
propagation is expected for FormValueControl usage, while standalone
usage relies on explicit consumption of `parseErrors()`.

(cherry picked from commit 71b8159b37)
2026-03-09 23:41:52 +00:00
Jessica Janiuk 420aa725ae docs: Update animation docs for element removal order
This update the docs to be clear that descendent node animations will happen before the parent node is removed.

fixes: #67526
(cherry picked from commit 8c17721333)
2026-03-09 23:40:48 +00:00
Matthieu Riegler c499c578c9 ci: fix exclusion of manual_api_docs
On top of #67253, dev-infra should be required for docs files

(cherry picked from commit bf93ff83d8)
2026-03-09 23:27:47 +00:00
Matthieu Riegler 0588133210 refactor(core): remove private export of getDebugNode
This is a public api

(cherry picked from commit 0afe3c00ae)
2026-03-09 18:21:23 +00:00
Andrew Scott 6416a31c1b refactor(core): update componentDeclaration to include isSignal
This is in DirectiveDeclaration and in the golden files with ComponentDeclaration
so I assume it was an accidental omission.

(cherry picked from commit e97f5139ec)
2026-03-09 18:17:42 +00:00
185 changed files with 6780 additions and 6392 deletions
+4 -4
View File
@@ -243,8 +243,8 @@ groups:
- >
contains_any_globs(files, [
'adev/**/{*,.*}',
'tools/manual_api_docs/blocks/**/*.md',
'tools/manual_api_docs/elements/**/*.md',
'tools/manual_api_docs/blocks/*.md',
'tools/manual_api_docs/elements/*.md',
])
reviewers:
users:
@@ -299,8 +299,8 @@ groups:
- >
contains_any_globs(files
.exclude('.pullapprove.yml')
.exclude('tools/manual_api_docs/blocks/**/*.md')
.exclude('tools/manual_api_docs/elements/**/*.md'),
.exclude('tools/manual_api_docs/blocks/*.md')
.exclude('tools/manual_api_docs/elements/*.md'),
[
'{*,.*}',
'.agent/**/{*,.*}',
+25
View File
@@ -1,3 +1,28 @@
<a name="21.2.4"></a>
# 21.2.4 (2026-03-12)
### compiler
| Commit | Type | Description |
| -- | -- | -- |
| [ed2d324f9c](https://github.com/angular/angular/commit/ed2d324f9cc12aab6cfa0569ef10b73243a62c65) | fix | disallow translations of iframe src |
### core
| Commit | Type | Description |
| -- | -- | -- |
| [abbd8797bb](https://github.com/angular/angular/commit/abbd8797bbd3ae53a10033c39bd895b5b85a4fae) | fix | reverts "feat(core): add support for nested animations" |
| [d1dcd16c5b](https://github.com/angular/angular/commit/d1dcd16c5b40291aa3fa2dc84d22842cd657b201) | fix | sanitize translated form attributes |
<!-- CHANGELOG SPLIT MARKER -->
<a name="21.2.3"></a>
# 21.2.3 (2026-03-11)
### core
| Commit | Type | Description |
| -- | -- | -- |
| [62a97f7e4b](https://github.com/angular/angular/commit/62a97f7e4b896b4b03a1ef25764db387ffecebe1) | fix | ensure definitions compile |
| [21b1c3b2ee](https://github.com/angular/angular/commit/21b1c3b2ee2c8423782b111b93bd60eb6b453259) | fix | include signal debug names in their `toString()` representation |
| [224e60ecb1](https://github.com/angular/angular/commit/224e60ecb1b90115baa702f1c06edc1d64d86187) | fix | sanitize translated attribute bindings with interpolations |
<!-- CHANGELOG SPLIT MARKER -->
<a name="21.2.2"></a>
# 21.2.2 (2026-03-09)
### compiler
+11 -11
View File
@@ -6,40 +6,40 @@ module(
bazel_dep(name = "rules_pkg", version = "1.2.0")
bazel_dep(name = "rules_nodejs", version = "6.7.3")
bazel_dep(name = "aspect_rules_ts", version = "3.8.5")
bazel_dep(name = "aspect_rules_js", version = "2.9.2")
bazel_dep(name = "aspect_rules_esbuild", version = "0.25.0")
bazel_dep(name = "aspect_rules_ts", version = "3.8.6")
bazel_dep(name = "aspect_rules_js", version = "3.0.3")
bazel_dep(name = "aspect_rules_esbuild", version = "0.25.1")
bazel_dep(name = "aspect_rules_jasmine", version = "2.0.4")
bazel_dep(name = "aspect_rules_rollup", version = "2.0.1")
bazel_dep(name = "bazel_skylib", version = "1.9.0")
bazel_dep(name = "aspect_bazel_lib", version = "2.22.5")
bazel_dep(name = "bazel_lib", version = "3.2.2")
bazel_dep(name = "tar.bzl", version = "0.9.0")
bazel_dep(name = "yq.bzl", version = "0.3.5")
bazel_dep(name = "rules_angular")
git_override(
module_name = "rules_angular",
commit = "d746c4f75e42cffe389d1ab077f4639be2bc78d1",
commit = "804515937593ca742f5f119a20774f55a08e70ad",
remote = "https://github.com/angular/rules_angular.git",
)
bazel_dep(name = "devinfra")
git_override(
module_name = "devinfra",
commit = "e4dcda13e469f50a6bd92667e2ded8b98173bf2c",
commit = "491fa7fc1803683748875b2b89d85700aca2b1f4",
remote = "https://github.com/angular/dev-infra.git",
)
bazel_dep(name = "rules_sass")
git_override(
module_name = "rules_sass",
commit = "1184a80751a21af8348f308abc5b38a41f26850e",
commit = "781c41bf7a48147bb20103e250f7215475e915a1",
remote = "https://github.com/angular/rules_sass.git",
)
bazel_dep(name = "rules_browsers")
git_override(
module_name = "rules_browsers",
commit = "8231142fc5516323b040883bf774ba8362645387",
commit = "7043f918640169063a6281ab4afb61389a0aad6d",
remote = "https://github.com/angular/rules_browsers.git",
)
@@ -71,8 +71,8 @@ use_repo(node, "nodejs_windows_amd64")
pnpm = use_extension("@aspect_rules_js//npm:extensions.bzl", "pnpm")
pnpm.pnpm(
name = "pnpm",
pnpm_version = "10.30.3",
pnpm_version_integrity = "sha512-yWHR4KLY41TsqlFmuCJRZmi39Ey1vZUSLVkN2Bki9gb1RzttI+xKW+Bef80Y6EiNR9l4u+mBhy8RRdBumnQAFw==",
pnpm_version = "10.32.0",
pnpm_version_integrity = "sha512-myY0uz/tVgHDNjPy2SWT9QYnCjljuMUdKy1qgo2mFc5One6++WFMzrvBOsjTwPnJzM61g8achXhDb6R327INcA==",
)
use_repo(pnpm, "pnpm")
@@ -117,7 +117,7 @@ use_repo(npm, "npm")
rules_ts_ext = use_extension("@aspect_rules_ts//ts:extensions.bzl", "ext")
rules_ts_ext.deps(
name = "angular_npm_typescript",
# Obtained by: curl --silent https://registry.npmjs.org/typescript/5.9.3 | jq -r '.dist.integrity'
# Obtained by: curl --silent https://registry.npmjs.org/typescript/6.0.1-rc | jq -r '.dist.integrity'
ts_integrity = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
ts_version = "5.9.3",
)
+61 -200
View File
@@ -13,7 +13,6 @@
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.0.0/MODULE.bazel": "e118477db5c49419a88d78ebc7a2c2cea9d49600fe0f490c1903324a2c16ecd9",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.11.0/MODULE.bazel": "cb1ba9f9999ed0bc08600c221f532c1ddd8d217686b32ba7d45b0713b5131452",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.14.0/MODULE.bazel": "2b31ffcc9bdc8295b2167e07a757dbbc9ac8906e7028e5170a3708cecaac119f",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.19.2/MODULE.bazel": "30dfabbfae0139b1f0036e01c201dd4c0167da3017f0b7ef3820d78e07622989",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.19.3/MODULE.bazel": "253d739ba126f62a5767d832765b12b59e9f8d2bc88cc1572f4a73e46eb298ca",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.5/MODULE.bazel": "004ba890363d05372a97248c37205ae64b6fa31047629cd2c0895a9d0c7779e8",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.5/source.json": "ac2c3213df8f985785f1d0aeb7f0f73d5324e6e67d593d9b9470fb74a25d4a9b",
@@ -21,20 +20,21 @@
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "812d2dd42f65dca362152101fbec418029cc8fd34cbad1a2fde905383d705838",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.9.3/MODULE.bazel": "66baf724dbae7aff4787bf2245cc188d50cb08e07789769730151c0943587c14",
"https://bcr.bazel.build/modules/aspect_rules_esbuild/0.25.0/MODULE.bazel": "5fef5ec709c837312823f9bcf0f276661e2cb48ad52f17c4e01176bbf1e9bf58",
"https://bcr.bazel.build/modules/aspect_rules_esbuild/0.25.0/source.json": "5e42968c6d23ab8bd95c02634b16864d866334347827cb6a8425b86c11cc4363",
"https://bcr.bazel.build/modules/aspect_rules_esbuild/0.25.1/MODULE.bazel": "9b931b3e483bd8eedb6966bda6df07d801f70ccb4896231b4e5e711b5130f3aa",
"https://bcr.bazel.build/modules/aspect_rules_esbuild/0.25.1/source.json": "a0b72e23ed06113f3878cb635d586b4045ef37750983467af72fe0315c3a2fcd",
"https://bcr.bazel.build/modules/aspect_rules_jasmine/2.0.4/MODULE.bazel": "fbb819eb8b7e5d7f67fdd38f7cecb413e287594cd666ce192c72c8828527775a",
"https://bcr.bazel.build/modules/aspect_rules_jasmine/2.0.4/source.json": "81ffb708333cd98ec3c0b4cc004f4d5cf92a16914b5196a2892c45141bba7cff",
"https://bcr.bazel.build/modules/aspect_rules_js/2.0.0/MODULE.bazel": "b45b507574aa60a92796e3e13c195cd5744b3b8aff516a9c0cb5ae6a048161c5",
"https://bcr.bazel.build/modules/aspect_rules_js/2.4.2/MODULE.bazel": "0d01db38b96d25df7ed952a5e96eac4b3802723d146961974bf020f6dd07591d",
"https://bcr.bazel.build/modules/aspect_rules_js/2.6.2/MODULE.bazel": "ed2a871f4ab8fbde0cab67c425745069d84ea64b64313fa1a2954017326511f5",
"https://bcr.bazel.build/modules/aspect_rules_js/2.9.2/MODULE.bazel": "93fd5b85e6e912fb0712cbab453c43271d4ea33a093f84fd587638fbc9f8c145",
"https://bcr.bazel.build/modules/aspect_rules_js/2.9.2/source.json": "4bff7c03ab387b60deb15649ba575688e62f2a71a7544cbc7a660b19ec473808",
"https://bcr.bazel.build/modules/aspect_rules_js/3.0.2/MODULE.bazel": "c5d22d2db2a2f0cf41ec2028ded2e2543d7ff1ea9f6faf5d6b2791546ee1d6a9",
"https://bcr.bazel.build/modules/aspect_rules_js/3.0.3/MODULE.bazel": "28a30e8fc33bf64a67835d64d124f6e05a7d59648dcb27b110fb3502f761e503",
"https://bcr.bazel.build/modules/aspect_rules_js/3.0.3/source.json": "bb8fff9a304452e1042af9522ad1d54d6f1d1fdf71c5127deadb6fd156654193",
"https://bcr.bazel.build/modules/aspect_rules_rollup/2.0.1/MODULE.bazel": "296e3a053658c2af989ba9bd62a205e6d1fa84bdd6dd5249196546e6b84770ec",
"https://bcr.bazel.build/modules/aspect_rules_rollup/2.0.1/source.json": "2fe8ac1ccb4de74bf884761e070010280b272d94e3997205b361b91c75409726",
"https://bcr.bazel.build/modules/aspect_rules_ts/3.6.3/MODULE.bazel": "d09db394970f076176ce7bab5b5fa7f0d560fd4f30b8432ea5e2c2570505b130",
"https://bcr.bazel.build/modules/aspect_rules_ts/3.7.0/MODULE.bazel": "5aace216caf88638950ef061245d23c36f57c8359e56e97f02a36f70bb09c50f",
"https://bcr.bazel.build/modules/aspect_rules_ts/3.8.5/MODULE.bazel": "bcf8f0b6b9375f0f74451e2f70671efae9bb366acef8fdc04675305eaf137f06",
"https://bcr.bazel.build/modules/aspect_rules_ts/3.8.5/source.json": "fa35e43f6359f654e4b70ce55efdf280d0b06c0b3ef9fc0b06ba52327a0e6311",
"https://bcr.bazel.build/modules/aspect_rules_ts/3.8.6/MODULE.bazel": "371bacab13c9c36323384b56c7cabfde1982b69674e78729e1ddd1edd54d984e",
"https://bcr.bazel.build/modules/aspect_rules_ts/3.8.6/source.json": "b87a583fa2aa5c546221e3c514c883b2344c9284f27347759a5ff700deceb012",
"https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.3/MODULE.bazel": "20f53b145f40957a51077ae90b37b7ce83582a1daf9350349f0f86179e19dd0d",
"https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.6/MODULE.bazel": "cafb8781ad591bc57cc765dca5fefab08cf9f65af363d162b79d49205c7f8af7",
"https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.8/MODULE.bazel": "aa975a83e72bcaac62ee61ab12b788ea324a1d05c4aab28aadb202f647881679",
@@ -51,13 +51,15 @@
"https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87",
"https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e",
"https://bcr.bazel.build/modules/bazel_features/1.39.0/MODULE.bazel": "28739425c1fc283c91931619749c832b555e60bcd1010b40d8441ce0a5cf726d",
"https://bcr.bazel.build/modules/bazel_features/1.39.0/source.json": "f63cbeb4c602098484d57001e5a07d31cb02bbccde9b5e2c9bf0b29d05283e93",
"https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7",
"https://bcr.bazel.build/modules/bazel_features/1.41.0/MODULE.bazel": "6e0f87fafed801273c371d41e22a15a6f8abf83fdd7f87d5e44ad317b94433d0",
"https://bcr.bazel.build/modules/bazel_features/1.41.0/source.json": "8fd525b31b0883c47e0593443cdd10219b94a7556b3195fc02d75c86c66cfe30",
"https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b",
"https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a",
"https://bcr.bazel.build/modules/bazel_lib/3.0.0-beta.1/MODULE.bazel": "407729e232f611c3270005b016b437005daa7b1505826798ea584169a476e878",
"https://bcr.bazel.build/modules/bazel_lib/3.0.0-rc.0/MODULE.bazel": "d6e00979a98ac14ada5e31c8794708b41434d461e7e7ca39b59b765e6d233b18",
"https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d",
"https://bcr.bazel.build/modules/bazel_lib/3.0.0/source.json": "895f21909c6fba01d7c17914bb6c8e135982275a1b18cdaa4e62272217ef1751",
"https://bcr.bazel.build/modules/bazel_lib/3.2.2/MODULE.bazel": "e2c890c8a515d6bca9c66d47718aa9e44b458fde64ec7204b8030bf2d349058c",
"https://bcr.bazel.build/modules/bazel_lib/3.2.2/source.json": "9e84e115c20e14652c5c21401ae85ff4daa8702e265b5c0b3bf89353f17aa212",
"https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8",
"https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e",
"https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686",
@@ -85,7 +87,8 @@
"https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/source.json": "41e9e129f80d8c8bf103a7acc337b76e54fad1214ac0a7084bf24f4cd924b8b4",
"https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f",
"https://bcr.bazel.build/modules/jq.bzl/0.1.0/MODULE.bazel": "2ce69b1af49952cd4121a9c3055faa679e748ce774c7f1fda9657f936cae902f",
"https://bcr.bazel.build/modules/jq.bzl/0.1.0/source.json": "746bf13cac0860f091df5e4911d0c593971cd8796b5ad4e809b2f8e133eee3d5",
"https://bcr.bazel.build/modules/jq.bzl/0.4.0/MODULE.bazel": "a7b39b37589f2b0dad53fd6c1ccaabbdb290330caa920d7ef3e6aad068cd4ab2",
"https://bcr.bazel.build/modules/jq.bzl/0.4.0/source.json": "52ec7530c4618e03f634b30ff719814a68d7d39c235938b7aa2abbfe1eb1c52c",
"https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075",
"https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d",
"https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902",
@@ -108,6 +111,7 @@
"https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e",
"https://bcr.bazel.build/modules/protobuf/29.0/source.json": "b857f93c796750eef95f0d61ee378f3420d00ee1dd38627b27193aa482f4f981",
"https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0",
"https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858",
"https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e",
"https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022",
"https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206",
@@ -162,9 +166,7 @@
"https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb",
"https://bcr.bazel.build/modules/rules_nodejs/6.2.0/MODULE.bazel": "ec27907f55eb34705adb4e8257952162a2d4c3ed0f0b3b4c3c1aad1fac7be35e",
"https://bcr.bazel.build/modules/rules_nodejs/6.3.0/MODULE.bazel": "45345e4aba35dd6e4701c1eebf5a4e67af4ed708def9ebcdc6027585b34ee52d",
"https://bcr.bazel.build/modules/rules_nodejs/6.3.3/MODULE.bazel": "b66eadebd10f1f1b25f52f95ab5213a57e82c37c3f656fcd9a57ad04d2264ce7",
"https://bcr.bazel.build/modules/rules_nodejs/6.5.0/MODULE.bazel": "546d0cf79f36f9f6e080816045f97234b071c205f4542e3351bd4424282a8810",
"https://bcr.bazel.build/modules/rules_nodejs/6.5.2/MODULE.bazel": "7f9ea68a0ce6d82905ce9f74e76ab8a8b4531ed4c747018c9d76424ad0b3370d",
"https://bcr.bazel.build/modules/rules_nodejs/6.7.3/MODULE.bazel": "c22a48b2a0dbf05a9dc5f83837bbc24c226c1f6e618de3c3a610044c9f336056",
"https://bcr.bazel.build/modules/rules_nodejs/6.7.3/source.json": "a3f966f4415a8a6545e560ee5449eac95cc633f96429d08e87c87775c72f5e09",
"https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc",
@@ -200,6 +202,7 @@
"https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216",
"https://bcr.bazel.build/modules/tar.bzl/0.2.1/MODULE.bazel": "52d1c00a80a8cc67acbd01649e83d8dd6a9dc426a6c0b754a04fe8c219c76468",
"https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351",
"https://bcr.bazel.build/modules/tar.bzl/0.6.0/MODULE.bazel": "a3584b4edcfafcabd9b0ef9819808f05b372957bbdff41601429d5fd0aac2e7c",
"https://bcr.bazel.build/modules/tar.bzl/0.9.0/MODULE.bazel": "452a22d7f02b1c9d7a22ab25edf20f46f3e1101f0f67dc4bfbf9a474ddf02445",
"https://bcr.bazel.build/modules/tar.bzl/0.9.0/source.json": "c732760a374831a2cf5b08839e4be75017196b4d796a5aa55235272ee17cd839",
"https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43",
@@ -209,6 +212,7 @@
"https://bcr.bazel.build/modules/yq.bzl/0.3.5/MODULE.bazel": "130c603e54be717bdf84100210f06598a0d2b4b4e01888fb01b70f50f41767ec",
"https://bcr.bazel.build/modules/yq.bzl/0.3.5/source.json": "1ae7bdc03cb26aaa8bd2bceadf65e90d90f0b2d03008ba9a0564da2e21396c39",
"https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0",
"https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27",
"https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca",
"https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806",
"https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198"
@@ -217,8 +221,8 @@
"moduleExtensions": {
"@@aspect_rules_esbuild+//esbuild:extensions.bzl%esbuild": {
"general": {
"bzlTransitiveDigest": "fzdwsWU1Px4bYL57Cw1rvU/mgOqB7f0AF51JxT5kAs8=",
"usagesDigest": "ToTaCONCN/E05krnHXLM1kpV1zrHNxHrGpUip973II4=",
"bzlTransitiveDigest": "GnYkDpVOnWnYv+xwyhEi0qjk3Lvp4Wei30PeSIQF5vM=",
"usagesDigest": "6We6zwGoawD9YXqMI0KPaxEKJTnamXBsuOekhFS2D40=",
"recordedFileInputs": {},
"recordedDirentsInputs": {},
"envVariables": {},
@@ -273,11 +277,11 @@
"npm__esbuild_0.19.9": {
"repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_rule",
"attributes": {
"key": "npm__esbuild_0.19.9",
"package": "esbuild",
"version": "0.19.9",
"root_package": "",
"link_workspace": "",
"link_packages": {},
"integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==",
"url": "",
"commit": "",
@@ -292,20 +296,23 @@
"npm_auth_password": "",
"lifecycle_hooks": [],
"extra_build_content": "",
"generate_package_json_bzl": false,
"generate_bzl_library_targets": false,
"extract_full_archive": false,
"exclude_package_contents": []
"exclude_package_contents": [],
"exclude_package_contents_presets": []
}
},
"npm__esbuild_0.19.9__links": {
"repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_links",
"repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_links_rule",
"attributes": {
"key": "npm__esbuild_0.19.9",
"package": "esbuild",
"version": "0.19.9",
"dev": false,
"root_package": "",
"link_packages": {},
"deps": {},
"deps_oss": {},
"deps_cpus": {},
"transitive_closure": {},
"lifecycle_build_target": false,
"lifecycle_hooks_env": [],
@@ -318,31 +325,12 @@
"//visibility:public"
],
"replace_package": "",
"exclude_package_contents": []
"exclude_package_contents": [],
"exclude_package_contents_presets": []
}
}
},
"recordedRepoMappingEntries": [
[
"aspect_bazel_lib+",
"bazel_lib",
"bazel_lib+"
],
[
"aspect_bazel_lib+",
"bazel_skylib",
"bazel_skylib+"
],
[
"aspect_bazel_lib+",
"bazel_tools",
"bazel_tools"
],
[
"aspect_bazel_lib+",
"tar.bzl",
"tar.bzl+"
],
[
"aspect_rules_esbuild+",
"aspect_rules_js",
@@ -358,150 +346,6 @@
"bazel_skylib",
"bazel_skylib+"
],
[
"aspect_rules_js+",
"aspect_bazel_lib",
"aspect_bazel_lib+"
],
[
"aspect_rules_js+",
"aspect_rules_js",
"aspect_rules_js+"
],
[
"aspect_rules_js+",
"aspect_tools_telemetry_report",
"aspect_tools_telemetry++telemetry+aspect_tools_telemetry_report"
],
[
"aspect_rules_js+",
"bazel_lib",
"bazel_lib+"
],
[
"aspect_rules_js+",
"bazel_skylib",
"bazel_skylib+"
],
[
"aspect_rules_js+",
"bazel_tools",
"bazel_tools"
],
[
"bazel_lib+",
"bazel_skylib",
"bazel_skylib+"
],
[
"bazel_lib+",
"bazel_tools",
"bazel_tools"
],
[
"tar.bzl+",
"bazel_lib",
"bazel_lib+"
],
[
"tar.bzl+",
"bazel_skylib",
"bazel_skylib+"
],
[
"tar.bzl+",
"tar.bzl",
"tar.bzl+"
]
]
}
},
"@@aspect_rules_js+//npm:extensions.bzl%pnpm": {
"general": {
"bzlTransitiveDigest": "9Zmqluz9ltvCoc6pskOslTkQpkH6CIINjWVkgam9aa4=",
"usagesDigest": "k3HnPWCDfdjPprODR4rLNwRc8pEk4QMKpK9YbIwIkkk=",
"recordedFileInputs": {},
"recordedDirentsInputs": {},
"envVariables": {},
"generatedRepoSpecs": {
"pnpm": {
"repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_rule",
"attributes": {
"package": "pnpm",
"version": "10.30.3",
"root_package": "",
"link_workspace": "",
"link_packages": {},
"integrity": "sha512-yWHR4KLY41TsqlFmuCJRZmi39Ey1vZUSLVkN2Bki9gb1RzttI+xKW+Bef80Y6EiNR9l4u+mBhy8RRdBumnQAFw==",
"url": "",
"commit": "",
"patch_args": [
"-p0"
],
"patches": [],
"custom_postinstall": "",
"npm_auth": "",
"npm_auth_basic": "",
"npm_auth_username": "",
"npm_auth_password": "",
"lifecycle_hooks": [],
"extra_build_content": "load(\"@aspect_rules_js//js:defs.bzl\", \"js_binary\")\njs_binary(name = \"pnpm\", data = glob([\"package/**\"]), entry_point = \"package/dist/pnpm.cjs\", visibility = [\"//visibility:public\"])",
"generate_bzl_library_targets": false,
"extract_full_archive": true,
"exclude_package_contents": []
}
},
"pnpm__links": {
"repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_links",
"attributes": {
"package": "pnpm",
"version": "10.30.3",
"dev": false,
"root_package": "",
"link_packages": {},
"deps": {},
"transitive_closure": {},
"lifecycle_build_target": false,
"lifecycle_hooks_env": [],
"lifecycle_hooks_execution_requirements": [
"no-sandbox"
],
"lifecycle_hooks_use_default_shell_env": false,
"bins": {},
"package_visibility": [
"//visibility:public"
],
"replace_package": "",
"exclude_package_contents": []
}
}
},
"recordedRepoMappingEntries": [
[
"aspect_bazel_lib+",
"bazel_lib",
"bazel_lib+"
],
[
"aspect_bazel_lib+",
"bazel_skylib",
"bazel_skylib+"
],
[
"aspect_bazel_lib+",
"bazel_tools",
"bazel_tools"
],
[
"aspect_bazel_lib+",
"tar.bzl",
"tar.bzl+"
],
[
"aspect_rules_js+",
"aspect_bazel_lib",
"aspect_bazel_lib+"
],
[
"aspect_rules_js+",
"aspect_rules_js",
@@ -532,6 +376,16 @@
"bazel_tools",
"bazel_tools"
],
[
"aspect_rules_js+",
"protobuf",
"protobuf+"
],
[
"aspect_rules_js+",
"tar.bzl",
"tar.bzl+"
],
[
"bazel_features+",
"bazel_features_globals",
@@ -542,6 +396,11 @@
"bazel_features_version",
"bazel_features++version_extension+bazel_features_version"
],
[
"bazel_lib+",
"bazel_lib",
"bazel_lib+"
],
[
"bazel_lib+",
"bazel_skylib",
@@ -552,6 +411,11 @@
"bazel_tools",
"bazel_tools"
],
[
"protobuf+",
"proto_bazel_features",
"bazel_features+"
],
[
"tar.bzl+",
"bazel_lib",
@@ -572,11 +436,9 @@
},
"@@aspect_rules_ts+//ts:extensions.bzl%ext": {
"general": {
"bzlTransitiveDigest": "6NyLUdrb79stFKm8oWIBK2q65cT5Upbr8IR2Qwsywu8=",
"usagesDigest": "ZXlhH7TrNEERA0ibuRRxAjYv2fVuXoFGNd3v+0UK1/g=",
"recordedFileInputs": {
"@@rules_browsers+//package.json": "772d873d450a539e2133635aeb5e63744cf1cec86e6b37aeecd9267a147fb0d7"
},
"bzlTransitiveDigest": "0PprNyRYWkfOXKNvI8gaaD69N+xwJfjp1B9PAbgTdTI=",
"usagesDigest": "5Eyb0Kvg0CG7XCiKJ/v4cA5Rl7qXRtsRk7ZmepukdzQ=",
"recordedFileInputs": {},
"recordedDirentsInputs": {},
"envVariables": {},
"generatedRepoSpecs": {
@@ -613,9 +475,8 @@
"npm_rules_browsers_typescript": {
"repoRuleId": "@@aspect_rules_ts+//ts/private:npm_repositories.bzl%http_archive_version",
"attributes": {
"version": "",
"version_from": "@@rules_browsers+//:package.json",
"integrity": "",
"version": "5.8.2",
"integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
"urls": [
"https://registry.npmjs.org/typescript/-/typescript-{}.tgz"
]
@@ -639,7 +500,7 @@
"@@aspect_tools_telemetry+//:extension.bzl%telemetry": {
"general": {
"bzlTransitiveDigest": "cl5A2O84vDL6Tt+Qga8FCj1DUDGqn+e7ly5rZ+4xvcc=",
"usagesDigest": "fkarigrHiiNAt/BwClRuO51QOEo6226baK6LoK/IWdU=",
"usagesDigest": "X9yWxTU9a+3PzHfKcQZZ8MzjmhcZcGinXvd3iA1e0Dw=",
"recordedFileInputs": {},
"recordedDirentsInputs": {},
"envVariables": {},
@@ -648,9 +509,9 @@
"repoRuleId": "@@aspect_tools_telemetry+//:extension.bzl%tel_repository",
"attributes": {
"deps": {
"aspect_rules_ts": "3.8.5",
"aspect_rules_js": "2.9.2",
"aspect_rules_esbuild": "0.25.0",
"aspect_rules_ts": "3.8.6",
"aspect_rules_js": "3.0.3",
"aspect_rules_esbuild": "0.25.1",
"aspect_rules_jasmine": "2.0.4",
"aspect_tools_telemetry": "0.3.3"
}
@@ -1093,7 +954,7 @@
"@@rules_nodejs+//nodejs:extensions.bzl%node": {
"general": {
"bzlTransitiveDigest": "4pUxCNc22K4I+6+4Nxu52Hur12tFRfa1JMsN5mdDv60=",
"usagesDigest": "pjXeuItYQffkhMcQv+aU/G0SB0QAmyOC9W7iq63eW08=",
"usagesDigest": "b5S0m/ld5GaUSiR4bWVkvCiiWcK33vg+ynakv0PZl+o=",
"recordedFileInputs": {},
"recordedDirentsInputs": {},
"envVariables": {},
@@ -1514,7 +1375,7 @@
},
"@@rules_python+//python/extensions:pip.bzl%pip": {
"general": {
"bzlTransitiveDigest": "LFkevJ0u48WgTVCyU07LkRD8iYwsRUs2M7uSFHkQAW0=",
"bzlTransitiveDigest": "WViZ5k1A9F8R5wfEe2ArLMFS1g9UmgfbS8Q/7q1/z7o=",
"usagesDigest": "/9NP3RV6/DWuNdYAsIU/8UCgCX0TdPUJr0X6O+0lrtk=",
"recordedFileInputs": {
"@@protobuf+//python/requirements.txt": "983be60d3cec4b319dcab6d48aeb3f5b2f7c3350f26b3a9e97486c37967c73c5",
@@ -4309,7 +4170,7 @@
"@@yq.bzl+//yq:extensions.bzl%yq": {
"general": {
"bzlTransitiveDigest": "UfFMy8CWK4/dVo/tfaSAIYUiDGNAPes5eRllx9O9Q9Q=",
"usagesDigest": "LPHUB1lzZAsPKLeNh6HnzS3+5eXDr8A5CKmoD+VBOA4=",
"usagesDigest": "263D9xYtKhXWWCVTxT66bpT89HuZpdkB1AqEir45vbY=",
"recordedFileInputs": {},
"recordedDirentsInputs": {},
"envVariables": {},
+2 -2
View File
@@ -1,6 +1,6 @@
load("@aspect_bazel_lib//lib:copy_to_bin.bzl", _copy_to_bin = "copy_to_bin")
load("@aspect_bazel_lib//lib:copy_to_directory.bzl", _copy_to_directory = "copy_to_directory")
load("@aspect_rules_esbuild//esbuild:defs.bzl", _esbuild = "esbuild")
load("@bazel_lib//lib:copy_to_bin.bzl", _copy_to_bin = "copy_to_bin")
load("@bazel_lib//lib:copy_to_directory.bzl", _copy_to_directory = "copy_to_directory")
load("@devinfra//bazel/private:path_relative_to_label.bzl", _path_relative_to_label = "path_relative_to_label")
load(
"//tools:defaults.bzl",
@@ -43,15 +43,6 @@ describe('ClickOutside', () => {
expect(clickedOutsideSpy).not.toHaveBeenCalled();
});
it('should not docsClickOutside be emitted when user click inside `content` element', () => {
const clickedOutsideSpy = spyOn(component, 'clickedOutside');
const button = fixture.debugElement.query(By.css('button[id="ignoreThisButton"]'));
button.nativeElement.click();
expect(clickedOutsideSpy).not.toHaveBeenCalled();
});
});
@Component({
@@ -11,7 +11,7 @@ import {chromium} from 'playwright-core';
import {Mermaid, MermaidConfig} from 'mermaid';
import {resolve, join} from 'path';
const runfilesDir = process.env['RUNFILES']!;
const runfilesDir = process.env['JS_BINARY__RUNFILES']!;
// Declare mermarid in the context of this file so that typescript doesn't get upset when we
// access it within the `page.evaluate` function. At runtime the context in with the method
// is run difference than this file, but this makes typescript happy.
@@ -100,7 +100,6 @@
&.adev-nav-primary--next,
&.adev-nav-primary--rc {
// change nav background to indicate this is the rc docs
position: relative;
background: linear-gradient(
140deg,
color-mix(in srgb, var(--orange-red), transparent 60%) 0%,
@@ -116,6 +115,7 @@
width: 100%;
height: 100%;
background-color: var(--octonary-contrast);
z-index: -1;
}
.adev-version-button {
border: 1px solid var(--quinary-contrast);
@@ -1,13 +1,12 @@
<!-- #docplaster -->
<h2><code>animate.leave</code> Parent Sub-tree No Animation Example</h2>
<h2><code>animate.leave</code> Parent Sub-tree Animation Example</h2>
<button type="button" class="toggle-btn" (click)="toggle()">Toggle Element</button>
@if (isShown()) {
<!-- the child node with `animate.leave` will not animate out because the
parent node removal happens first and will take the child dom tree
with it. -->
<div class="leave-parent">
<!-- the child node with `animate.leave` will animate first
before the parent node is removed from the DOM. -->
<div class="leave-container" animate.leave="leaving">
<p>Goodbye</p>
</div>
@@ -27,7 +27,6 @@
aria-hidden="true"
class="material-symbols-outlined selected-icon"
translate="no"
aria-hidden="true"
>check</span
>
</li>
@@ -55,9 +55,9 @@ NOTE: When using multiple keyframe animations or transition properties on an ele
<docs-code header="leave-binding.css" path="adev/src/content/examples/animations/src/app/enter-and-leave/leave-binding.css"/>
</docs-code-multifile>
### Element removal order matters
### Element removal order
There is some nuance to how `animate.leave` animations are run and when an animation will occur. `animate.leave` works if it is placed on the element that is being removed. However, `animate.leave` will **not** animate if it is on an element that is a _descendent_ of the element being removed. This is because when a parent node is removed, it takes the entire sub tree with it, and since there are no animations on that parent node, it will be removed immediately. This means there's no element to animate away with `animate.leave`. You will need to consider this in your usage of `animate.leave`.
There is some nuance to how `animate.leave` animations are run and when an animation will occur. `animate.leave` works if it is placed on the element that is being removed, and if `animate.leave` is placed on an element that is a _descendent_ of the element being removed, those child animations will happen _before_ the parent node is removed from the DOM. This ensures that you can confidently animate away child elements without the parent node disappearing prematurely.
<docs-code-multifile preview path="adev/src/content/examples/animations/src/app/enter-and-leave/leave-parent.ts">
<docs-code header="leave.ts" path="adev/src/content/examples/animations/src/app/enter-and-leave/leave-parent.ts" />
@@ -379,6 +379,26 @@ The `@for` block iterates over each form control instance provided by the aliase
Each time a new alias instance is added, the new form array instance is provided its control based on the index. This lets you track each individual control when calculating the status and value of the root control.
NOTE: In zoneless applications, mutating a reactive forms model (for example calling `FormArray.push()`) does not automatically schedule component change detection. If your template depends on structural model changes such as `aliases.controls`, make sure the component notifies Angular to run change detection, for example by bridging a forms observable to `ChangeDetectorRef.markForCheck()`:
```ts
import {ChangeDetectorRef, Component, inject} from '@angular/core';
import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
@Component({
/* ... */
})
export class ProfileEditor {
private readonly cdr = inject(ChangeDetectorRef);
constructor() {
this.profileForm.valueChanges
.pipe(takeUntilDestroyed())
.subscribe(() => this.cdr.markForCheck());
}
}
```
</docs-step>
### Using `FormArrayDirective` for top-level form arrays
+2 -2
View File
@@ -1,4 +1,4 @@
# Binding dynamic text, properties and attributes
# Binding dynamic text, properties and attributes
In Angular, a **binding** creates a dynamic connection between a component's template and its data. This connection ensures that changes to the component's data automatically update the rendered template.
@@ -244,7 +244,7 @@ The above example renders the following DOM.
<section style="border: 1px solid black; font-weight: bold"> ... </section>
```
When binding `style` to an object, Angular compares the previous value to the current value with the triple-equals operator (`===`). You must create a new object instance when you modify these values in order to Angular to apply any updates.
When binding `style` to an object, Angular compares the previous value to the current value with the triple-equals operator (`===`). You must create a new object instance when you modify these values in order for Angular to apply any updates.
If an element has multiple bindings for the same style property, Angular resolves collisions by following its style precedence order.
@@ -1,4 +1,4 @@
# Grouping elements with ng-container
# Grouping elements with ng-container
`<ng-container>` is a special element in Angular that groups multiple elements together or marks a location in a template without rendering a real element in the DOM.
@@ -71,11 +71,11 @@ export class UserProfile {
In the example above, the `ngTemplateOutlet` directive dynamically renders one of two template fragments in the location of the `<ng-container>` element.
For more information regarding NgTemplateOutlet, see the [NgTemplateOutlets API documentation page](/api/common/NgTemplateOutlet).
For more information regarding `NgTemplateOutlet`, see the [NgTemplateOutlet API documentation page](/api/common/NgTemplateOutlet).
## Using `<ng-container>` with structural directives
You can also apply structural directives to `<ng-container>` elements. Common examples of this include `ngIf`and `ngFor`.
You can also apply structural directives to `<ng-container>` elements. Common examples of this include `ngIf` and `ngFor`.
```angular-html
<ng-container *ngIf="permissions == 'admin'">
@@ -86,6 +86,7 @@ Now, if your coverage drops below 80% when you run your tests, the command will
You can configure several other coverage options in your `angular.json` file:
- `coverageInclude`: Glob patterns of files to include in the coverage report.
- `coverageExclude`: Glob patterns of files to exclude in the coverage report.
- `coverageReporters`: An array of reporters to use (e.g., `html`, `lcov`, `json`).
- `coverageWatermarks`: An object specifying `[low, high]` watermarks for the HTML reporter, which can affect the color-coding of the report.
@@ -227,7 +227,7 @@ If you set `runnerConfig` to `true`, the builder will automatically search for a
## `zone.js` based helpers are not supported
The zone.js patches are not applied when running tests with Vitest, there for you won't be able use functions like `fakeAsync`, `flush` or `waitForAsync`.
The zone.js patches are not applied when running tests with Vitest, therefore you won't be able to use functions like `fakeAsync`, `flush` or `waitForAsync`.
To migrate to Vitest you will also need to migrate your tests to native async and Vitest fake timers. See [an example here](/guide/testing/components-scenarios#async-test-with-a-vitest-fake-timers) for fake timers usages with Vitest.
## Bug reports
+6
View File
@@ -123,6 +123,12 @@ readonly myObservableState = someObservable.pipe(pendingUntilEvent());
The framework uses this service internally as well to prevent serialization until asynchronous tasks are complete. These include, but are not limited to,
an ongoing Router navigation and an incomplete `HttpClient` request.
### Reactive forms in zoneless applications
Reactive forms model updates (`setValue`, `patchValue`, `FormArray.push`, and similar APIs) update form state and emit forms observables, but they do not automatically schedule component change detection.
If a template depends on reactive forms state, connect forms observables to a change-detection notification (for example `ChangeDetectorRef.markForCheck()`), or reflect the data through signals consumed by the template.
## Testing and Debugging
### Using Zoneless in `TestBed`
@@ -249,13 +249,13 @@
}
},
"node_modules/@angular-devkit/architect": {
"version": "0.2102.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.0.tgz",
"integrity": "sha512-kYFwTNzToG2SJMxj2f41w3QRtdqlrFuF+bpZrtIaHOP078Ktld8EPIp9KqB0Y46Vvs69ifby5Q1/wPD9wA3iaw==",
"version": "0.2102.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.1.tgz",
"integrity": "sha512-x2Qqz6oLYvEh9UBUG0AP1A4zROO/VP+k+zM9+4c2uZw1uqoBQFmutqgzncjVU7cR9R0RApgx9JRZHDFtQru68w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"rxjs": "7.8.2"
},
"bin": {
@@ -268,9 +268,9 @@
}
},
"node_modules/@angular-devkit/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.0.tgz",
"integrity": "sha512-HZdTn46Ca6qbb9Zef8R/+TWsk6mNKRm4rJyL3PxHP6HnVCwSPNZ0LNN9BjVREBs+UlRdXqBGFBZh5D1nBgu5GQ==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.1.tgz",
"integrity": "sha512-TpXGjERqVPN8EPt7LdmWAwh0oNQ/6uWFutzGZiXhJy81n1zb1O1XrqhRAmvP1cAo5O+na6IV2JkkCmxL6F8GUg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -296,13 +296,13 @@
}
},
"node_modules/@angular-devkit/schematics": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.0.tgz",
"integrity": "sha512-3kn3FI5v7BQ7Zct6raek+WgvyDwOJ8wElbyC903GxMQCDBRGGcevhHvTAIHhknihEsrgplzPhTlWeMbk1JfdFg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.1.tgz",
"integrity": "sha512-CWoamHaasAHMjHcYqxbj0tMnoXxdGotcAz2SpiuWtH28Lnf5xfbTaJn/lwdMP8Wdh4tgA+uYh2l45A5auCwmkw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.21",
"ora": "9.3.0",
@@ -315,14 +315,14 @@
}
},
"node_modules/@angular/build": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.0.tgz",
"integrity": "sha512-K0EqiHz2y7TSyD4adWD0+C/P9khKlrsSWavXWxGRvoSJC/H3I3SK5Z6BWwftBibXR1Fis7njwvl5IGAlQrDchA==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.1.tgz",
"integrity": "sha512-cUpLNHJp9taII/FOcJHHfQYlMcZSRaf6eIxgSNS6Xfx1CeGoJNDN+J8+GFk+H1CPJt1EvbfyZ+dE5DbsgTD/QQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/architect": "0.2102.1",
"@babel/core": "7.29.0",
"@babel/helper-annotate-as-pure": "7.27.3",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -365,7 +365,7 @@
"@angular/platform-browser": "^21.0.0",
"@angular/platform-server": "^21.0.0",
"@angular/service-worker": "^21.0.0",
"@angular/ssr": "^21.2.0",
"@angular/ssr": "^21.2.1",
"karma": "^6.4.0",
"less": "^4.2.0",
"ng-packagr": "^21.0.0",
@@ -415,19 +415,19 @@
}
},
"node_modules/@angular/cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.0.tgz",
"integrity": "sha512-yaGEpckqgOemcHkoWeH92i9eNrcbr9iE/dnxL+Du6s9spTAXJ2jjtYfszhmowuQZkCK5rjecMb8ctNtHlaGCjg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.1.tgz",
"integrity": "sha512-5SRfMTgwFj1zXOpfeZWHsxZBni0J4Xz7/CbewG47D6DmbstOrSdgt6eNzJ62R650t0G9dpri2YvToZgImtbjOQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/architect": "0.2102.1",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"@inquirer/prompts": "7.10.1",
"@listr2/prompt-adapter-inquirer": "3.0.5",
"@modelcontextprotocol/sdk": "1.26.0",
"@schematics/angular": "21.2.0",
"@schematics/angular": "21.2.1",
"@yarnpkg/lockfile": "1.1.0",
"algoliasearch": "5.48.1",
"ini": "6.0.0",
@@ -450,9 +450,9 @@
}
},
"node_modules/@angular/common": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.0.tgz",
"integrity": "sha512-6zJMPi0i/XDniEgv3/t2BjuDHiOG44lgIR5PYyxqGpgJ0kqB5hku/0TuentNEi1VnBYgthnfhjek7c+lakXmhw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.2.tgz",
"integrity": "sha512-xpVYV+MgqWzdjTCFxe3uJGpFOc84YrO4H4oX9HkzI5yQ5OLkQlndtq+OAUK8e330iacg4XHArft3SNDj1LaFfg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -461,14 +461,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/core": "21.2.0",
"@angular/core": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.0.tgz",
"integrity": "sha512-0RPkma8UVNpse/VJcXT9w6SKzTMz4J/uMGj0l9enM1frg9xrx1fwi/lLmaVV9Nr9LfqPjQdxNFFlvaBB7g/2zg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.2.tgz",
"integrity": "sha512-k7P0EH8I/Iwf2uRalSqhfokFbItTwdH7CmBJ7RKTRIH4FcrQcnqHetNKUMCOYXZtnlHIAnTpG+C+T4+6GTpYFg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -478,9 +478,9 @@
}
},
"node_modules/@angular/compiler-cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.0.tgz",
"integrity": "sha512-gZd58p0/JjgdxMX3v+LjCB6e3dBIfNVr/YzXoh55TfffdBCUQY94hl1+DFQkJ72K5EX+1zbaz03dIm30kw1bGw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.2.tgz",
"integrity": "sha512-TFg2wXUZ1FdUikNyR27PxuCXuqqlJhL6Mr/cBYuc4HbtBfgKw5FLffbI/iLubBEs55W5ApuYpBVuXKGoZp9SRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -501,7 +501,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"typescript": ">=5.9 <6.1"
},
"peerDependenciesMeta": {
@@ -511,9 +511,9 @@
}
},
"node_modules/@angular/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.0.tgz",
"integrity": "sha512-VnTbmZq3g3Q+s3nCZ8VUDMLjMezOg/bqUxAJ/DrRWCrEcTP5JO3mrNPs3FHj+qlB0T+BQP7uQv6QTzPVKybwoA==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.2.tgz",
"integrity": "sha512-ljiyiFjR6dgK27CNlOcMrjsDPYKFf2Rl89WLwGEGMOj0cJg/PSLQqpW/fbSkSB3SDgwG/WhXQ4Wrw525OKMupg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -522,7 +522,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0 || ~0.16.0"
},
@@ -536,9 +536,9 @@
}
},
"node_modules/@angular/forms": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.0.tgz",
"integrity": "sha512-NduUtPWLauH/FLayEDkLyaKAGqKzXbcfO7468LOWCXN3crhNVQyIWRQPOUcdpoJwDAGLpN85m3DhJhXNnA9c5w==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.2.tgz",
"integrity": "sha512-uiuL8uy4OpcbB0zRZ8TcvYXxe+GZC+XkCAptfrG+yAyzm4cOrqCilOZsMG6bVdOb2sjc2islk9CVDZZOju28/Q==",
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
@@ -548,16 +548,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/common": "21.2.0",
"@angular/core": "21.2.0",
"@angular/platform-browser": "21.2.0",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2",
"@angular/platform-browser": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/platform-browser": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.0.tgz",
"integrity": "sha512-IUGukpvvT2B5Dl76qzk6rY7UIHUT9u4BhT2AwVz+5JqcX9KwQtYD17Gt7wj6bvIgCXKWG+CfN8Zd9DECOCYWjg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.2.tgz",
"integrity": "sha512-6cHfHi/lRCUPNGO0eJeYRIpu8vM+CMMS2Wv/psOUwvl/5+RC92hfBEZxzQiF/5X9A170bJabaMFQC5fA7pkF2g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -566,9 +566,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/animations": "21.2.0",
"@angular/common": "21.2.0",
"@angular/core": "21.2.0"
"@angular/animations": "21.2.2",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -577,9 +577,9 @@
}
},
"node_modules/@angular/router": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.0.tgz",
"integrity": "sha512-siliJ+jJRUCRZ0cdkqc7zww9Didz56Z0Z2YPIuR2n5TZLiuJY+jAf6xotXKp/v6v8XoGJwLiRNipGgNDRIAlWA==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.2.tgz",
"integrity": "sha512-mpVPI6AiIlZ4z6sSM5WOzCMwTka9yQ9TEVj9+ZyfAs5U9RnKDa8DZIoQ6BFbh3h/v4DArvT5q1Ji8aIlabmWcQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -588,9 +588,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/common": "21.2.0",
"@angular/core": "21.2.0",
"@angular/platform-browser": "21.2.0",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2",
"@angular/platform-browser": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
@@ -1385,9 +1385,9 @@
"optional": true
},
"node_modules/@hono/node-server": {
"version": "1.19.9",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz",
"integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==",
"version": "1.19.11",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz",
"integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3515,14 +3515,14 @@
]
},
"node_modules/@schematics/angular": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.0.tgz",
"integrity": "sha512-GQUIeGzZwCT9/W5MAkKnkwETROPbA1eRmy3JF56jLmvr95tJnypGOG8jGYy0d+tcEVujIouh48r4J3bJQg5mrw==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.1.tgz",
"integrity": "sha512-DjrHRMoILhbZ6tc7aNZWuHA1wCm1iU/JN1TxAwNEyIBgyU3Fx8Z5baK4w0TCpOIPt0RLWVgP2L7kka9aXWCUFA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -4021,9 +4021,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001775",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz",
"integrity": "sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==",
"version": "1.0.30001777",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz",
"integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==",
"dev": true,
"funding": [
{
@@ -4456,9 +4456,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
"version": "1.5.302",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
"integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==",
"version": "1.5.307",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz",
"integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==",
"dev": true,
"license": "ISC"
},
@@ -4706,13 +4706,13 @@
}
},
"node_modules/express-rate-limit": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz",
"integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==",
"version": "8.3.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.1.tgz",
"integrity": "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==",
"dev": true,
"license": "MIT",
"dependencies": {
"ip-address": "10.0.1"
"ip-address": "10.1.0"
},
"engines": {
"node": ">= 16"
@@ -4990,9 +4990,9 @@
}
},
"node_modules/hono": {
"version": "4.12.3",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.3.tgz",
"integrity": "sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==",
"version": "4.12.6",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.6.tgz",
"integrity": "sha512-KljEp+MeEEEIOT75qBo1UjqqB29fRMtlDEwCxcexOzdkUq6LR/vRvHk5pdROcxyOYyW1niq7Gb5pFVGy5R1eBw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5142,9 +5142,9 @@
}
},
"node_modules/immutable": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz",
"integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==",
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz",
"integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==",
"dev": true,
"license": "MIT"
},
@@ -5176,9 +5176,9 @@
}
},
"node_modules/ip-address": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
"integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5304,9 +5304,9 @@
}
},
"node_modules/jose": {
"version": "6.1.3",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz",
"integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==",
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.2.1.tgz",
"integrity": "sha512-jUaKr1yrbfaImV7R2TN/b3IcZzsw38/chqMpo2XJ7i2F8AfM/lA4G1goC3JVEwg0H7UldTmSt3P68nt31W7/mw==",
"dev": true,
"license": "MIT",
"funding": {
@@ -5991,9 +5991,9 @@
}
},
"node_modules/node-releases": {
"version": "2.0.27",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"version": "2.0.36",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
"integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==",
"dev": true,
"license": "MIT"
},
@@ -7204,9 +7204,9 @@
}
},
"node_modules/tar": {
"version": "7.5.9",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz",
"integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==",
"version": "7.5.11",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz",
"integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
+98 -98
View File
@@ -250,13 +250,13 @@
}
},
"node_modules/@angular-devkit/architect": {
"version": "0.2102.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.0.tgz",
"integrity": "sha512-kYFwTNzToG2SJMxj2f41w3QRtdqlrFuF+bpZrtIaHOP078Ktld8EPIp9KqB0Y46Vvs69ifby5Q1/wPD9wA3iaw==",
"version": "0.2102.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.1.tgz",
"integrity": "sha512-x2Qqz6oLYvEh9UBUG0AP1A4zROO/VP+k+zM9+4c2uZw1uqoBQFmutqgzncjVU7cR9R0RApgx9JRZHDFtQru68w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"rxjs": "7.8.2"
},
"bin": {
@@ -269,9 +269,9 @@
}
},
"node_modules/@angular-devkit/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.0.tgz",
"integrity": "sha512-HZdTn46Ca6qbb9Zef8R/+TWsk6mNKRm4rJyL3PxHP6HnVCwSPNZ0LNN9BjVREBs+UlRdXqBGFBZh5D1nBgu5GQ==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.1.tgz",
"integrity": "sha512-TpXGjERqVPN8EPt7LdmWAwh0oNQ/6uWFutzGZiXhJy81n1zb1O1XrqhRAmvP1cAo5O+na6IV2JkkCmxL6F8GUg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -297,13 +297,13 @@
}
},
"node_modules/@angular-devkit/schematics": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.0.tgz",
"integrity": "sha512-3kn3FI5v7BQ7Zct6raek+WgvyDwOJ8wElbyC903GxMQCDBRGGcevhHvTAIHhknihEsrgplzPhTlWeMbk1JfdFg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.1.tgz",
"integrity": "sha512-CWoamHaasAHMjHcYqxbj0tMnoXxdGotcAz2SpiuWtH28Lnf5xfbTaJn/lwdMP8Wdh4tgA+uYh2l45A5auCwmkw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.21",
"ora": "9.3.0",
@@ -316,14 +316,14 @@
}
},
"node_modules/@angular/build": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.0.tgz",
"integrity": "sha512-K0EqiHz2y7TSyD4adWD0+C/P9khKlrsSWavXWxGRvoSJC/H3I3SK5Z6BWwftBibXR1Fis7njwvl5IGAlQrDchA==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.1.tgz",
"integrity": "sha512-cUpLNHJp9taII/FOcJHHfQYlMcZSRaf6eIxgSNS6Xfx1CeGoJNDN+J8+GFk+H1CPJt1EvbfyZ+dE5DbsgTD/QQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/architect": "0.2102.1",
"@babel/core": "7.29.0",
"@babel/helper-annotate-as-pure": "7.27.3",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -366,7 +366,7 @@
"@angular/platform-browser": "^21.0.0",
"@angular/platform-server": "^21.0.0",
"@angular/service-worker": "^21.0.0",
"@angular/ssr": "^21.2.0",
"@angular/ssr": "^21.2.1",
"karma": "^6.4.0",
"less": "^4.2.0",
"ng-packagr": "^21.0.0",
@@ -484,9 +484,9 @@
}
},
"node_modules/@angular/build/node_modules/@types/node": {
"version": "25.3.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.3.tgz",
"integrity": "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==",
"version": "25.4.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.4.0.tgz",
"integrity": "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==",
"extraneous": true,
"license": "MIT",
"dependencies": {
@@ -661,19 +661,19 @@
}
},
"node_modules/@angular/cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.0.tgz",
"integrity": "sha512-yaGEpckqgOemcHkoWeH92i9eNrcbr9iE/dnxL+Du6s9spTAXJ2jjtYfszhmowuQZkCK5rjecMb8ctNtHlaGCjg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.1.tgz",
"integrity": "sha512-5SRfMTgwFj1zXOpfeZWHsxZBni0J4Xz7/CbewG47D6DmbstOrSdgt6eNzJ62R650t0G9dpri2YvToZgImtbjOQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/architect": "0.2102.1",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"@inquirer/prompts": "7.10.1",
"@listr2/prompt-adapter-inquirer": "3.0.5",
"@modelcontextprotocol/sdk": "1.26.0",
"@schematics/angular": "21.2.0",
"@schematics/angular": "21.2.1",
"@yarnpkg/lockfile": "1.1.0",
"algoliasearch": "5.48.1",
"ini": "6.0.0",
@@ -1043,9 +1043,9 @@
}
},
"node_modules/@angular/cli/node_modules/@types/node": {
"version": "25.3.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.3.tgz",
"integrity": "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==",
"version": "25.4.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.4.0.tgz",
"integrity": "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==",
"extraneous": true,
"license": "MIT",
"dependencies": {
@@ -1132,9 +1132,9 @@
}
},
"node_modules/@angular/common": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.0.tgz",
"integrity": "sha512-6zJMPi0i/XDniEgv3/t2BjuDHiOG44lgIR5PYyxqGpgJ0kqB5hku/0TuentNEi1VnBYgthnfhjek7c+lakXmhw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.2.tgz",
"integrity": "sha512-xpVYV+MgqWzdjTCFxe3uJGpFOc84YrO4H4oX9HkzI5yQ5OLkQlndtq+OAUK8e330iacg4XHArft3SNDj1LaFfg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -1143,14 +1143,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/core": "21.2.0",
"@angular/core": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.0.tgz",
"integrity": "sha512-0RPkma8UVNpse/VJcXT9w6SKzTMz4J/uMGj0l9enM1frg9xrx1fwi/lLmaVV9Nr9LfqPjQdxNFFlvaBB7g/2zg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.2.tgz",
"integrity": "sha512-k7P0EH8I/Iwf2uRalSqhfokFbItTwdH7CmBJ7RKTRIH4FcrQcnqHetNKUMCOYXZtnlHIAnTpG+C+T4+6GTpYFg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -1160,9 +1160,9 @@
}
},
"node_modules/@angular/compiler-cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.0.tgz",
"integrity": "sha512-gZd58p0/JjgdxMX3v+LjCB6e3dBIfNVr/YzXoh55TfffdBCUQY94hl1+DFQkJ72K5EX+1zbaz03dIm30kw1bGw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.2.tgz",
"integrity": "sha512-TFg2wXUZ1FdUikNyR27PxuCXuqqlJhL6Mr/cBYuc4HbtBfgKw5FLffbI/iLubBEs55W5ApuYpBVuXKGoZp9SRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1183,7 +1183,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"typescript": ">=5.9 <6.1"
},
"peerDependenciesMeta": {
@@ -1193,9 +1193,9 @@
}
},
"node_modules/@angular/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.0.tgz",
"integrity": "sha512-VnTbmZq3g3Q+s3nCZ8VUDMLjMezOg/bqUxAJ/DrRWCrEcTP5JO3mrNPs3FHj+qlB0T+BQP7uQv6QTzPVKybwoA==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.2.tgz",
"integrity": "sha512-ljiyiFjR6dgK27CNlOcMrjsDPYKFf2Rl89WLwGEGMOj0cJg/PSLQqpW/fbSkSB3SDgwG/WhXQ4Wrw525OKMupg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -1204,7 +1204,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0 || ~0.16.0"
},
@@ -1218,9 +1218,9 @@
}
},
"node_modules/@angular/forms": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.0.tgz",
"integrity": "sha512-NduUtPWLauH/FLayEDkLyaKAGqKzXbcfO7468LOWCXN3crhNVQyIWRQPOUcdpoJwDAGLpN85m3DhJhXNnA9c5w==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.2.tgz",
"integrity": "sha512-uiuL8uy4OpcbB0zRZ8TcvYXxe+GZC+XkCAptfrG+yAyzm4cOrqCilOZsMG6bVdOb2sjc2islk9CVDZZOju28/Q==",
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
@@ -1230,16 +1230,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/common": "21.2.0",
"@angular/core": "21.2.0",
"@angular/platform-browser": "21.2.0",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2",
"@angular/platform-browser": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/platform-browser": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.0.tgz",
"integrity": "sha512-IUGukpvvT2B5Dl76qzk6rY7UIHUT9u4BhT2AwVz+5JqcX9KwQtYD17Gt7wj6bvIgCXKWG+CfN8Zd9DECOCYWjg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.2.tgz",
"integrity": "sha512-6cHfHi/lRCUPNGO0eJeYRIpu8vM+CMMS2Wv/psOUwvl/5+RC92hfBEZxzQiF/5X9A170bJabaMFQC5fA7pkF2g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -1248,9 +1248,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/animations": "21.2.0",
"@angular/common": "21.2.0",
"@angular/core": "21.2.0"
"@angular/animations": "21.2.2",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -1259,9 +1259,9 @@
}
},
"node_modules/@angular/router": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.0.tgz",
"integrity": "sha512-siliJ+jJRUCRZ0cdkqc7zww9Didz56Z0Z2YPIuR2n5TZLiuJY+jAf6xotXKp/v6v8XoGJwLiRNipGgNDRIAlWA==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.2.tgz",
"integrity": "sha512-mpVPI6AiIlZ4z6sSM5WOzCMwTka9yQ9TEVj9+ZyfAs5U9RnKDa8DZIoQ6BFbh3h/v4DArvT5q1Ji8aIlabmWcQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -1270,9 +1270,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/common": "21.2.0",
"@angular/core": "21.2.0",
"@angular/platform-browser": "21.2.0",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2",
"@angular/platform-browser": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
@@ -2067,9 +2067,9 @@
"optional": true
},
"node_modules/@hono/node-server": {
"version": "1.19.9",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz",
"integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==",
"version": "1.19.11",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz",
"integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3850,14 +3850,14 @@
]
},
"node_modules/@schematics/angular": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.0.tgz",
"integrity": "sha512-GQUIeGzZwCT9/W5MAkKnkwETROPbA1eRmy3JF56jLmvr95tJnypGOG8jGYy0d+tcEVujIouh48r4J3bJQg5mrw==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.1.tgz",
"integrity": "sha512-DjrHRMoILhbZ6tc7aNZWuHA1wCm1iU/JN1TxAwNEyIBgyU3Fx8Z5baK4w0TCpOIPt0RLWVgP2L7kka9aXWCUFA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -4350,9 +4350,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001775",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz",
"integrity": "sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==",
"version": "1.0.30001777",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz",
"integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==",
"dev": true,
"funding": [
{
@@ -4774,9 +4774,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
"version": "1.5.302",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
"integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==",
"version": "1.5.307",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz",
"integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==",
"dev": true,
"license": "ISC"
},
@@ -5024,13 +5024,13 @@
}
},
"node_modules/express-rate-limit": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz",
"integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==",
"version": "8.3.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.1.tgz",
"integrity": "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==",
"dev": true,
"license": "MIT",
"dependencies": {
"ip-address": "10.0.1"
"ip-address": "10.1.0"
},
"engines": {
"node": ">= 16"
@@ -5308,9 +5308,9 @@
}
},
"node_modules/hono": {
"version": "4.12.3",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.3.tgz",
"integrity": "sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==",
"version": "4.12.6",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.6.tgz",
"integrity": "sha512-KljEp+MeEEEIOT75qBo1UjqqB29fRMtlDEwCxcexOzdkUq6LR/vRvHk5pdROcxyOYyW1niq7Gb5pFVGy5R1eBw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5460,9 +5460,9 @@
}
},
"node_modules/immutable": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz",
"integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==",
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz",
"integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==",
"dev": true,
"license": "MIT"
},
@@ -5494,9 +5494,9 @@
}
},
"node_modules/ip-address": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
"integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5622,9 +5622,9 @@
}
},
"node_modules/jose": {
"version": "6.1.3",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz",
"integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==",
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.2.1.tgz",
"integrity": "sha512-jUaKr1yrbfaImV7R2TN/b3IcZzsw38/chqMpo2XJ7i2F8AfM/lA4G1goC3JVEwg0H7UldTmSt3P68nt31W7/mw==",
"dev": true,
"license": "MIT",
"funding": {
@@ -6237,9 +6237,9 @@
}
},
"node_modules/node-releases": {
"version": "2.0.27",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"version": "2.0.36",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
"integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==",
"dev": true,
"license": "MIT"
},
@@ -7450,9 +7450,9 @@
}
},
"node_modules/tar": {
"version": "7.5.9",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz",
"integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==",
"version": "7.5.11",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz",
"integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
@@ -20,7 +20,7 @@ In this step, you'll update the `Home` class to store data in a new array proper
1. In `src/app/home/home.ts`, add new property to the class called `filteredLocationList`.
<docs-code header="Add the filteredLocationList property in home.ts" path="adev/src/content/tutorials/first-app/steps/14-http/src/app/home/home.ts" visibleLines="[27]"/>
<docs-code header="Add the filteredLocationList property in home.ts" path="adev/src/content/tutorials/first-app/steps/14-http/src/app/home/home.ts" visibleLines="[28]"/>
The `filteredLocationList` hold the values that match the search criteria entered by the user.
@@ -55,7 +55,7 @@ The template has been updated to bind the `filterResults` function to the `click
1. Update the `Home` class to include the implementation of the `filterResults` function.
<docs-code header="Add the filterResults function implementation" path="adev/src/content/tutorials/first-app/steps/14-http/src/app/home/home.ts" visibleLines="[34,43]"/>
<docs-code header="Add the filterResults function implementation" path="adev/src/content/tutorials/first-app/steps/14-http/src/app/home/home.ts" visibleLines="[35,44]"/>
This function uses the `String` `filter` function to compare the value of the `text` parameter against the `housingLocation.city` property. You can update this function to match against any property or multiple properties for a fun exercise.
@@ -13,9 +13,9 @@ export class HousingService {
}
async getHousingLocationById(id: number): Promise<HousingLocationInfo | undefined> {
const data = await fetch(`${this.url}?id=${id}`);
const data = await fetch(`${this.url}/${id}`);
const locationJson = await data.json();
return locationJson[0] ?? {};
return locationJson ?? {};
}
submitApplication(firstName: string, lastName: string, email: string) {
+86 -86
View File
@@ -248,13 +248,13 @@
}
},
"node_modules/@angular-devkit/architect": {
"version": "0.2102.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.0.tgz",
"integrity": "sha512-kYFwTNzToG2SJMxj2f41w3QRtdqlrFuF+bpZrtIaHOP078Ktld8EPIp9KqB0Y46Vvs69ifby5Q1/wPD9wA3iaw==",
"version": "0.2102.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.1.tgz",
"integrity": "sha512-x2Qqz6oLYvEh9UBUG0AP1A4zROO/VP+k+zM9+4c2uZw1uqoBQFmutqgzncjVU7cR9R0RApgx9JRZHDFtQru68w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"rxjs": "7.8.2"
},
"bin": {
@@ -267,9 +267,9 @@
}
},
"node_modules/@angular-devkit/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.0.tgz",
"integrity": "sha512-HZdTn46Ca6qbb9Zef8R/+TWsk6mNKRm4rJyL3PxHP6HnVCwSPNZ0LNN9BjVREBs+UlRdXqBGFBZh5D1nBgu5GQ==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.1.tgz",
"integrity": "sha512-TpXGjERqVPN8EPt7LdmWAwh0oNQ/6uWFutzGZiXhJy81n1zb1O1XrqhRAmvP1cAo5O+na6IV2JkkCmxL6F8GUg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -295,13 +295,13 @@
}
},
"node_modules/@angular-devkit/schematics": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.0.tgz",
"integrity": "sha512-3kn3FI5v7BQ7Zct6raek+WgvyDwOJ8wElbyC903GxMQCDBRGGcevhHvTAIHhknihEsrgplzPhTlWeMbk1JfdFg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.1.tgz",
"integrity": "sha512-CWoamHaasAHMjHcYqxbj0tMnoXxdGotcAz2SpiuWtH28Lnf5xfbTaJn/lwdMP8Wdh4tgA+uYh2l45A5auCwmkw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.21",
"ora": "9.3.0",
@@ -314,14 +314,14 @@
}
},
"node_modules/@angular/build": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.0.tgz",
"integrity": "sha512-K0EqiHz2y7TSyD4adWD0+C/P9khKlrsSWavXWxGRvoSJC/H3I3SK5Z6BWwftBibXR1Fis7njwvl5IGAlQrDchA==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.1.tgz",
"integrity": "sha512-cUpLNHJp9taII/FOcJHHfQYlMcZSRaf6eIxgSNS6Xfx1CeGoJNDN+J8+GFk+H1CPJt1EvbfyZ+dE5DbsgTD/QQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/architect": "0.2102.1",
"@babel/core": "7.29.0",
"@babel/helper-annotate-as-pure": "7.27.3",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -364,7 +364,7 @@
"@angular/platform-browser": "^21.0.0",
"@angular/platform-server": "^21.0.0",
"@angular/service-worker": "^21.0.0",
"@angular/ssr": "^21.2.0",
"@angular/ssr": "^21.2.1",
"karma": "^6.4.0",
"less": "^4.2.0",
"ng-packagr": "^21.0.0",
@@ -414,19 +414,19 @@
}
},
"node_modules/@angular/cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.0.tgz",
"integrity": "sha512-yaGEpckqgOemcHkoWeH92i9eNrcbr9iE/dnxL+Du6s9spTAXJ2jjtYfszhmowuQZkCK5rjecMb8ctNtHlaGCjg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.1.tgz",
"integrity": "sha512-5SRfMTgwFj1zXOpfeZWHsxZBni0J4Xz7/CbewG47D6DmbstOrSdgt6eNzJ62R650t0G9dpri2YvToZgImtbjOQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/architect": "0.2102.1",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"@inquirer/prompts": "7.10.1",
"@listr2/prompt-adapter-inquirer": "3.0.5",
"@modelcontextprotocol/sdk": "1.26.0",
"@schematics/angular": "21.2.0",
"@schematics/angular": "21.2.1",
"@yarnpkg/lockfile": "1.1.0",
"algoliasearch": "5.48.1",
"ini": "6.0.0",
@@ -449,9 +449,9 @@
}
},
"node_modules/@angular/common": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.0.tgz",
"integrity": "sha512-6zJMPi0i/XDniEgv3/t2BjuDHiOG44lgIR5PYyxqGpgJ0kqB5hku/0TuentNEi1VnBYgthnfhjek7c+lakXmhw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.2.tgz",
"integrity": "sha512-xpVYV+MgqWzdjTCFxe3uJGpFOc84YrO4H4oX9HkzI5yQ5OLkQlndtq+OAUK8e330iacg4XHArft3SNDj1LaFfg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -460,14 +460,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/core": "21.2.0",
"@angular/core": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.0.tgz",
"integrity": "sha512-0RPkma8UVNpse/VJcXT9w6SKzTMz4J/uMGj0l9enM1frg9xrx1fwi/lLmaVV9Nr9LfqPjQdxNFFlvaBB7g/2zg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.2.tgz",
"integrity": "sha512-k7P0EH8I/Iwf2uRalSqhfokFbItTwdH7CmBJ7RKTRIH4FcrQcnqHetNKUMCOYXZtnlHIAnTpG+C+T4+6GTpYFg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -477,9 +477,9 @@
}
},
"node_modules/@angular/compiler-cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.0.tgz",
"integrity": "sha512-gZd58p0/JjgdxMX3v+LjCB6e3dBIfNVr/YzXoh55TfffdBCUQY94hl1+DFQkJ72K5EX+1zbaz03dIm30kw1bGw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.2.tgz",
"integrity": "sha512-TFg2wXUZ1FdUikNyR27PxuCXuqqlJhL6Mr/cBYuc4HbtBfgKw5FLffbI/iLubBEs55W5ApuYpBVuXKGoZp9SRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -500,7 +500,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"typescript": ">=5.9 <6.1"
},
"peerDependenciesMeta": {
@@ -510,9 +510,9 @@
}
},
"node_modules/@angular/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.0.tgz",
"integrity": "sha512-VnTbmZq3g3Q+s3nCZ8VUDMLjMezOg/bqUxAJ/DrRWCrEcTP5JO3mrNPs3FHj+qlB0T+BQP7uQv6QTzPVKybwoA==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.2.tgz",
"integrity": "sha512-ljiyiFjR6dgK27CNlOcMrjsDPYKFf2Rl89WLwGEGMOj0cJg/PSLQqpW/fbSkSB3SDgwG/WhXQ4Wrw525OKMupg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -521,7 +521,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0 || ~0.16.0"
},
@@ -535,9 +535,9 @@
}
},
"node_modules/@angular/forms": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.0.tgz",
"integrity": "sha512-NduUtPWLauH/FLayEDkLyaKAGqKzXbcfO7468LOWCXN3crhNVQyIWRQPOUcdpoJwDAGLpN85m3DhJhXNnA9c5w==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.2.tgz",
"integrity": "sha512-uiuL8uy4OpcbB0zRZ8TcvYXxe+GZC+XkCAptfrG+yAyzm4cOrqCilOZsMG6bVdOb2sjc2islk9CVDZZOju28/Q==",
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
@@ -547,16 +547,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/common": "21.2.0",
"@angular/core": "21.2.0",
"@angular/platform-browser": "21.2.0",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2",
"@angular/platform-browser": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/platform-browser": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.0.tgz",
"integrity": "sha512-IUGukpvvT2B5Dl76qzk6rY7UIHUT9u4BhT2AwVz+5JqcX9KwQtYD17Gt7wj6bvIgCXKWG+CfN8Zd9DECOCYWjg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.2.tgz",
"integrity": "sha512-6cHfHi/lRCUPNGO0eJeYRIpu8vM+CMMS2Wv/psOUwvl/5+RC92hfBEZxzQiF/5X9A170bJabaMFQC5fA7pkF2g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -565,9 +565,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/animations": "21.2.0",
"@angular/common": "21.2.0",
"@angular/core": "21.2.0"
"@angular/animations": "21.2.2",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -1366,9 +1366,9 @@
"optional": true
},
"node_modules/@hono/node-server": {
"version": "1.19.9",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz",
"integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==",
"version": "1.19.11",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz",
"integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3496,14 +3496,14 @@
]
},
"node_modules/@schematics/angular": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.0.tgz",
"integrity": "sha512-GQUIeGzZwCT9/W5MAkKnkwETROPbA1eRmy3JF56jLmvr95tJnypGOG8jGYy0d+tcEVujIouh48r4J3bJQg5mrw==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.1.tgz",
"integrity": "sha512-DjrHRMoILhbZ6tc7aNZWuHA1wCm1iU/JN1TxAwNEyIBgyU3Fx8Z5baK4w0TCpOIPt0RLWVgP2L7kka9aXWCUFA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -4002,9 +4002,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001775",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz",
"integrity": "sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==",
"version": "1.0.30001777",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz",
"integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==",
"dev": true,
"funding": [
{
@@ -4437,9 +4437,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
"version": "1.5.302",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
"integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==",
"version": "1.5.307",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz",
"integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==",
"dev": true,
"license": "ISC"
},
@@ -4687,13 +4687,13 @@
}
},
"node_modules/express-rate-limit": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz",
"integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==",
"version": "8.3.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.1.tgz",
"integrity": "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==",
"dev": true,
"license": "MIT",
"dependencies": {
"ip-address": "10.0.1"
"ip-address": "10.1.0"
},
"engines": {
"node": ">= 16"
@@ -4971,9 +4971,9 @@
}
},
"node_modules/hono": {
"version": "4.12.3",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.3.tgz",
"integrity": "sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==",
"version": "4.12.6",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.6.tgz",
"integrity": "sha512-KljEp+MeEEEIOT75qBo1UjqqB29fRMtlDEwCxcexOzdkUq6LR/vRvHk5pdROcxyOYyW1niq7Gb5pFVGy5R1eBw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5123,9 +5123,9 @@
}
},
"node_modules/immutable": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz",
"integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==",
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz",
"integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==",
"dev": true,
"license": "MIT"
},
@@ -5157,9 +5157,9 @@
}
},
"node_modules/ip-address": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
"integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5285,9 +5285,9 @@
}
},
"node_modules/jose": {
"version": "6.1.3",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz",
"integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==",
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.2.1.tgz",
"integrity": "sha512-jUaKr1yrbfaImV7R2TN/b3IcZzsw38/chqMpo2XJ7i2F8AfM/lA4G1goC3JVEwg0H7UldTmSt3P68nt31W7/mw==",
"dev": true,
"license": "MIT",
"funding": {
@@ -5972,9 +5972,9 @@
}
},
"node_modules/node-releases": {
"version": "2.0.27",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"version": "2.0.36",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
"integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==",
"dev": true,
"license": "MIT"
},
@@ -7185,9 +7185,9 @@
}
},
"node_modules/tar": {
"version": "7.5.9",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz",
"integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==",
"version": "7.5.11",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz",
"integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
@@ -249,13 +249,13 @@
}
},
"node_modules/@angular-devkit/architect": {
"version": "0.2102.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.0.tgz",
"integrity": "sha512-kYFwTNzToG2SJMxj2f41w3QRtdqlrFuF+bpZrtIaHOP078Ktld8EPIp9KqB0Y46Vvs69ifby5Q1/wPD9wA3iaw==",
"version": "0.2102.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.1.tgz",
"integrity": "sha512-x2Qqz6oLYvEh9UBUG0AP1A4zROO/VP+k+zM9+4c2uZw1uqoBQFmutqgzncjVU7cR9R0RApgx9JRZHDFtQru68w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"rxjs": "7.8.2"
},
"bin": {
@@ -268,9 +268,9 @@
}
},
"node_modules/@angular-devkit/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.0.tgz",
"integrity": "sha512-HZdTn46Ca6qbb9Zef8R/+TWsk6mNKRm4rJyL3PxHP6HnVCwSPNZ0LNN9BjVREBs+UlRdXqBGFBZh5D1nBgu5GQ==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.1.tgz",
"integrity": "sha512-TpXGjERqVPN8EPt7LdmWAwh0oNQ/6uWFutzGZiXhJy81n1zb1O1XrqhRAmvP1cAo5O+na6IV2JkkCmxL6F8GUg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -296,13 +296,13 @@
}
},
"node_modules/@angular-devkit/schematics": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.0.tgz",
"integrity": "sha512-3kn3FI5v7BQ7Zct6raek+WgvyDwOJ8wElbyC903GxMQCDBRGGcevhHvTAIHhknihEsrgplzPhTlWeMbk1JfdFg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.1.tgz",
"integrity": "sha512-CWoamHaasAHMjHcYqxbj0tMnoXxdGotcAz2SpiuWtH28Lnf5xfbTaJn/lwdMP8Wdh4tgA+uYh2l45A5auCwmkw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.21",
"ora": "9.3.0",
@@ -315,14 +315,14 @@
}
},
"node_modules/@angular/build": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.0.tgz",
"integrity": "sha512-K0EqiHz2y7TSyD4adWD0+C/P9khKlrsSWavXWxGRvoSJC/H3I3SK5Z6BWwftBibXR1Fis7njwvl5IGAlQrDchA==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.1.tgz",
"integrity": "sha512-cUpLNHJp9taII/FOcJHHfQYlMcZSRaf6eIxgSNS6Xfx1CeGoJNDN+J8+GFk+H1CPJt1EvbfyZ+dE5DbsgTD/QQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/architect": "0.2102.1",
"@babel/core": "7.29.0",
"@babel/helper-annotate-as-pure": "7.27.3",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -365,7 +365,7 @@
"@angular/platform-browser": "^21.0.0",
"@angular/platform-server": "^21.0.0",
"@angular/service-worker": "^21.0.0",
"@angular/ssr": "^21.2.0",
"@angular/ssr": "^21.2.1",
"karma": "^6.4.0",
"less": "^4.2.0",
"ng-packagr": "^21.0.0",
@@ -415,19 +415,19 @@
}
},
"node_modules/@angular/cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.0.tgz",
"integrity": "sha512-yaGEpckqgOemcHkoWeH92i9eNrcbr9iE/dnxL+Du6s9spTAXJ2jjtYfszhmowuQZkCK5rjecMb8ctNtHlaGCjg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.1.tgz",
"integrity": "sha512-5SRfMTgwFj1zXOpfeZWHsxZBni0J4Xz7/CbewG47D6DmbstOrSdgt6eNzJ62R650t0G9dpri2YvToZgImtbjOQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/architect": "0.2102.1",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"@inquirer/prompts": "7.10.1",
"@listr2/prompt-adapter-inquirer": "3.0.5",
"@modelcontextprotocol/sdk": "1.26.0",
"@schematics/angular": "21.2.0",
"@schematics/angular": "21.2.1",
"@yarnpkg/lockfile": "1.1.0",
"algoliasearch": "5.48.1",
"ini": "6.0.0",
@@ -450,9 +450,9 @@
}
},
"node_modules/@angular/common": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.0.tgz",
"integrity": "sha512-6zJMPi0i/XDniEgv3/t2BjuDHiOG44lgIR5PYyxqGpgJ0kqB5hku/0TuentNEi1VnBYgthnfhjek7c+lakXmhw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.2.tgz",
"integrity": "sha512-xpVYV+MgqWzdjTCFxe3uJGpFOc84YrO4H4oX9HkzI5yQ5OLkQlndtq+OAUK8e330iacg4XHArft3SNDj1LaFfg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -461,14 +461,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/core": "21.2.0",
"@angular/core": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.0.tgz",
"integrity": "sha512-0RPkma8UVNpse/VJcXT9w6SKzTMz4J/uMGj0l9enM1frg9xrx1fwi/lLmaVV9Nr9LfqPjQdxNFFlvaBB7g/2zg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.2.tgz",
"integrity": "sha512-k7P0EH8I/Iwf2uRalSqhfokFbItTwdH7CmBJ7RKTRIH4FcrQcnqHetNKUMCOYXZtnlHIAnTpG+C+T4+6GTpYFg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -478,9 +478,9 @@
}
},
"node_modules/@angular/compiler-cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.0.tgz",
"integrity": "sha512-gZd58p0/JjgdxMX3v+LjCB6e3dBIfNVr/YzXoh55TfffdBCUQY94hl1+DFQkJ72K5EX+1zbaz03dIm30kw1bGw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.2.tgz",
"integrity": "sha512-TFg2wXUZ1FdUikNyR27PxuCXuqqlJhL6Mr/cBYuc4HbtBfgKw5FLffbI/iLubBEs55W5ApuYpBVuXKGoZp9SRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -501,7 +501,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"typescript": ">=5.9 <6.1"
},
"peerDependenciesMeta": {
@@ -511,9 +511,9 @@
}
},
"node_modules/@angular/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.0.tgz",
"integrity": "sha512-VnTbmZq3g3Q+s3nCZ8VUDMLjMezOg/bqUxAJ/DrRWCrEcTP5JO3mrNPs3FHj+qlB0T+BQP7uQv6QTzPVKybwoA==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.2.tgz",
"integrity": "sha512-ljiyiFjR6dgK27CNlOcMrjsDPYKFf2Rl89WLwGEGMOj0cJg/PSLQqpW/fbSkSB3SDgwG/WhXQ4Wrw525OKMupg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -522,7 +522,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0 || ~0.16.0"
},
@@ -536,9 +536,9 @@
}
},
"node_modules/@angular/forms": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.0.tgz",
"integrity": "sha512-NduUtPWLauH/FLayEDkLyaKAGqKzXbcfO7468LOWCXN3crhNVQyIWRQPOUcdpoJwDAGLpN85m3DhJhXNnA9c5w==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.2.tgz",
"integrity": "sha512-uiuL8uy4OpcbB0zRZ8TcvYXxe+GZC+XkCAptfrG+yAyzm4cOrqCilOZsMG6bVdOb2sjc2islk9CVDZZOju28/Q==",
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
@@ -548,16 +548,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/common": "21.2.0",
"@angular/core": "21.2.0",
"@angular/platform-browser": "21.2.0",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2",
"@angular/platform-browser": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/platform-browser": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.0.tgz",
"integrity": "sha512-IUGukpvvT2B5Dl76qzk6rY7UIHUT9u4BhT2AwVz+5JqcX9KwQtYD17Gt7wj6bvIgCXKWG+CfN8Zd9DECOCYWjg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.2.tgz",
"integrity": "sha512-6cHfHi/lRCUPNGO0eJeYRIpu8vM+CMMS2Wv/psOUwvl/5+RC92hfBEZxzQiF/5X9A170bJabaMFQC5fA7pkF2g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -566,9 +566,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/animations": "21.2.0",
"@angular/common": "21.2.0",
"@angular/core": "21.2.0"
"@angular/animations": "21.2.2",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -577,9 +577,9 @@
}
},
"node_modules/@angular/router": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.0.tgz",
"integrity": "sha512-siliJ+jJRUCRZ0cdkqc7zww9Didz56Z0Z2YPIuR2n5TZLiuJY+jAf6xotXKp/v6v8XoGJwLiRNipGgNDRIAlWA==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.2.tgz",
"integrity": "sha512-mpVPI6AiIlZ4z6sSM5WOzCMwTka9yQ9TEVj9+ZyfAs5U9RnKDa8DZIoQ6BFbh3h/v4DArvT5q1Ji8aIlabmWcQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -588,9 +588,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/common": "21.2.0",
"@angular/core": "21.2.0",
"@angular/platform-browser": "21.2.0",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2",
"@angular/platform-browser": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
@@ -1385,9 +1385,9 @@
"optional": true
},
"node_modules/@hono/node-server": {
"version": "1.19.9",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz",
"integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==",
"version": "1.19.11",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz",
"integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3515,14 +3515,14 @@
]
},
"node_modules/@schematics/angular": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.0.tgz",
"integrity": "sha512-GQUIeGzZwCT9/W5MAkKnkwETROPbA1eRmy3JF56jLmvr95tJnypGOG8jGYy0d+tcEVujIouh48r4J3bJQg5mrw==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.1.tgz",
"integrity": "sha512-DjrHRMoILhbZ6tc7aNZWuHA1wCm1iU/JN1TxAwNEyIBgyU3Fx8Z5baK4w0TCpOIPt0RLWVgP2L7kka9aXWCUFA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -4021,9 +4021,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001775",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz",
"integrity": "sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==",
"version": "1.0.30001777",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz",
"integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==",
"dev": true,
"funding": [
{
@@ -4456,9 +4456,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
"version": "1.5.302",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
"integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==",
"version": "1.5.307",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz",
"integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==",
"dev": true,
"license": "ISC"
},
@@ -4706,13 +4706,13 @@
}
},
"node_modules/express-rate-limit": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz",
"integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==",
"version": "8.3.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.1.tgz",
"integrity": "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==",
"dev": true,
"license": "MIT",
"dependencies": {
"ip-address": "10.0.1"
"ip-address": "10.1.0"
},
"engines": {
"node": ">= 16"
@@ -4990,9 +4990,9 @@
}
},
"node_modules/hono": {
"version": "4.12.3",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.3.tgz",
"integrity": "sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==",
"version": "4.12.6",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.6.tgz",
"integrity": "sha512-KljEp+MeEEEIOT75qBo1UjqqB29fRMtlDEwCxcexOzdkUq6LR/vRvHk5pdROcxyOYyW1niq7Gb5pFVGy5R1eBw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5142,9 +5142,9 @@
}
},
"node_modules/immutable": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz",
"integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==",
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz",
"integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==",
"dev": true,
"license": "MIT"
},
@@ -5176,9 +5176,9 @@
}
},
"node_modules/ip-address": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
"integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5304,9 +5304,9 @@
}
},
"node_modules/jose": {
"version": "6.1.3",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz",
"integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==",
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.2.1.tgz",
"integrity": "sha512-jUaKr1yrbfaImV7R2TN/b3IcZzsw38/chqMpo2XJ7i2F8AfM/lA4G1goC3JVEwg0H7UldTmSt3P68nt31W7/mw==",
"dev": true,
"license": "MIT",
"funding": {
@@ -5991,9 +5991,9 @@
}
},
"node_modules/node-releases": {
"version": "2.0.27",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"version": "2.0.36",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
"integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==",
"dev": true,
"license": "MIT"
},
@@ -7204,9 +7204,9 @@
}
},
"node_modules/tar": {
"version": "7.5.9",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz",
"integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==",
"version": "7.5.11",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz",
"integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
+97 -97
View File
@@ -251,13 +251,13 @@
}
},
"node_modules/@angular-devkit/architect": {
"version": "0.2102.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.0.tgz",
"integrity": "sha512-kYFwTNzToG2SJMxj2f41w3QRtdqlrFuF+bpZrtIaHOP078Ktld8EPIp9KqB0Y46Vvs69ifby5Q1/wPD9wA3iaw==",
"version": "0.2102.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.1.tgz",
"integrity": "sha512-x2Qqz6oLYvEh9UBUG0AP1A4zROO/VP+k+zM9+4c2uZw1uqoBQFmutqgzncjVU7cR9R0RApgx9JRZHDFtQru68w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"rxjs": "7.8.2"
},
"bin": {
@@ -270,9 +270,9 @@
}
},
"node_modules/@angular-devkit/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.0.tgz",
"integrity": "sha512-HZdTn46Ca6qbb9Zef8R/+TWsk6mNKRm4rJyL3PxHP6HnVCwSPNZ0LNN9BjVREBs+UlRdXqBGFBZh5D1nBgu5GQ==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.1.tgz",
"integrity": "sha512-TpXGjERqVPN8EPt7LdmWAwh0oNQ/6uWFutzGZiXhJy81n1zb1O1XrqhRAmvP1cAo5O+na6IV2JkkCmxL6F8GUg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -298,13 +298,13 @@
}
},
"node_modules/@angular-devkit/schematics": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.0.tgz",
"integrity": "sha512-3kn3FI5v7BQ7Zct6raek+WgvyDwOJ8wElbyC903GxMQCDBRGGcevhHvTAIHhknihEsrgplzPhTlWeMbk1JfdFg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.1.tgz",
"integrity": "sha512-CWoamHaasAHMjHcYqxbj0tMnoXxdGotcAz2SpiuWtH28Lnf5xfbTaJn/lwdMP8Wdh4tgA+uYh2l45A5auCwmkw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.21",
"ora": "9.3.0",
@@ -317,9 +317,9 @@
}
},
"node_modules/@angular/animations": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.2.0.tgz",
"integrity": "sha512-SzlLoMT/r5wKqPicx5okCAiN5UD5+VE7x/F1G6gSJCcnBfbK5PqHPUmDnMW4jw9Ode06KZDT7ntstn6fG+Ld8w==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.2.2.tgz",
"integrity": "sha512-h+BKgBDI04Euu+SfEuvOOT/oFO31yg/DgFLvOBFTxab9dWoaeR3j4JsjMUTRJ+HmvAeo1jUm1F5vUf2Bn63Q+A==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -328,18 +328,18 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/core": "21.2.0"
"@angular/core": "21.2.2"
}
},
"node_modules/@angular/build": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.0.tgz",
"integrity": "sha512-K0EqiHz2y7TSyD4adWD0+C/P9khKlrsSWavXWxGRvoSJC/H3I3SK5Z6BWwftBibXR1Fis7njwvl5IGAlQrDchA==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.1.tgz",
"integrity": "sha512-cUpLNHJp9taII/FOcJHHfQYlMcZSRaf6eIxgSNS6Xfx1CeGoJNDN+J8+GFk+H1CPJt1EvbfyZ+dE5DbsgTD/QQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/architect": "0.2102.1",
"@babel/core": "7.29.0",
"@babel/helper-annotate-as-pure": "7.27.3",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -382,7 +382,7 @@
"@angular/platform-browser": "^21.0.0",
"@angular/platform-server": "^21.0.0",
"@angular/service-worker": "^21.0.0",
"@angular/ssr": "^21.2.0",
"@angular/ssr": "^21.2.1",
"karma": "^6.4.0",
"less": "^4.2.0",
"ng-packagr": "^21.0.0",
@@ -432,9 +432,9 @@
}
},
"node_modules/@angular/cdk": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.0.tgz",
"integrity": "sha512-1P0TNL1F51NC7JAaXabaAHY7Y1zBloLSZXfml1POa4a116V+y/QZfPGsxM0LwD1qSSXhSb2LNl7duTtJAP39bA==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.1.tgz",
"integrity": "sha512-JUFV8qLnO7CU5v4W0HzXSQrFkkJ4RH/qqdwrf9lup7YEnsLxB7cTGhsVisc9pWKAJsoNZ4pXCVOkqKc1mFL7dw==",
"license": "MIT",
"dependencies": {
"parse5": "^8.0.0",
@@ -448,19 +448,19 @@
}
},
"node_modules/@angular/cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.0.tgz",
"integrity": "sha512-yaGEpckqgOemcHkoWeH92i9eNrcbr9iE/dnxL+Du6s9spTAXJ2jjtYfszhmowuQZkCK5rjecMb8ctNtHlaGCjg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.1.tgz",
"integrity": "sha512-5SRfMTgwFj1zXOpfeZWHsxZBni0J4Xz7/CbewG47D6DmbstOrSdgt6eNzJ62R650t0G9dpri2YvToZgImtbjOQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/architect": "0.2102.1",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"@inquirer/prompts": "7.10.1",
"@listr2/prompt-adapter-inquirer": "3.0.5",
"@modelcontextprotocol/sdk": "1.26.0",
"@schematics/angular": "21.2.0",
"@schematics/angular": "21.2.1",
"@yarnpkg/lockfile": "1.1.0",
"algoliasearch": "5.48.1",
"ini": "6.0.0",
@@ -483,9 +483,9 @@
}
},
"node_modules/@angular/common": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.0.tgz",
"integrity": "sha512-6zJMPi0i/XDniEgv3/t2BjuDHiOG44lgIR5PYyxqGpgJ0kqB5hku/0TuentNEi1VnBYgthnfhjek7c+lakXmhw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.2.tgz",
"integrity": "sha512-xpVYV+MgqWzdjTCFxe3uJGpFOc84YrO4H4oX9HkzI5yQ5OLkQlndtq+OAUK8e330iacg4XHArft3SNDj1LaFfg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -494,14 +494,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/core": "21.2.0",
"@angular/core": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.0.tgz",
"integrity": "sha512-0RPkma8UVNpse/VJcXT9w6SKzTMz4J/uMGj0l9enM1frg9xrx1fwi/lLmaVV9Nr9LfqPjQdxNFFlvaBB7g/2zg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.2.tgz",
"integrity": "sha512-k7P0EH8I/Iwf2uRalSqhfokFbItTwdH7CmBJ7RKTRIH4FcrQcnqHetNKUMCOYXZtnlHIAnTpG+C+T4+6GTpYFg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -511,9 +511,9 @@
}
},
"node_modules/@angular/compiler-cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.0.tgz",
"integrity": "sha512-gZd58p0/JjgdxMX3v+LjCB6e3dBIfNVr/YzXoh55TfffdBCUQY94hl1+DFQkJ72K5EX+1zbaz03dIm30kw1bGw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.2.tgz",
"integrity": "sha512-TFg2wXUZ1FdUikNyR27PxuCXuqqlJhL6Mr/cBYuc4HbtBfgKw5FLffbI/iLubBEs55W5ApuYpBVuXKGoZp9SRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -534,7 +534,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"typescript": ">=5.9 <6.1"
},
"peerDependenciesMeta": {
@@ -544,9 +544,9 @@
}
},
"node_modules/@angular/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.0.tgz",
"integrity": "sha512-VnTbmZq3g3Q+s3nCZ8VUDMLjMezOg/bqUxAJ/DrRWCrEcTP5JO3mrNPs3FHj+qlB0T+BQP7uQv6QTzPVKybwoA==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.2.tgz",
"integrity": "sha512-ljiyiFjR6dgK27CNlOcMrjsDPYKFf2Rl89WLwGEGMOj0cJg/PSLQqpW/fbSkSB3SDgwG/WhXQ4Wrw525OKMupg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -555,7 +555,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0 || ~0.16.0"
},
@@ -569,9 +569,9 @@
}
},
"node_modules/@angular/forms": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.0.tgz",
"integrity": "sha512-NduUtPWLauH/FLayEDkLyaKAGqKzXbcfO7468LOWCXN3crhNVQyIWRQPOUcdpoJwDAGLpN85m3DhJhXNnA9c5w==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.2.tgz",
"integrity": "sha512-uiuL8uy4OpcbB0zRZ8TcvYXxe+GZC+XkCAptfrG+yAyzm4cOrqCilOZsMG6bVdOb2sjc2islk9CVDZZOju28/Q==",
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
@@ -581,22 +581,22 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/common": "21.2.0",
"@angular/core": "21.2.0",
"@angular/platform-browser": "21.2.0",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2",
"@angular/platform-browser": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/material": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/material/-/material-21.2.0.tgz",
"integrity": "sha512-GVJMgXa/jpy06b/txKMohuMDMu72Or576BSHKehnceYvI9sf25cnGGK1woNhALNDW449KReicAILujcFJ+mO6g==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/material/-/material-21.2.1.tgz",
"integrity": "sha512-+E7km7o1LZ0O+iE+sSX4M3r0WLPCOe0hwJp4o5hUM5jR+a2B+Ba14d4QWwN1r3R3qqwzCO1z5/44R0GoDkR2gg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
},
"peerDependencies": {
"@angular/cdk": "21.2.0",
"@angular/cdk": "21.2.1",
"@angular/common": "^21.0.0 || ^22.0.0",
"@angular/core": "^21.0.0 || ^22.0.0",
"@angular/forms": "^21.0.0 || ^22.0.0",
@@ -605,9 +605,9 @@
}
},
"node_modules/@angular/platform-browser": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.0.tgz",
"integrity": "sha512-IUGukpvvT2B5Dl76qzk6rY7UIHUT9u4BhT2AwVz+5JqcX9KwQtYD17Gt7wj6bvIgCXKWG+CfN8Zd9DECOCYWjg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.2.tgz",
"integrity": "sha512-6cHfHi/lRCUPNGO0eJeYRIpu8vM+CMMS2Wv/psOUwvl/5+RC92hfBEZxzQiF/5X9A170bJabaMFQC5fA7pkF2g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -616,9 +616,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/animations": "21.2.0",
"@angular/common": "21.2.0",
"@angular/core": "21.2.0"
"@angular/animations": "21.2.2",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -1417,9 +1417,9 @@
"optional": true
},
"node_modules/@hono/node-server": {
"version": "1.19.9",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz",
"integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==",
"version": "1.19.11",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz",
"integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3547,14 +3547,14 @@
]
},
"node_modules/@schematics/angular": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.0.tgz",
"integrity": "sha512-GQUIeGzZwCT9/W5MAkKnkwETROPbA1eRmy3JF56jLmvr95tJnypGOG8jGYy0d+tcEVujIouh48r4J3bJQg5mrw==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.1.tgz",
"integrity": "sha512-DjrHRMoILhbZ6tc7aNZWuHA1wCm1iU/JN1TxAwNEyIBgyU3Fx8Z5baK4w0TCpOIPt0RLWVgP2L7kka9aXWCUFA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -4053,9 +4053,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001775",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz",
"integrity": "sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==",
"version": "1.0.30001777",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz",
"integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==",
"dev": true,
"funding": [
{
@@ -4488,9 +4488,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
"version": "1.5.302",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
"integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==",
"version": "1.5.307",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz",
"integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==",
"dev": true,
"license": "ISC"
},
@@ -4738,13 +4738,13 @@
}
},
"node_modules/express-rate-limit": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz",
"integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==",
"version": "8.3.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.1.tgz",
"integrity": "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==",
"dev": true,
"license": "MIT",
"dependencies": {
"ip-address": "10.0.1"
"ip-address": "10.1.0"
},
"engines": {
"node": ">= 16"
@@ -5022,9 +5022,9 @@
}
},
"node_modules/hono": {
"version": "4.12.3",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.3.tgz",
"integrity": "sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==",
"version": "4.12.6",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.6.tgz",
"integrity": "sha512-KljEp+MeEEEIOT75qBo1UjqqB29fRMtlDEwCxcexOzdkUq6LR/vRvHk5pdROcxyOYyW1niq7Gb5pFVGy5R1eBw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5174,9 +5174,9 @@
}
},
"node_modules/immutable": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz",
"integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==",
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz",
"integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==",
"dev": true,
"license": "MIT"
},
@@ -5208,9 +5208,9 @@
}
},
"node_modules/ip-address": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
"integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5336,9 +5336,9 @@
}
},
"node_modules/jose": {
"version": "6.1.3",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz",
"integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==",
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.2.1.tgz",
"integrity": "sha512-jUaKr1yrbfaImV7R2TN/b3IcZzsw38/chqMpo2XJ7i2F8AfM/lA4G1goC3JVEwg0H7UldTmSt3P68nt31W7/mw==",
"dev": true,
"license": "MIT",
"funding": {
@@ -6023,9 +6023,9 @@
}
},
"node_modules/node-releases": {
"version": "2.0.27",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"version": "2.0.36",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
"integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==",
"dev": true,
"license": "MIT"
},
@@ -7234,9 +7234,9 @@
}
},
"node_modules/tar": {
"version": "7.5.9",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz",
"integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==",
"version": "7.5.11",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz",
"integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
@@ -249,13 +249,13 @@
}
},
"node_modules/@angular-devkit/architect": {
"version": "0.2102.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.0.tgz",
"integrity": "sha512-kYFwTNzToG2SJMxj2f41w3QRtdqlrFuF+bpZrtIaHOP078Ktld8EPIp9KqB0Y46Vvs69ifby5Q1/wPD9wA3iaw==",
"version": "0.2102.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.1.tgz",
"integrity": "sha512-x2Qqz6oLYvEh9UBUG0AP1A4zROO/VP+k+zM9+4c2uZw1uqoBQFmutqgzncjVU7cR9R0RApgx9JRZHDFtQru68w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"rxjs": "7.8.2"
},
"bin": {
@@ -268,9 +268,9 @@
}
},
"node_modules/@angular-devkit/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.0.tgz",
"integrity": "sha512-HZdTn46Ca6qbb9Zef8R/+TWsk6mNKRm4rJyL3PxHP6HnVCwSPNZ0LNN9BjVREBs+UlRdXqBGFBZh5D1nBgu5GQ==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.1.tgz",
"integrity": "sha512-TpXGjERqVPN8EPt7LdmWAwh0oNQ/6uWFutzGZiXhJy81n1zb1O1XrqhRAmvP1cAo5O+na6IV2JkkCmxL6F8GUg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -296,13 +296,13 @@
}
},
"node_modules/@angular-devkit/schematics": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.0.tgz",
"integrity": "sha512-3kn3FI5v7BQ7Zct6raek+WgvyDwOJ8wElbyC903GxMQCDBRGGcevhHvTAIHhknihEsrgplzPhTlWeMbk1JfdFg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.1.tgz",
"integrity": "sha512-CWoamHaasAHMjHcYqxbj0tMnoXxdGotcAz2SpiuWtH28Lnf5xfbTaJn/lwdMP8Wdh4tgA+uYh2l45A5auCwmkw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.21",
"ora": "9.3.0",
@@ -315,14 +315,14 @@
}
},
"node_modules/@angular/build": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.0.tgz",
"integrity": "sha512-K0EqiHz2y7TSyD4adWD0+C/P9khKlrsSWavXWxGRvoSJC/H3I3SK5Z6BWwftBibXR1Fis7njwvl5IGAlQrDchA==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.1.tgz",
"integrity": "sha512-cUpLNHJp9taII/FOcJHHfQYlMcZSRaf6eIxgSNS6Xfx1CeGoJNDN+J8+GFk+H1CPJt1EvbfyZ+dE5DbsgTD/QQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/architect": "0.2102.1",
"@babel/core": "7.29.0",
"@babel/helper-annotate-as-pure": "7.27.3",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -365,7 +365,7 @@
"@angular/platform-browser": "^21.0.0",
"@angular/platform-server": "^21.0.0",
"@angular/service-worker": "^21.0.0",
"@angular/ssr": "^21.2.0",
"@angular/ssr": "^21.2.1",
"karma": "^6.4.0",
"less": "^4.2.0",
"ng-packagr": "^21.0.0",
@@ -415,19 +415,19 @@
}
},
"node_modules/@angular/cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.0.tgz",
"integrity": "sha512-yaGEpckqgOemcHkoWeH92i9eNrcbr9iE/dnxL+Du6s9spTAXJ2jjtYfszhmowuQZkCK5rjecMb8ctNtHlaGCjg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.1.tgz",
"integrity": "sha512-5SRfMTgwFj1zXOpfeZWHsxZBni0J4Xz7/CbewG47D6DmbstOrSdgt6eNzJ62R650t0G9dpri2YvToZgImtbjOQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/architect": "0.2102.1",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"@inquirer/prompts": "7.10.1",
"@listr2/prompt-adapter-inquirer": "3.0.5",
"@modelcontextprotocol/sdk": "1.26.0",
"@schematics/angular": "21.2.0",
"@schematics/angular": "21.2.1",
"@yarnpkg/lockfile": "1.1.0",
"algoliasearch": "5.48.1",
"ini": "6.0.0",
@@ -450,9 +450,9 @@
}
},
"node_modules/@angular/common": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.0.tgz",
"integrity": "sha512-6zJMPi0i/XDniEgv3/t2BjuDHiOG44lgIR5PYyxqGpgJ0kqB5hku/0TuentNEi1VnBYgthnfhjek7c+lakXmhw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.2.tgz",
"integrity": "sha512-xpVYV+MgqWzdjTCFxe3uJGpFOc84YrO4H4oX9HkzI5yQ5OLkQlndtq+OAUK8e330iacg4XHArft3SNDj1LaFfg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -461,14 +461,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/core": "21.2.0",
"@angular/core": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.0.tgz",
"integrity": "sha512-0RPkma8UVNpse/VJcXT9w6SKzTMz4J/uMGj0l9enM1frg9xrx1fwi/lLmaVV9Nr9LfqPjQdxNFFlvaBB7g/2zg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.2.tgz",
"integrity": "sha512-k7P0EH8I/Iwf2uRalSqhfokFbItTwdH7CmBJ7RKTRIH4FcrQcnqHetNKUMCOYXZtnlHIAnTpG+C+T4+6GTpYFg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -478,9 +478,9 @@
}
},
"node_modules/@angular/compiler-cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.0.tgz",
"integrity": "sha512-gZd58p0/JjgdxMX3v+LjCB6e3dBIfNVr/YzXoh55TfffdBCUQY94hl1+DFQkJ72K5EX+1zbaz03dIm30kw1bGw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.2.tgz",
"integrity": "sha512-TFg2wXUZ1FdUikNyR27PxuCXuqqlJhL6Mr/cBYuc4HbtBfgKw5FLffbI/iLubBEs55W5ApuYpBVuXKGoZp9SRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -501,7 +501,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"typescript": ">=5.9 <6.1"
},
"peerDependenciesMeta": {
@@ -511,9 +511,9 @@
}
},
"node_modules/@angular/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.0.tgz",
"integrity": "sha512-VnTbmZq3g3Q+s3nCZ8VUDMLjMezOg/bqUxAJ/DrRWCrEcTP5JO3mrNPs3FHj+qlB0T+BQP7uQv6QTzPVKybwoA==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.2.tgz",
"integrity": "sha512-ljiyiFjR6dgK27CNlOcMrjsDPYKFf2Rl89WLwGEGMOj0cJg/PSLQqpW/fbSkSB3SDgwG/WhXQ4Wrw525OKMupg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -522,7 +522,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0 || ~0.16.0"
},
@@ -536,9 +536,9 @@
}
},
"node_modules/@angular/forms": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.0.tgz",
"integrity": "sha512-NduUtPWLauH/FLayEDkLyaKAGqKzXbcfO7468LOWCXN3crhNVQyIWRQPOUcdpoJwDAGLpN85m3DhJhXNnA9c5w==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.2.tgz",
"integrity": "sha512-uiuL8uy4OpcbB0zRZ8TcvYXxe+GZC+XkCAptfrG+yAyzm4cOrqCilOZsMG6bVdOb2sjc2islk9CVDZZOju28/Q==",
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
@@ -548,16 +548,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/common": "21.2.0",
"@angular/core": "21.2.0",
"@angular/platform-browser": "21.2.0",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2",
"@angular/platform-browser": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/platform-browser": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.0.tgz",
"integrity": "sha512-IUGukpvvT2B5Dl76qzk6rY7UIHUT9u4BhT2AwVz+5JqcX9KwQtYD17Gt7wj6bvIgCXKWG+CfN8Zd9DECOCYWjg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.2.tgz",
"integrity": "sha512-6cHfHi/lRCUPNGO0eJeYRIpu8vM+CMMS2Wv/psOUwvl/5+RC92hfBEZxzQiF/5X9A170bJabaMFQC5fA7pkF2g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -566,9 +566,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/animations": "21.2.0",
"@angular/common": "21.2.0",
"@angular/core": "21.2.0"
"@angular/animations": "21.2.2",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -577,9 +577,9 @@
}
},
"node_modules/@angular/router": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.0.tgz",
"integrity": "sha512-siliJ+jJRUCRZ0cdkqc7zww9Didz56Z0Z2YPIuR2n5TZLiuJY+jAf6xotXKp/v6v8XoGJwLiRNipGgNDRIAlWA==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.2.tgz",
"integrity": "sha512-mpVPI6AiIlZ4z6sSM5WOzCMwTka9yQ9TEVj9+ZyfAs5U9RnKDa8DZIoQ6BFbh3h/v4DArvT5q1Ji8aIlabmWcQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -588,9 +588,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/common": "21.2.0",
"@angular/core": "21.2.0",
"@angular/platform-browser": "21.2.0",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2",
"@angular/platform-browser": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
@@ -1385,9 +1385,9 @@
"optional": true
},
"node_modules/@hono/node-server": {
"version": "1.19.9",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz",
"integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==",
"version": "1.19.11",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz",
"integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3515,14 +3515,14 @@
]
},
"node_modules/@schematics/angular": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.0.tgz",
"integrity": "sha512-GQUIeGzZwCT9/W5MAkKnkwETROPbA1eRmy3JF56jLmvr95tJnypGOG8jGYy0d+tcEVujIouh48r4J3bJQg5mrw==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.1.tgz",
"integrity": "sha512-DjrHRMoILhbZ6tc7aNZWuHA1wCm1iU/JN1TxAwNEyIBgyU3Fx8Z5baK4w0TCpOIPt0RLWVgP2L7kka9aXWCUFA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -4021,9 +4021,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001775",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz",
"integrity": "sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==",
"version": "1.0.30001777",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz",
"integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==",
"dev": true,
"funding": [
{
@@ -4456,9 +4456,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
"version": "1.5.302",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
"integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==",
"version": "1.5.307",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz",
"integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==",
"dev": true,
"license": "ISC"
},
@@ -4706,13 +4706,13 @@
}
},
"node_modules/express-rate-limit": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz",
"integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==",
"version": "8.3.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.1.tgz",
"integrity": "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==",
"dev": true,
"license": "MIT",
"dependencies": {
"ip-address": "10.0.1"
"ip-address": "10.1.0"
},
"engines": {
"node": ">= 16"
@@ -4990,9 +4990,9 @@
}
},
"node_modules/hono": {
"version": "4.12.3",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.3.tgz",
"integrity": "sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==",
"version": "4.12.6",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.6.tgz",
"integrity": "sha512-KljEp+MeEEEIOT75qBo1UjqqB29fRMtlDEwCxcexOzdkUq6LR/vRvHk5pdROcxyOYyW1niq7Gb5pFVGy5R1eBw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5142,9 +5142,9 @@
}
},
"node_modules/immutable": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz",
"integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==",
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz",
"integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==",
"dev": true,
"license": "MIT"
},
@@ -5176,9 +5176,9 @@
}
},
"node_modules/ip-address": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
"integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5304,9 +5304,9 @@
}
},
"node_modules/jose": {
"version": "6.1.3",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz",
"integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==",
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.2.1.tgz",
"integrity": "sha512-jUaKr1yrbfaImV7R2TN/b3IcZzsw38/chqMpo2XJ7i2F8AfM/lA4G1goC3JVEwg0H7UldTmSt3P68nt31W7/mw==",
"dev": true,
"license": "MIT",
"funding": {
@@ -5991,9 +5991,9 @@
}
},
"node_modules/node-releases": {
"version": "2.0.27",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"version": "2.0.36",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
"integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==",
"dev": true,
"license": "MIT"
},
@@ -7204,9 +7204,9 @@
}
},
"node_modules/tar": {
"version": "7.5.9",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz",
"integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==",
"version": "7.5.11",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz",
"integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
+92 -92
View File
@@ -249,13 +249,13 @@
}
},
"node_modules/@angular-devkit/architect": {
"version": "0.2102.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.0.tgz",
"integrity": "sha512-kYFwTNzToG2SJMxj2f41w3QRtdqlrFuF+bpZrtIaHOP078Ktld8EPIp9KqB0Y46Vvs69ifby5Q1/wPD9wA3iaw==",
"version": "0.2102.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.1.tgz",
"integrity": "sha512-x2Qqz6oLYvEh9UBUG0AP1A4zROO/VP+k+zM9+4c2uZw1uqoBQFmutqgzncjVU7cR9R0RApgx9JRZHDFtQru68w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"rxjs": "7.8.2"
},
"bin": {
@@ -268,9 +268,9 @@
}
},
"node_modules/@angular-devkit/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.0.tgz",
"integrity": "sha512-HZdTn46Ca6qbb9Zef8R/+TWsk6mNKRm4rJyL3PxHP6HnVCwSPNZ0LNN9BjVREBs+UlRdXqBGFBZh5D1nBgu5GQ==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.1.tgz",
"integrity": "sha512-TpXGjERqVPN8EPt7LdmWAwh0oNQ/6uWFutzGZiXhJy81n1zb1O1XrqhRAmvP1cAo5O+na6IV2JkkCmxL6F8GUg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -296,13 +296,13 @@
}
},
"node_modules/@angular-devkit/schematics": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.0.tgz",
"integrity": "sha512-3kn3FI5v7BQ7Zct6raek+WgvyDwOJ8wElbyC903GxMQCDBRGGcevhHvTAIHhknihEsrgplzPhTlWeMbk1JfdFg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.1.tgz",
"integrity": "sha512-CWoamHaasAHMjHcYqxbj0tMnoXxdGotcAz2SpiuWtH28Lnf5xfbTaJn/lwdMP8Wdh4tgA+uYh2l45A5auCwmkw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/core": "21.2.1",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.21",
"ora": "9.3.0",
@@ -315,14 +315,14 @@
}
},
"node_modules/@angular/build": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.0.tgz",
"integrity": "sha512-K0EqiHz2y7TSyD4adWD0+C/P9khKlrsSWavXWxGRvoSJC/H3I3SK5Z6BWwftBibXR1Fis7njwvl5IGAlQrDchA==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.1.tgz",
"integrity": "sha512-cUpLNHJp9taII/FOcJHHfQYlMcZSRaf6eIxgSNS6Xfx1CeGoJNDN+J8+GFk+H1CPJt1EvbfyZ+dE5DbsgTD/QQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/architect": "0.2102.1",
"@babel/core": "7.29.0",
"@babel/helper-annotate-as-pure": "7.27.3",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -365,7 +365,7 @@
"@angular/platform-browser": "^21.0.0",
"@angular/platform-server": "^21.0.0",
"@angular/service-worker": "^21.0.0",
"@angular/ssr": "^21.2.0",
"@angular/ssr": "^21.2.1",
"karma": "^6.4.0",
"less": "^4.2.0",
"ng-packagr": "^21.0.0",
@@ -415,19 +415,19 @@
}
},
"node_modules/@angular/cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.0.tgz",
"integrity": "sha512-yaGEpckqgOemcHkoWeH92i9eNrcbr9iE/dnxL+Du6s9spTAXJ2jjtYfszhmowuQZkCK5rjecMb8ctNtHlaGCjg==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.1.tgz",
"integrity": "sha512-5SRfMTgwFj1zXOpfeZWHsxZBni0J4Xz7/CbewG47D6DmbstOrSdgt6eNzJ62R650t0G9dpri2YvToZgImtbjOQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/architect": "0.2102.0",
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/architect": "0.2102.1",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"@inquirer/prompts": "7.10.1",
"@listr2/prompt-adapter-inquirer": "3.0.5",
"@modelcontextprotocol/sdk": "1.26.0",
"@schematics/angular": "21.2.0",
"@schematics/angular": "21.2.1",
"@yarnpkg/lockfile": "1.1.0",
"algoliasearch": "5.48.1",
"ini": "6.0.0",
@@ -450,9 +450,9 @@
}
},
"node_modules/@angular/common": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.0.tgz",
"integrity": "sha512-6zJMPi0i/XDniEgv3/t2BjuDHiOG44lgIR5PYyxqGpgJ0kqB5hku/0TuentNEi1VnBYgthnfhjek7c+lakXmhw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.2.tgz",
"integrity": "sha512-xpVYV+MgqWzdjTCFxe3uJGpFOc84YrO4H4oX9HkzI5yQ5OLkQlndtq+OAUK8e330iacg4XHArft3SNDj1LaFfg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -461,14 +461,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/core": "21.2.0",
"@angular/core": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.0.tgz",
"integrity": "sha512-0RPkma8UVNpse/VJcXT9w6SKzTMz4J/uMGj0l9enM1frg9xrx1fwi/lLmaVV9Nr9LfqPjQdxNFFlvaBB7g/2zg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.2.tgz",
"integrity": "sha512-k7P0EH8I/Iwf2uRalSqhfokFbItTwdH7CmBJ7RKTRIH4FcrQcnqHetNKUMCOYXZtnlHIAnTpG+C+T4+6GTpYFg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -478,9 +478,9 @@
}
},
"node_modules/@angular/compiler-cli": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.0.tgz",
"integrity": "sha512-gZd58p0/JjgdxMX3v+LjCB6e3dBIfNVr/YzXoh55TfffdBCUQY94hl1+DFQkJ72K5EX+1zbaz03dIm30kw1bGw==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.2.tgz",
"integrity": "sha512-TFg2wXUZ1FdUikNyR27PxuCXuqqlJhL6Mr/cBYuc4HbtBfgKw5FLffbI/iLubBEs55W5ApuYpBVuXKGoZp9SRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -501,7 +501,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"typescript": ">=5.9 <6.1"
},
"peerDependenciesMeta": {
@@ -511,9 +511,9 @@
}
},
"node_modules/@angular/core": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.0.tgz",
"integrity": "sha512-VnTbmZq3g3Q+s3nCZ8VUDMLjMezOg/bqUxAJ/DrRWCrEcTP5JO3mrNPs3FHj+qlB0T+BQP7uQv6QTzPVKybwoA==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.2.tgz",
"integrity": "sha512-ljiyiFjR6dgK27CNlOcMrjsDPYKFf2Rl89WLwGEGMOj0cJg/PSLQqpW/fbSkSB3SDgwG/WhXQ4Wrw525OKMupg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -522,7 +522,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/compiler": "21.2.0",
"@angular/compiler": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0 || ~0.16.0"
},
@@ -536,9 +536,9 @@
}
},
"node_modules/@angular/forms": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.0.tgz",
"integrity": "sha512-NduUtPWLauH/FLayEDkLyaKAGqKzXbcfO7468LOWCXN3crhNVQyIWRQPOUcdpoJwDAGLpN85m3DhJhXNnA9c5w==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.2.tgz",
"integrity": "sha512-uiuL8uy4OpcbB0zRZ8TcvYXxe+GZC+XkCAptfrG+yAyzm4cOrqCilOZsMG6bVdOb2sjc2islk9CVDZZOju28/Q==",
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
@@ -548,16 +548,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/common": "21.2.0",
"@angular/core": "21.2.0",
"@angular/platform-browser": "21.2.0",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2",
"@angular/platform-browser": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/platform-browser": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.0.tgz",
"integrity": "sha512-IUGukpvvT2B5Dl76qzk6rY7UIHUT9u4BhT2AwVz+5JqcX9KwQtYD17Gt7wj6bvIgCXKWG+CfN8Zd9DECOCYWjg==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.2.tgz",
"integrity": "sha512-6cHfHi/lRCUPNGO0eJeYRIpu8vM+CMMS2Wv/psOUwvl/5+RC92hfBEZxzQiF/5X9A170bJabaMFQC5fA7pkF2g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -566,9 +566,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/animations": "21.2.0",
"@angular/common": "21.2.0",
"@angular/core": "21.2.0"
"@angular/animations": "21.2.2",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -577,9 +577,9 @@
}
},
"node_modules/@angular/router": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.0.tgz",
"integrity": "sha512-siliJ+jJRUCRZ0cdkqc7zww9Didz56Z0Z2YPIuR2n5TZLiuJY+jAf6xotXKp/v6v8XoGJwLiRNipGgNDRIAlWA==",
"version": "21.2.2",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.2.tgz",
"integrity": "sha512-mpVPI6AiIlZ4z6sSM5WOzCMwTka9yQ9TEVj9+ZyfAs5U9RnKDa8DZIoQ6BFbh3h/v4DArvT5q1Ji8aIlabmWcQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -588,9 +588,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
"@angular/common": "21.2.0",
"@angular/core": "21.2.0",
"@angular/platform-browser": "21.2.0",
"@angular/common": "21.2.2",
"@angular/core": "21.2.2",
"@angular/platform-browser": "21.2.2",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
@@ -1385,9 +1385,9 @@
"optional": true
},
"node_modules/@hono/node-server": {
"version": "1.19.9",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz",
"integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==",
"version": "1.19.11",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz",
"integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3515,14 +3515,14 @@
]
},
"node_modules/@schematics/angular": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.0.tgz",
"integrity": "sha512-GQUIeGzZwCT9/W5MAkKnkwETROPbA1eRmy3JF56jLmvr95tJnypGOG8jGYy0d+tcEVujIouh48r4J3bJQg5mrw==",
"version": "21.2.1",
"resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.1.tgz",
"integrity": "sha512-DjrHRMoILhbZ6tc7aNZWuHA1wCm1iU/JN1TxAwNEyIBgyU3Fx8Z5baK4w0TCpOIPt0RLWVgP2L7kka9aXWCUFA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "21.2.0",
"@angular-devkit/schematics": "21.2.0",
"@angular-devkit/core": "21.2.1",
"@angular-devkit/schematics": "21.2.1",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -4021,9 +4021,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001775",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz",
"integrity": "sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==",
"version": "1.0.30001777",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz",
"integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==",
"dev": true,
"funding": [
{
@@ -4456,9 +4456,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
"version": "1.5.302",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
"integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==",
"version": "1.5.307",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz",
"integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==",
"dev": true,
"license": "ISC"
},
@@ -4706,13 +4706,13 @@
}
},
"node_modules/express-rate-limit": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz",
"integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==",
"version": "8.3.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.1.tgz",
"integrity": "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==",
"dev": true,
"license": "MIT",
"dependencies": {
"ip-address": "10.0.1"
"ip-address": "10.1.0"
},
"engines": {
"node": ">= 16"
@@ -4990,9 +4990,9 @@
}
},
"node_modules/hono": {
"version": "4.12.3",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.3.tgz",
"integrity": "sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==",
"version": "4.12.6",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.6.tgz",
"integrity": "sha512-KljEp+MeEEEIOT75qBo1UjqqB29fRMtlDEwCxcexOzdkUq6LR/vRvHk5pdROcxyOYyW1niq7Gb5pFVGy5R1eBw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5142,9 +5142,9 @@
}
},
"node_modules/immutable": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz",
"integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==",
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz",
"integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==",
"dev": true,
"license": "MIT"
},
@@ -5176,9 +5176,9 @@
}
},
"node_modules/ip-address": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
"integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5304,9 +5304,9 @@
}
},
"node_modules/jose": {
"version": "6.1.3",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz",
"integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==",
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.2.1.tgz",
"integrity": "sha512-jUaKr1yrbfaImV7R2TN/b3IcZzsw38/chqMpo2XJ7i2F8AfM/lA4G1goC3JVEwg0H7UldTmSt3P68nt31W7/mw==",
"dev": true,
"license": "MIT",
"funding": {
@@ -5991,9 +5991,9 @@
}
},
"node_modules/node-releases": {
"version": "2.0.27",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"version": "2.0.36",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
"integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==",
"dev": true,
"license": "MIT"
},
@@ -7204,9 +7204,9 @@
}
},
"node_modules/tar": {
"version": "7.5.9",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz",
"integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==",
"version": "7.5.11",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz",
"integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
+1
View File
@@ -22,6 +22,7 @@
"externalDependencies": ["xhr2"],
"browser": "src/main.ts",
"tsConfig": "tsconfig.app.json",
"polyfills": ["@angular/localize/init"],
"assets": [
{
"glob": "**/*",
+1
View File
@@ -13,6 +13,7 @@
"@angular/forms": "workspace:*",
"@angular/platform-browser": "workspace:*",
"@angular/platform-server": "workspace:*",
"@angular/localize": "workspace:*",
"@angular/router": "workspace:*",
"@angular/ssr": "21.2.0",
"rxjs": "~7.8.0",
+1 -1
View File
@@ -1,4 +1,4 @@
load("@aspect_bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin")
load("@bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin")
exports_files(
glob(["*"]),
@@ -69,7 +69,7 @@ describe('diff', () => {
expect(host).toEqual(newArr);
});
it('should add remove an item', () => {
it('should add remove an item (1)', () => {
const newArr = [host[0], host[2]];
const output = diff(differ, host, newArr);
@@ -82,7 +82,7 @@ describe('diff', () => {
expect(host).toEqual(newArr);
});
it('should add remove an item', () => {
it('should add remove an item (2)', () => {
// Note that an item will be marked as
// updated only if its reference changes.
const newArr = [
+2 -2
View File
@@ -1,9 +1,9 @@
# Re-export of Bazel rules with devtools-wide defaults
load("@aspect_bazel_lib//lib:copy_to_bin.bzl", _copy_to_bin = "copy_to_bin")
load("@aspect_bazel_lib//lib:copy_to_directory.bzl", _copy_to_directory = "copy_to_directory")
load("@aspect_rules_esbuild//esbuild:defs.bzl", _esbuild = "esbuild")
load("@aspect_rules_js//js:defs.bzl", _js_library = "js_library")
load("@bazel_lib//lib:copy_to_bin.bzl", _copy_to_bin = "copy_to_bin")
load("@bazel_lib//lib:copy_to_directory.bzl", _copy_to_directory = "copy_to_directory")
load("@bazel_skylib//rules:common_settings.bzl", _string_flag = "string_flag")
load(
"//tools:defaults.bzl",
+1 -1
View File
@@ -1042,7 +1042,7 @@ export abstract class ViewportScroller {
abstract setHistoryScrollRestoration(scrollRestoration: 'auto' | 'manual'): void;
abstract setOffset(offset: [number, number] | (() => [number, number])): void;
// (undocumented)
static ɵprov: unknown;
static ɵprov: i0.ɵɵInjectableDeclaration<NullViewportScroller | BrowserViewportScroller>;
}
// @public @deprecated
@@ -4,6 +4,8 @@
```ts
import { ɵɵInjectableDeclaration } from '@angular/core';
// @public
export function applyChanges(component: {}): void;
+9 -8
View File
@@ -4,6 +4,7 @@
```ts
import * as _angular_core from '@angular/core';
import { Observable } from 'rxjs';
import { Subject } from 'rxjs';
import { Subscription } from 'rxjs';
@@ -977,7 +978,7 @@ export abstract class Injector {
// (undocumented)
static THROW_IF_NOT_FOUND: {};
// (undocumented)
static ɵprov: unknown;
static ɵprov: _angular_core.ɵɵInjectableDeclaration<Injector>;
}
// @public
@@ -1106,7 +1107,7 @@ export class IterableDiffers {
// (undocumented)
find(iterable: any): IterableDifferFactory;
// (undocumented)
static ɵprov: unknown;
static ɵprov: _angular_core.ɵɵInjectableDeclaration<IterableDiffers>;
}
// @public
@@ -1143,12 +1144,12 @@ export interface KeyValueDifferFactory {
export class KeyValueDiffers {
constructor(factories: KeyValueDifferFactory[]);
// (undocumented)
static create<S>(factories: KeyValueDifferFactory[], parent?: KeyValueDiffers): KeyValueDiffers;
static extend<S>(factories: KeyValueDifferFactory[]): StaticProvider;
static create(factories: KeyValueDifferFactory[], parent?: KeyValueDiffers): KeyValueDiffers;
static extend(factories: KeyValueDifferFactory[]): StaticProvider;
// (undocumented)
find(kv: any): KeyValueDifferFactory;
// (undocumented)
static ɵprov: unknown;
static ɵprov: _angular_core.ɵɵInjectableDeclaration<KeyValueDiffers>;
}
// @public
@@ -1405,7 +1406,7 @@ export class PendingTasks {
add(): () => void;
run(fn: () => Promise<unknown>): void;
// (undocumented)
static ɵprov: unknown;
static ɵprov: _angular_core.ɵɵInjectableDeclaration<PendingTasks>;
}
// @public
@@ -1725,7 +1726,7 @@ export abstract class Sanitizer {
// (undocumented)
abstract sanitize(context: SecurityContext, value: {} | string | null): string | null;
// (undocumented)
static ɵprov: unknown;
static ɵprov: _angular_core.ɵɵInjectableDeclaration<null>;
}
// @public
@@ -1886,7 +1887,7 @@ export class TransferState {
set<T>(key: StateKey<T>, value: T): void;
toJson(): string;
// (undocumented)
static ɵprov: unknown;
static ɵprov: _angular_core.ɵɵInjectableDeclaration<TransferState>;
}
// @public
@@ -4,6 +4,7 @@
```ts
import * as _angular_core from '@angular/core';
import { MonoTypeOperatorFunction } from 'rxjs';
import { Observable } from 'rxjs';
import { Subscribable } from 'rxjs';
@@ -4,6 +4,7 @@
```ts
import * as _angular_core from '@angular/core';
import { Observable } from 'rxjs';
import { Subject } from 'rxjs';
import { Subscription } from 'rxjs';
+1 -1
View File
@@ -38,5 +38,5 @@
"ts-node": "^10.9.1",
"typescript": "5.9.3"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
+302 -246
View File
File diff suppressed because it is too large Load Diff
@@ -45,5 +45,5 @@
"ts-node": "^10.9.1",
"typescript": "5.9.3"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
File diff suppressed because it is too large Load Diff
@@ -27,5 +27,5 @@
"ts-node": "^10.9.1",
"typescript": "5.9.3"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -32,5 +32,5 @@
"ts-node": "^10.9.1",
"typescript": "5.9.3"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -10,7 +10,7 @@
"lint": "ng lint",
"e2e": "ng build --configuration production && concurrently \"serve dist/browser -l 4210 --no-clipboard --single\" \"protractor e2e/protractor.conf.js --baseUrl=http://localhost:4210\" --kill-others --success first"
},
"packageManager": "pnpm@10.30.3",
"packageManager": "pnpm@10.32.0",
"private": true,
"dependencies": {
"@angular/animations": "link:./in-existing-linked-by-bazel",
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -30,5 +30,5 @@
"ts-node": "10.9.2",
"typescript": "5.9.3"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
+290 -235
View File
File diff suppressed because it is too large Load Diff
@@ -30,5 +30,5 @@
"ts-node": "^10.9.1",
"typescript": "5.9.3"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -39,5 +39,5 @@
"ts-node": "^10.9.1",
"typescript": "5.9.3"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -27,5 +27,5 @@
"@types/node": "^20.14.8",
"typescript": "5.9.3"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -33,5 +33,5 @@
"protractor": "protractor e2e/protractor.config.js"
},
"private": true,
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
+22 -22
View File
@@ -336,8 +336,8 @@ packages:
'@types/jasminewd2@2.0.13':
resolution: {integrity: sha512-aJ3wj8tXMpBrzQ5ghIaqMisD8C3FIrcO6sDKHqFbuqAsI7yOxj0fA7MrRCPLZHIVUjERIwsMmGn/vB0UQ9u0Hg==}
'@types/node@25.3.3':
resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==}
'@types/node@25.3.5':
resolution: {integrity: sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==}
'@types/q@0.0.32':
resolution: {integrity: sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==}
@@ -486,8 +486,8 @@ packages:
resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
engines: {node: '>=6'}
caniuse-lite@1.0.30001775:
resolution: {integrity: sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==}
caniuse-lite@1.0.30001777:
resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==}
caseless@0.12.0:
resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
@@ -648,8 +648,8 @@ packages:
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
electron-to-chromium@1.5.302:
resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==}
electron-to-chromium@1.5.307:
resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==}
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -833,8 +833,8 @@ packages:
immediate@3.0.6:
resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
immutable@3.8.2:
resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==}
immutable@3.8.3:
resolution: {integrity: sha512-AUY/VyX0E5XlibOmWt10uabJzam1zlYjwiEgQSDc5+UIkFNaF9WM0JxXKaNMGf+F/ffUF+7kRKXM9A7C0xXqMg==}
engines: {node: '>=0.10.0'}
inflight@1.0.6:
@@ -1020,8 +1020,8 @@ packages:
resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
engines: {node: '>= 0.6'}
node-releases@2.0.27:
resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
node-releases@2.0.36:
resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==}
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
@@ -1722,7 +1722,7 @@ snapshots:
'@types/cors@2.8.19':
dependencies:
'@types/node': 25.3.3
'@types/node': 25.3.5
'@types/estree@1.0.8': {}
@@ -1732,7 +1732,7 @@ snapshots:
dependencies:
'@types/jasmine': 6.0.0
'@types/node@25.3.3':
'@types/node@25.3.5':
dependencies:
undici-types: 7.18.2
@@ -1845,7 +1845,7 @@ snapshots:
async-each-series: 0.1.1
chalk: 4.1.2
connect-history-api-fallback: 1.6.0
immutable: 3.8.2
immutable: 3.8.3
server-destroy: 1.0.1
socket.io-client: 4.8.3
stream-throttle: 0.1.3
@@ -1870,7 +1870,7 @@ snapshots:
fresh: 0.5.2
fs-extra: 3.0.1
http-proxy: 1.18.1
immutable: 3.8.2
immutable: 3.8.3
localtunnel: 2.0.2
micromatch: 4.0.8
opn: 5.3.0
@@ -1894,9 +1894,9 @@ snapshots:
browserslist@4.28.1:
dependencies:
baseline-browser-mapping: 2.10.0
caniuse-lite: 1.0.30001775
electron-to-chromium: 1.5.302
node-releases: 2.0.27
caniuse-lite: 1.0.30001777
electron-to-chromium: 1.5.307
node-releases: 2.0.36
update-browserslist-db: 1.2.3(browserslist@4.28.1)
browserstack@1.6.1:
@@ -1911,7 +1911,7 @@ snapshots:
camelcase@5.3.1: {}
caniuse-lite@1.0.30001775: {}
caniuse-lite@1.0.30001777: {}
caseless@0.12.0: {}
@@ -2068,7 +2068,7 @@ snapshots:
ee-first@1.1.1: {}
electron-to-chromium@1.5.302: {}
electron-to-chromium@1.5.307: {}
emoji-regex@8.0.0: {}
@@ -2091,7 +2091,7 @@ snapshots:
engine.io@6.6.5:
dependencies:
'@types/cors': 2.8.19
'@types/node': 25.3.3
'@types/node': 25.3.5
accepts: 1.3.8
base64id: 2.0.0
cookie: 0.7.2
@@ -2271,7 +2271,7 @@ snapshots:
immediate@3.0.6: {}
immutable@3.8.2: {}
immutable@3.8.3: {}
inflight@1.0.6:
dependencies:
@@ -2439,7 +2439,7 @@ snapshots:
negotiator@0.6.3: {}
node-releases@2.0.27: {}
node-releases@2.0.36: {}
normalize-path@3.0.0: {}
+1 -1
View File
@@ -21,5 +21,5 @@
"typescript": "5.9.3",
"zone.js": "0.16.0"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
+1 -1
View File
@@ -13,5 +13,5 @@
"scripts": {
"test": "node ./test.mjs"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
+1 -1
View File
@@ -27,5 +27,5 @@
"scripts": {
"test": "tsc"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
@@ -41,5 +41,5 @@
"ts-node": "^10.9.1",
"typescript": "5.9.3"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
File diff suppressed because it is too large Load Diff
@@ -43,5 +43,5 @@
"ts-node": "^10.9.1",
"typescript": "5.9.3"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -47,5 +47,5 @@
"ts-node": "^10.9.1",
"typescript": "5.9.3"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
File diff suppressed because it is too large Load Diff
@@ -13,5 +13,5 @@
"rxjs": "^7.0.0",
"zone.js": "0.16.0"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
+1 -1
View File
@@ -16,5 +16,5 @@
"@angular/router": "link:./in-existing-linked-by-bazel",
"check-side-effects": "0.0.23"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
+5 -5
View File
@@ -70,8 +70,8 @@ packages:
'@types/node@11.15.54':
resolution: {integrity: sha512-1RWYiq+5UfozGsU6MwJyFX6BtktcT10XRjvcAQmskCtMcW3tPske88lM/nHv7BQG1w9KBXI1zPGuu5PnNCX14g==}
'@types/node@25.3.3':
resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==}
'@types/node@25.3.5':
resolution: {integrity: sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==}
'@types/resolve@0.0.8':
resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==}
@@ -262,13 +262,13 @@ snapshots:
'@types/node@11.15.54': {}
'@types/node@25.3.3':
'@types/node@25.3.5':
dependencies:
undici-types: 7.18.2
'@types/resolve@0.0.8':
dependencies:
'@types/node': 25.3.3
'@types/node': 25.3.5
acorn@6.4.2: {}
@@ -311,7 +311,7 @@ snapshots:
jest-worker@26.6.2:
dependencies:
'@types/node': 25.3.3
'@types/node': 25.3.5
merge-stream: 2.0.0
supports-color: 7.2.0
@@ -31,5 +31,5 @@
"ts-node": "^10.9.1",
"typescript": "5.9.3"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -14,5 +14,5 @@
"typescript": "5.9.3",
"zone.js": "0.16.0"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
+1 -1
View File
@@ -45,5 +45,5 @@
"ts-node": "^10.9.1",
"typescript": "5.9.3"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
+309 -269
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -26,5 +26,5 @@
"scripts": {
"test": "tsc"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
+4 -4
View File
@@ -52,7 +52,7 @@ importers:
version: 6.0.0
'@types/node':
specifier: ^20.14.8
version: 20.19.35
version: 20.19.37
rxjs:
specifier: ^7.0.0
version: 7.8.2
@@ -68,8 +68,8 @@ packages:
'@types/jasmine@6.0.0':
resolution: {integrity: sha512-18lgGsLmEh3VJk9eZ5wAjTISxdqzl6YOwu8UdMpolajN57QOCNbl+AbHUd+Yu9ItrsFdB+c8LSZSGNg8nHaguw==}
'@types/node@20.19.35':
resolution: {integrity: sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ==}
'@types/node@20.19.37':
resolution: {integrity: sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==}
rxjs@7.8.2:
resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
@@ -92,7 +92,7 @@ snapshots:
'@types/jasmine@6.0.0': {}
'@types/node@20.19.35':
'@types/node@20.19.37':
dependencies:
undici-types: 6.21.0
+1 -1
View File
@@ -26,5 +26,5 @@
"scripts": {
"test": "tsc"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
+1 -1
View File
@@ -26,5 +26,5 @@
"scripts": {
"test": "tsc"
},
"packageManager": "pnpm@10.30.3"
"packageManager": "pnpm@10.32.0"
}
+3 -3
View File
@@ -1,16 +1,16 @@
{
"name": "angular-srcs",
"version": "21.2.2",
"version": "21.2.4",
"private": true,
"description": "Angular - a web framework for modern web apps",
"homepage": "https://github.com/angular/angular",
"bugs": "https://github.com/angular/angular/issues",
"license": "MIT",
"packageManager": "pnpm@10.30.3",
"packageManager": "pnpm@10.32.0",
"engines": {
"npm": "Please use pnpm instead of NPM to install dependencies",
"yarn": "Please use pnpm instead of Yarn to install dependencies",
"pnpm": "10.30.3"
"pnpm": "10.32.0"
},
"repository": {
"type": "git",
@@ -1198,7 +1198,7 @@ describe('Animation', () => {
});
describe('query()', () => {
it('should delay the query operation if a delay option is provided', () => {
it('should delay the query operation if a delay option is provided (1)', () => {
const steps = [
style({opacity: 0}),
animate(1000, style({opacity: 1})),
@@ -1244,7 +1244,7 @@ describe('Animation', () => {
}).not.toThrow();
});
it('should delay the query operation if a delay option is provided', () => {
it('should delay the query operation if a delay option is provided (2)', () => {
const steps = [
style({opacity: 0}),
animate(1300, style({opacity: 1})),
@@ -61,7 +61,7 @@ export type CldrLocaleAliasReason =
export class CldrData {
/** Path to the CLDR JSON data Bazel repository. i.e. `@cldr_json_data//`. */
readonly cldrDataDir = dirname(
resolve(process.env['RUNFILES']!, process.env['CLDR_JSON_DATA_RUNFILES_PATH']!),
resolve(process.env['JS_BINARY__RUNFILES']!, process.env['CLDR_JSON_DATA_RUNFILES_PATH']!),
);
/** List of all available locales CLDR provides data for. */
@@ -12,7 +12,9 @@ import {load as createCldr} from 'cldr';
// Load once to avoid re-parsing CLDR XML data on every invocation.
const cldr = createCldr(
dirname(resolve(process.env['RUNFILES']!, process.env['CLDR_XML_DATA_RUNFILES_PATH']!)),
dirname(
resolve(process.env['JS_BINARY__RUNFILES']!, process.env['CLDR_XML_DATA_RUNFILES_PATH']!),
),
);
/**
+1 -1
View File
@@ -1,4 +1,4 @@
load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_file")
load("@bazel_lib//lib:write_source_files.bzl", "write_source_file")
load("@cldr_json_data//:index.bzl", _ALL_CLDR_LOCALES = "LOCALES")
load("//tools:defaults.bzl", "js_run_binary")
@@ -1,4 +1,4 @@
/**
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
@@ -496,7 +496,7 @@ function getInheritedUndecoratedCtorDiagnostic(
* from external files. This is a common scenario for errors in local compilation mode,
* and so this helper can be used to quickly generate the relevant errors.
*
* @param nodeToHighlight Node to be highlighted in teh error message.
* @param nodeToHighlight Node to be highlighted in the error message.
* Will default to value.node if not provided.
*/
export function assertLocalCompilationUnresolvedConst(
@@ -20,6 +20,7 @@ export type ExtendedCompilerHostMethods =
// Used to normalize filenames for the host system. Important for proper case-sensitive file
// handling.
| 'getCanonicalFileName'
| 'getSourceFile'
// An optional method of `ts.CompilerHost` where an implementer can override module resolution.
| 'resolveModuleNames'
// Retrieve the current working directory. Unlike in `ts.ModuleResolutionHost`, this is a
@@ -44,7 +45,8 @@ export interface NgCompilerAdapter
// getCurrentDirectory is removed from `ts.ModuleResolutionHost` because it's optional, and
// incompatible with the `ts.CompilerHost` version which isn't. The combination of these two
// still satisfies `ts.ModuleResolutionHost`.
extends Omit<ts.ModuleResolutionHost, 'getCurrentDirectory'>,
extends
Omit<ts.ModuleResolutionHost, 'getCurrentDirectory'>,
Pick<ExtendedTsCompilerHost, 'getCurrentDirectory' | ExtendedCompilerHostMethods>,
SourceFileTypeIdentifier {
/**
@@ -423,7 +423,6 @@ export class NgCompiler {
ticket.programDriver,
ticket.incrementalBuildStrategy,
IncrementalCompilation.fresh(
ticket.tsProgram,
versionMapFromProgram(ticket.tsProgram, ticket.programDriver),
),
ticket.enableTemplateTypeChecker,
@@ -101,10 +101,7 @@ export class IncrementalCompilation implements IncrementalBuild<ClassRecord, Fil
/**
* Begin a fresh `IncrementalCompilation`.
*/
static fresh(
program: ts.Program,
versions: Map<AbsoluteFsPath, string> | null,
): IncrementalCompilation {
static fresh(versions: Map<AbsoluteFsPath, string> | null): IncrementalCompilation {
const state: IncrementalState = {
kind: IncrementalStateKind.Fresh,
};
@@ -128,7 +125,7 @@ export class IncrementalCompilation implements IncrementalBuild<ClassRecord, Fil
case IncrementalStateKind.Fresh:
// Since this line of program has never been successfully analyzed to begin with, treat
// this as a fresh compilation.
return IncrementalCompilation.fresh(program, newVersions);
return IncrementalCompilation.fresh(newVersions);
case IncrementalStateKind.Analyzed:
// The most recent program was analyzed successfully, so we can use that as our prior
// state and don't need to consider any other deltas except changes in the most recent
@@ -189,7 +186,7 @@ export class IncrementalCompilation implements IncrementalBuild<ClassRecord, Fil
// Bail out if a .d.ts file changes - the semantic dep graph is not able to process such
// changes correctly yet.
if (sf.isDeclarationFile) {
return IncrementalCompilation.fresh(program, newVersions);
return IncrementalCompilation.fresh(newVersions);
}
// The file has changed physically, so record it.
@@ -22,7 +22,7 @@ runInEachFileSystem(() => {
const traitCompiler = {getAnalyzedRecords: () => new Map()} as TraitCompiler;
const versionMapFirst = new Map([[FOO_PATH, 'version.1']]);
const firstCompilation = IncrementalCompilation.fresh(program, versionMapFirst);
const firstCompilation = IncrementalCompilation.fresh(versionMapFirst);
firstCompilation.recordSuccessfulAnalysis(traitCompiler);
firstCompilation.recordSuccessfulEmit(fooSf);
@@ -22,7 +22,7 @@ export function getAngularPackagesFromRunfiles() {
const runfilesManifestPath = process.env['RUNFILES_MANIFEST_FILE'];
if (!runfilesManifestPath) {
const packageRunfilesDir = path.join(process.env['RUNFILES']!, '_main/packages');
const packageRunfilesDir = path.join(process.env['JS_BINARY__RUNFILES']!, '_main/packages');
return fs
.readdirSync(packageRunfilesDir)
@@ -43,5 +43,5 @@ export function getAngularPackagesFromRunfiles() {
/** Resolves a file or directory from the Bazel runfiles. */
export function resolveFromRunfiles(manifestPath: string) {
return path.resolve(process.env['RUNFILES']!, manifestPath);
return path.resolve(process.env['JS_BINARY__RUNFILES']!, manifestPath);
}
@@ -18,6 +18,18 @@ To understand and check the types of various operations and structures within te
TCBs are not ever emitted, nor are they referenced from any other code (they're unused code as far as TypeScript is concerned). Their _runtime_ effect is therefore unimportant. What matters is that they express to TypeScript the type relationships of directives, bindings, and other entities in the template. Type errors within TCBs translate directly to type errors in the original template.
### AST-Free Metadata & Preprocessor Integration
As Angular evolves toward supporting alternative compilation pipelines (such as a native Rust compiler or a fast native TS parser like `ts-go`), the mechanism for providing information about components, directives, and pipes to the TCB generator has been abstracted.
Instead of directly passing TypeScript AST nodes representing the original program (`ts.Node`, `ts.Declaration`, `ClassDeclaration`, etc.), the type checking system relies on "AST-free" metadata interfaces (e.g., `TcbDirectiveMetadata`, `TcbReferenceMetadata`).
When operating in the traditional TypeScript compiler (`ngc`), a "TCB Adapter" translates the internal TS-bound metadata into these AST-free structures.
When operating in an environment where the Angular application is analyzed by a separate preprocessor process (whether `ts-go` or Rust), the indexer performs the analysis and serializes this exact same AST-free metadata over an IPC boundary directly to the TS-based TCB generator. This enables the existing, robust TS-based template type checker (which heavily relies on TypeScript's inference engines) to continue functioning without needing to port the entire template type checking and `TcbOp` implementation to the native preprocessor.
**Note on AST Generation:** While the metadata is "AST-free" in the sense that it is entirely disconnected from the original user's `ts.Program`, the TCB generation process is still fundamentally tied to TypeScript factory APIs. Because of this, certain metadata fields (such as `TcbInputMapping.transformType` and `TcbComponentMetadata.typeParameters`) are passed as strings which are parsed into AST nodes by the TCB generator. In a hybrid architecture, the native preprocessor is expected to serialize these scopes and types as strings, and the TypeScript coordinator (Node.js) is responsible for parsing these strings back into detached TypeScript AST nodes before passing them to the TCB generator. This avoids unnecessary serialization costs when the TCB generator runs directly within the existing TypeScript codebase.
### Theory
Given a component `SomeCmp`, its TCB takes the form of a function:
@@ -8,10 +8,22 @@
import {
AbsoluteSourceSpan,
AST,
BoundTarget,
DirectiveMeta,
DirectiveOwner,
LegacyAnimationTriggerNames,
ParseSourceSpan,
SchemaMetadata,
TemplateEntity,
TmplAstBoundAttribute,
TmplAstBoundEvent,
TmplAstComponent,
TmplAstDirective,
TmplAstElement,
TmplAstReference,
TmplAstTemplate,
TmplAstTextAttribute,
} from '@angular/compiler';
import ts from 'typescript';
@@ -19,13 +31,102 @@ import {ErrorCode} from '../../diagnostics';
import {Reference} from '../../imports';
import {
ClassPropertyMapping,
ClassPropertyName,
DirectiveTypeCheckMeta,
HostDirectiveMeta,
InputMapping,
InputOrOutput,
PipeMeta,
TemplateGuardMeta,
} from '../../metadata';
import {ClassDeclaration} from '../../reflection';
export interface TcbReferenceMetadata {
/** The name of the class */
name: string;
/** The module path where the symbol is located, or null if local/ambient */
moduleName: string | null;
/** True if the symbol successfully emitted locally (no external import required) */
isLocal: boolean;
/** If the reference could not be externally emitted, this string holds the diagnostic reason why */
unexportedDiagnostic: string | null;
/**
* Defines the `AbsoluteSourceSpan` of the target's node name, if available.
*/
nodeNameSpan?: AbsoluteSourceSpan;
/**
* The absolute path to the file containing the reference node, if available.
*/
nodeFilePath?: string;
}
export type TcbReferenceKey = string & {__brand: 'TcbReferenceKey'};
export interface TcbTypeParameter {
name: string;
representation: string;
representationWithDefault: string;
}
export type TcbInputMapping = InputOrOutput & {
required: boolean;
/**
* AST-free string representation of the transform type of the input, if available.
*/
transformType?: string;
};
export interface TcbPipeMetadata {
name: string;
ref: TcbReferenceMetadata;
isExplicitlyDeferred: boolean;
}
export interface TcbDirectiveMetadata {
ref: TcbReferenceMetadata;
name: string;
selector: string | null;
isComponent: boolean;
isGeneric: boolean;
isStructural: boolean;
isStandalone: boolean;
isExplicitlyDeferred: boolean;
preserveWhitespaces: boolean;
exportAs: string[] | null;
/** Type parameters of the directive, if available. */
typeParameters: TcbTypeParameter[] | null;
inputs: ClassPropertyMapping<TcbInputMapping>;
outputs: ClassPropertyMapping;
hasRequiresInlineTypeCtor: boolean;
ngTemplateGuards: TemplateGuardMeta[];
hasNgTemplateContextGuard: boolean;
hasNgFieldDirective: boolean;
coercedInputFields: Set<ClassPropertyName>;
restrictedInputFields: Set<ClassPropertyName>;
stringLiteralInputFields: Set<ClassPropertyName>;
undeclaredInputFields: Set<ClassPropertyName>;
publicMethods: Set<string>;
ngContentSelectors: string[] | null;
animationTriggerNames: LegacyAnimationTriggerNames | null;
}
export interface TcbComponentMetadata {
ref: TcbReferenceMetadata;
typeParameters: TcbTypeParameter[] | null;
}
export interface TcbTypeCheckBlockMetadata {
id: TypeCheckId;
boundTarget: BoundTarget<TcbDirectiveMetadata>;
pipes: Map<string, TcbPipeMetadata> | null;
schemas: SchemaMetadata[];
isStandalone: boolean;
preserveWhitespaces: boolean;
}
/**
* Extension of `DirectiveMeta` that includes additional information required to type-check the
* usage of a particular directive.
@@ -119,7 +220,7 @@ export interface TypeCtorMetadata {
/**
* Input, output, and query field names in the type which should be included as constructor input.
*/
fields: {inputs: ClassPropertyMapping<InputMapping>; queries: string[]};
fields: {inputs: ClassPropertyMapping<TcbInputMapping>};
/**
* `Set` of field names which have type coercion enabled.
@@ -175,6 +175,52 @@ runInEachFileSystem(() => {
expect(diags.length).toBe(0);
});
it('should *not* produce a warning for custom structural directives imported from another file', () => {
const fileName = absoluteFrom('/main.ts');
const dirFileName = absoluteFrom('/dir.ts');
const {program, templateTypeChecker} = setup([
{
fileName: dirFileName,
source: `export class Foo {}`,
},
{
fileName,
templates: {
'TestCmp': `<div *foo="exp"></div>`,
},
source: `
import {Foo} from './dir';
export class TestCmp {}
`,
declarations: [
{
type: 'directive',
name: 'Foo',
selector: `[foo]`,
file: dirFileName,
},
{
name: 'TestCmp',
type: 'directive',
selector: `[test-cmp]`,
isStandalone: true,
},
],
},
]);
const sf = getSourceFileOrError(program, fileName);
const component = getClass(sf, 'TestCmp');
const extendedTemplateChecker = new ExtendedTemplateCheckerImpl(
templateTypeChecker,
program.getTypeChecker(),
[missingStructuralDirectiveCheck],
{strictNullChecks: true} /* options */,
);
const diags = extendedTemplateChecker.getDiagnosticsForComponent(component);
// No diagnostic messages are expected.
expect(diags.length).toBe(0);
});
it('should *not* produce a warning for non-standalone components', () => {
const fileName = absoluteFrom('/main.ts');
@@ -163,7 +163,7 @@ export class TemplateTypeCheckerImpl implements TemplateTypeChecker {
private config: TypeCheckingConfig,
private refEmitter: ReferenceEmitter,
private reflector: ReflectionHost,
private compilerHost: Pick<ts.CompilerHost, 'getCanonicalFileName'>,
private compilerHost: Pick<ts.CompilerHost, 'getCanonicalFileName' | 'getSourceFile'>,
private priorBuild: IncrementalBuild<unknown, FileTypeCheckingData>,
private readonly metaReader: MetadataReader,
private readonly localMetaReader: MetadataReaderWithIndex,
@@ -39,6 +39,7 @@ import {
} from '../api';
import {makeTemplateDiagnostic} from '../diagnostics';
import {adaptTypeCheckBlockMetadata} from './tcb_adapter';
import {DomSchemaChecker, RegistryDomSchemaChecker} from './dom';
import {Environment} from './environment';
import {OutOfBandDiagnosticRecorder, OutOfBandDiagnosticRecorderImpl} from './oob';
@@ -204,7 +205,7 @@ export class TypeCheckContextImpl implements TypeCheckContext {
constructor(
private config: TypeCheckingConfig,
private compilerHost: Pick<ts.CompilerHost, 'getCanonicalFileName'>,
private compilerHost: Pick<ts.CompilerHost, 'getCanonicalFileName' | 'getSourceFile'>,
private refEmitter: ReferenceEmitter,
private reflector: ReflectionHost,
private host: TypeCheckingHost,
@@ -290,7 +291,6 @@ export class TypeCheckContextImpl implements TypeCheckContext {
fields: {
inputs: dir.inputs,
// TODO(alxhub): support queries
queries: dir.queries,
},
coercedInputFields: dir.coercedInputFields,
});
@@ -568,7 +568,9 @@ export class TypeCheckContextImpl implements TypeCheckContext {
if (!fileData.shimData.has(shimPath)) {
fileData.shimData.set(shimPath, {
domSchemaChecker: new RegistryDomSchemaChecker(fileData.sourceManager),
oobRecorder: new OutOfBandDiagnosticRecorderImpl(fileData.sourceManager),
oobRecorder: new OutOfBandDiagnosticRecorderImpl(fileData.sourceManager, (name) =>
this.compilerHost.getSourceFile(name, ts.ScriptTarget.Latest),
),
file: new TypeCheckFile(
shimPath,
this.config,
@@ -669,13 +671,15 @@ class InlineTcbOp implements Op {
const env = new Environment(this.config, im, refEmitter, this.reflector, sf);
const fnName = ts.factory.createIdentifier(`_tcb_${this.ref.node.pos}`);
const {tcbMeta, component} = adaptTypeCheckBlockMetadata(this.ref, this.meta, env);
// Inline TCBs should copy any generic type parameter nodes directly, as the TCB code is
// inlined into the class in a context where that will always be legal.
const fn = generateTypeCheckBlock(
env,
this.ref,
component,
fnName,
this.meta,
tcbMeta,
this.domSchemaChecker,
this.oobRecorder,
TcbGenericContextBehavior.CopyClassNodes,
@@ -16,7 +16,14 @@ import {
} from '../../imports';
import {ClassDeclaration, ReflectionHost} from '../../reflection';
import {ImportManager, translateExpression} from '../../translator';
import {TypeCheckableDirectiveMeta, TypeCheckingConfig, TypeCtorMetadata} from '../api';
import {
TcbDirectiveMetadata,
TcbPipeMetadata,
TcbReferenceKey,
TcbReferenceMetadata,
TypeCheckingConfig,
TypeCtorMetadata,
} from '../api';
import {ReferenceEmitEnvironment} from './reference_emit_environment';
import {generateTypeCtorDeclarationFn, requiresInlineTypeCtor} from './type_constructor';
@@ -40,10 +47,10 @@ export class Environment extends ReferenceEmitEnvironment {
typeCtor: 1,
};
private typeCtors = new Map<ClassDeclaration, string>();
private typeCtors = new Map<TcbReferenceKey, string>();
protected typeCtorStatements: TcbExpr[] = [];
private pipeInsts = new Map<ClassDeclaration, string>();
private pipeInsts = new Map<TcbReferenceKey, string>();
protected pipeInstStatements: TcbExpr[] = [];
constructor(
@@ -62,25 +69,23 @@ export class Environment extends ReferenceEmitEnvironment {
* Depending on the shape of the directive itself, this could be either a reference to a declared
* type constructor, or to an inline type constructor.
*/
typeCtorFor(dir: TypeCheckableDirectiveMeta): TcbExpr {
const dirRef = dir.ref as Reference<ClassDeclaration<ts.ClassDeclaration>>;
const node = dirRef.node;
if (this.typeCtors.has(node)) {
return new TcbExpr(this.typeCtors.get(node)!);
typeCtorFor(dir: TcbDirectiveMetadata): TcbExpr {
const key = getTcbReferenceKey(dir.ref);
if (this.typeCtors.has(key)) {
return new TcbExpr(this.typeCtors.get(key)!);
}
if (requiresInlineTypeCtor(node, this.reflector, this)) {
if (dir.hasRequiresInlineTypeCtor) {
// The constructor has already been created inline, we just need to construct a reference to
// it.
const ref = this.reference(dirRef);
const typeCtorExpr = `${ref.print()}.ngTypeCtor`;
this.typeCtors.set(node, typeCtorExpr);
const typeCtorExpr = `${this.referenceTcbValue(dir.ref).print()}.ngTypeCtor`;
this.typeCtors.set(key, typeCtorExpr);
return new TcbExpr(typeCtorExpr);
} else {
const fnName = `_ctor${this.nextIds.typeCtor++}`;
const nodeTypeRef = this.referenceType(dirRef);
const nodeTypeRef = this.referenceTcbType(dir.ref);
if (!ts.isTypeReferenceNode(nodeTypeRef)) {
throw new Error(`Expected TypeReferenceNode from reference to ${dirRef.debugName}`);
throw new Error(`Expected TypeReferenceNode from reference to ${dir.ref.name}`);
}
const meta: TypeCtorMetadata = {
fnName,
@@ -88,14 +93,14 @@ export class Environment extends ReferenceEmitEnvironment {
fields: {
inputs: dir.inputs,
// TODO: support queries
queries: dir.queries,
},
coercedInputFields: dir.coercedInputFields,
};
const typeParams = this.emitTypeParameters(node);
const typeParams = dir.typeParameters || undefined;
const typeCtor = generateTypeCtorDeclarationFn(this, meta, nodeTypeRef.typeName, typeParams);
this.typeCtorStatements.push(typeCtor);
this.typeCtors.set(node, fnName);
this.typeCtors.set(key, fnName);
return new TcbExpr(fnName);
}
}
@@ -103,15 +108,16 @@ export class Environment extends ReferenceEmitEnvironment {
/*
* Get an expression referring to an instance of the given pipe.
*/
pipeInst(ref: Reference<ClassDeclaration<ts.ClassDeclaration>>): TcbExpr {
if (this.pipeInsts.has(ref.node)) {
return new TcbExpr(this.pipeInsts.get(ref.node)!);
pipeInst(pipe: TcbPipeMetadata): TcbExpr {
const key = getTcbReferenceKey(pipe.ref);
if (this.pipeInsts.has(key)) {
return new TcbExpr(this.pipeInsts.get(key)!);
}
const pipeType = this.referenceType(ref);
const pipeType = this.referenceTcbType(pipe.ref);
const pipeInstId = `_pipe${this.nextIds.pipeInst++}`;
this.pipeInsts.set(ref.node, pipeInstId);
this.pipeInsts.set(key, pipeInstId);
this.pipeInstStatements.push(
declareVariable(new TcbExpr(pipeInstId), new TcbExpr(tempPrint(pipeType, this.contextFile))),
);
@@ -152,3 +158,10 @@ export class Environment extends ReferenceEmitEnvironment {
return [...this.pipeInstStatements, ...this.typeCtorStatements];
}
}
export function getTcbReferenceKey(ref: TcbReferenceMetadata): TcbReferenceKey {
if (ref.nodeFilePath !== undefined && ref.nodeNameSpan !== undefined) {
return `${ref.nodeFilePath}#${ref.nodeNameSpan.start}` as TcbReferenceKey;
}
return (ref.moduleName ? `${ref.moduleName}#${ref.name}` : ref.name) as TcbReferenceKey;
}
@@ -35,7 +35,7 @@ import ts from 'typescript';
import {ErrorCode, makeDiagnostic, makeRelatedInformation, ngErrorCode} from '../../diagnostics';
import {ClassDeclaration} from '../../reflection';
import {TemplateDiagnostic, TypeCheckId} from '../api';
import {TcbDirectiveMetadata, TemplateDiagnostic, TypeCheckId} from '../api';
import {makeTemplateDiagnostic} from '../diagnostics';
import {TypeCheckSourceResolver} from './tcb_util';
@@ -125,8 +125,8 @@ export interface OutOfBandDiagnosticRecorder {
id: TypeCheckId,
input: TmplAstBoundAttribute,
output: TmplAstBoundEvent,
inputConsumer: ClassDeclaration,
outputConsumer: ClassDeclaration | TmplAstElement,
inputConsumer: Pick<TcbDirectiveMetadata, 'name' | 'isComponent' | 'ref'>,
outputConsumer: Pick<TcbDirectiveMetadata, 'name' | 'isComponent' | 'ref'> | TmplAstElement,
): void;
/** Reports required inputs that haven't been bound. */
@@ -275,7 +275,10 @@ export class OutOfBandDiagnosticRecorderImpl implements OutOfBandDiagnosticRecor
['keyvalue', 'KeyValuePipe'],
]);
constructor(private resolver: TypeCheckSourceResolver) {}
constructor(
private resolver: TypeCheckSourceResolver,
private getSourceFile: (fileName: string) => ts.SourceFile | undefined = (name) => undefined,
) {}
get diagnostics(): ReadonlyArray<TemplateDiagnostic> {
return this._diagnostics;
@@ -510,8 +513,8 @@ export class OutOfBandDiagnosticRecorderImpl implements OutOfBandDiagnosticRecor
id: TypeCheckId,
input: TmplAstBoundAttribute,
output: TmplAstBoundEvent,
inputConsumer: ClassDeclaration,
outputConsumer: ClassDeclaration | TmplAstElement,
inputConsumer: Pick<TcbDirectiveMetadata, 'name' | 'isComponent' | 'ref'>,
outputConsumer: Pick<TcbDirectiveMetadata, 'name' | 'isComponent' | 'ref'> | TmplAstElement,
): void {
const mapping = this.resolver.getTemplateSourceMapping(id);
const errorMsg = `The property and event halves of the two-way binding '${input.name}' are not bound to the same target.
@@ -520,12 +523,17 @@ export class OutOfBandDiagnosticRecorderImpl implements OutOfBandDiagnosticRecor
const relatedMessages: {text: string; start: number; end: number; sourceFile: ts.SourceFile}[] =
[];
relatedMessages.push({
text: `The property half of the binding is to the '${inputConsumer.name.text}' component.`,
start: inputConsumer.name.getStart(),
end: inputConsumer.name.getEnd(),
sourceFile: inputConsumer.name.getSourceFile(),
});
if (inputConsumer.ref.nodeNameSpan && inputConsumer.ref.nodeFilePath) {
const sf = this.getSourceFile(inputConsumer.ref.nodeFilePath);
if (sf) {
relatedMessages.push({
text: `The property half of the binding is to the '${inputConsumer.name}' ${inputConsumer.isComponent ? 'component' : 'directive'}.`,
start: inputConsumer.ref.nodeNameSpan.start,
end: inputConsumer.ref.nodeNameSpan.end,
sourceFile: sf,
});
}
}
if (outputConsumer instanceof TmplAstElement) {
let message = `The event half of the binding is to a native event called '${input.name}' on the <${outputConsumer.name}> DOM element.`;
@@ -539,12 +547,17 @@ export class OutOfBandDiagnosticRecorderImpl implements OutOfBandDiagnosticRecor
sourceFile: mapping.node.getSourceFile(),
});
} else {
relatedMessages.push({
text: `The event half of the binding is to the '${outputConsumer.name.text}' component.`,
start: outputConsumer.name.getStart(),
end: outputConsumer.name.getEnd(),
sourceFile: outputConsumer.name.getSourceFile(),
});
if (outputConsumer.ref.nodeNameSpan && outputConsumer.ref.nodeFilePath) {
const sf = this.getSourceFile(outputConsumer.ref.nodeFilePath);
if (sf) {
relatedMessages.push({
text: `The event half of the binding is to the '${outputConsumer.name}' ${outputConsumer.isComponent ? 'component' : 'directive'}.`,
start: outputConsumer.ref.nodeNameSpan.start,
end: outputConsumer.ref.nodeNameSpan.end,
sourceFile: sf,
});
}
}
}
this._diagnostics.push(
@@ -21,7 +21,7 @@ import {
TmplAstTextAttribute,
} from '@angular/compiler';
import ts from 'typescript';
import {TypeCheckableDirectiveMeta} from '../../api';
import {TcbDirectiveMetadata} from '../../api';
import {ClassPropertyName} from '../../../metadata';
import {Reference} from '../../../imports';
import {Context} from './context';
@@ -35,7 +35,7 @@ export interface TcbBoundAttribute {
fieldName: ClassPropertyName;
required: boolean;
isSignal: boolean;
transformType: Reference<ts.TypeNode> | null;
transformType?: string;
isTwoWayBinding: boolean;
}[];
}
@@ -87,7 +87,7 @@ export interface TcbDirectiveUnsetInput {
export type TcbDirectiveInput = TcbDirectiveBoundInput | TcbDirectiveUnsetInput;
export function getBoundAttributes(
directive: TypeCheckableDirectiveMeta,
directive: TcbDirectiveMetadata,
node: TmplAstTemplate | TmplAstElement | TmplAstComponent | TmplAstDirective,
): TcbBoundAttribute[] {
const boundInputs: TcbBoundAttribute[] = [];
@@ -114,7 +114,7 @@ export function getBoundAttributes(
return {
fieldName: input.classPropertyName,
required: input.required,
transformType: input.transform?.type || null,
transformType: input.transformType,
isSignal: input.isSignal,
isTwoWayBinding:
attr instanceof TmplAstBoundAttribute && attr.type === BindingType.TwoWay,
@@ -150,7 +150,7 @@ export function checkSplitTwoWayBinding(
return false;
}
// Input consumer should be a directive because it's claimed
const inputConsumer = tcb.boundTarget.getConsumerOfBinding(input) as TypeCheckableDirectiveMeta;
const inputConsumer = tcb.boundTarget.getConsumerOfBinding(input) as TcbDirectiveMetadata;
const outputConsumer = tcb.boundTarget.getConsumerOfBinding(output);
if (
outputConsumer === null ||
@@ -160,22 +160,10 @@ export function checkSplitTwoWayBinding(
return false;
}
if (outputConsumer instanceof TmplAstElement) {
tcb.oobRecorder.splitTwoWayBinding(
tcb.id,
input,
output,
inputConsumer.ref.node,
outputConsumer,
);
tcb.oobRecorder.splitTwoWayBinding(tcb.id, input, output, inputConsumer, outputConsumer);
return true;
} else if (outputConsumer.ref !== inputConsumer.ref) {
tcb.oobRecorder.splitTwoWayBinding(
tcb.id,
input,
output,
inputConsumer.ref.node,
outputConsumer.ref.node,
);
tcb.oobRecorder.splitTwoWayBinding(tcb.id, input, output, inputConsumer, outputConsumer);
return true;
}
return false;
@@ -9,8 +9,7 @@
import {BoundTarget, SchemaMetadata} from '@angular/compiler';
import {DomSchemaChecker} from '../dom';
import {OutOfBandDiagnosticRecorder} from '../oob';
import {TypeCheckableDirectiveMeta, TypeCheckId} from '../../api';
import {PipeMeta} from '../../../metadata';
import {TypeCheckId, TcbDirectiveMetadata, TcbPipeMetadata} from '../../api';
import {Environment} from '../environment';
/**
@@ -56,8 +55,8 @@ export class Context {
readonly domSchemaChecker: DomSchemaChecker,
readonly oobRecorder: OutOfBandDiagnosticRecorder,
readonly id: TypeCheckId,
readonly boundTarget: BoundTarget<TypeCheckableDirectiveMeta>,
private pipes: Map<string, PipeMeta> | null,
readonly boundTarget: BoundTarget<TcbDirectiveMetadata>,
private pipes: Map<string, TcbPipeMetadata> | null,
readonly schemas: SchemaMetadata[],
readonly hostIsStandalone: boolean,
readonly hostPreserveWhitespaces: boolean,
@@ -73,7 +72,7 @@ export class Context {
return `_t${this.nextId++}`;
}
getPipeByName(name: string): PipeMeta | null {
getPipeByName(name: string): TcbPipeMetadata | null {
if (this.pipes === null || !this.pipes.has(name)) {
return null;
}
@@ -11,7 +11,7 @@ import {TcbOp} from './base';
import {quoteAndEscape, TcbExpr} from './codegen';
import {Context} from './context';
import type {Scope} from './scope';
import {TypeCheckableDirectiveMeta} from '../../api';
import {TcbDirectiveMetadata} from '../../api';
import {ExpressionIdentifier} from '../comments';
import {unwrapWritableSignal} from './expression';
import {CustomFormControlType, expandBoundAttributesForField} from './signal_forms';
@@ -35,7 +35,7 @@ export class TcbDirectiveCtorOp extends TcbOp {
private tcb: Context,
private scope: Scope,
private node: DirectiveOwner,
private dir: TypeCheckableDirectiveMeta,
private dir: TcbDirectiveMetadata,
private customFormControlType: CustomFormControlType | null,
) {
super();
@@ -139,7 +139,7 @@ export class TcbDirectiveCtorCircularFallbackOp extends TcbOp {
constructor(
private tcb: Context,
private scope: Scope,
private dir: TypeCheckableDirectiveMeta,
private dir: TcbDirectiveMetadata,
) {
super();
}
@@ -161,7 +161,7 @@ export class TcbDirectiveCtorCircularFallbackOp extends TcbOp {
* the directive instance from any bound inputs.
*/
function tcbCallTypeCtor(
dir: TypeCheckableDirectiveMeta,
dir: TcbDirectiveMetadata,
tcb: Context,
inputs: TcbDirectiveInput[],
): TcbExpr {
@@ -12,9 +12,7 @@ import type {Context} from './context';
import type {Scope} from './scope';
import {TcbOp} from './base';
import {declareVariable, TcbExpr, tempPrint} from './codegen';
import {TypeCheckableDirectiveMeta} from '../../api';
import {Reference} from '../../../imports';
import {ClassDeclaration} from '../../../reflection';
import {TcbDirectiveMetadata} from '../../api';
import {ExpressionIdentifier} from '../comments';
/**
@@ -26,7 +24,7 @@ export abstract class TcbDirectiveTypeOpBase extends TcbOp {
protected tcb: Context,
protected scope: Scope,
protected node: DirectiveOwner,
protected dir: TypeCheckableDirectiveMeta,
protected dir: TcbDirectiveMetadata,
) {
super();
}
@@ -39,29 +37,29 @@ export abstract class TcbDirectiveTypeOpBase extends TcbOp {
}
override execute(): TcbExpr {
const dirRef = this.dir.ref as Reference<ClassDeclaration<ts.ClassDeclaration>>;
const rawType = this.tcb.env.referenceType(this.dir.ref);
const rawType = this.tcb.env.referenceTcbType(this.dir.ref);
let type: TcbExpr;
let span: ParseSourceSpan;
if (this.dir.isGeneric === false || dirRef.node.typeParameters === undefined) {
type = new TcbExpr(tempPrint(rawType, dirRef.node.getSourceFile()));
if (
this.dir.isGeneric === false ||
this.dir.typeParameters === null ||
this.dir.typeParameters.length === 0
) {
type = new TcbExpr(tempPrint(rawType, this.tcb.env.contextFile));
} else {
if (!ts.isTypeReferenceNode(rawType)) {
throw new Error(
`Expected TypeReferenceNode when referencing the type for ${this.dir.ref.debugName}`,
`Expected TypeReferenceNode when referencing the type for ${this.dir.ref.name}`,
);
}
const typeArguments = dirRef.node.typeParameters.map(() =>
ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),
);
type = new TcbExpr(
tempPrint(
ts.factory.createTypeReferenceNode(rawType.typeName, typeArguments),
dirRef.node.getSourceFile(),
),
);
const typeName = ts.isIdentifier(rawType.typeName)
? rawType.typeName.text
: tempPrint(rawType.typeName, this.tcb.env.contextFile);
const typeArguments = Array(this.dir.typeParameters?.length ?? 0)
.fill('any')
.join(', ');
type = new TcbExpr(`${typeName}<${typeArguments}>`);
}
if (this.node instanceof TmplAstHostElement) {
@@ -93,9 +91,8 @@ export class TcbNonGenericDirectiveTypeOp extends TcbDirectiveTypeOpBase {
* the newly created variable.
*/
override execute(): TcbExpr {
const dirRef = this.dir.ref as Reference<ClassDeclaration<ts.ClassDeclaration>>;
if (this.dir.isGeneric) {
throw new Error(`Assertion Error: expected ${dirRef.debugName} not to be generic.`);
throw new Error(`Assertion Error: expected ${this.dir.ref.name} not to be generic.`);
}
return super.execute();
}
@@ -111,10 +108,9 @@ export class TcbNonGenericDirectiveTypeOp extends TcbDirectiveTypeOpBase {
*/
export class TcbGenericDirectiveTypeWithAnyParamsOp extends TcbDirectiveTypeOpBase {
override execute(): TcbExpr {
const dirRef = this.dir.ref as Reference<ClassDeclaration<ts.ClassDeclaration>>;
if (dirRef.node.typeParameters === undefined) {
if (this.dir.typeParameters === null || this.dir.typeParameters.length === 0) {
throw new Error(
`Assertion Error: expected typeParameters when creating a declaration for ${dirRef.debugName}`,
`Assertion Error: expected typeParameters when creating a declaration for ${this.dir.ref.name}`,
);
}
@@ -20,7 +20,7 @@ import {TcbOp} from './base';
import {quoteAndEscape, getStatementsBlock, TcbExpr} from './codegen';
import type {Context} from './context';
import type {Scope} from './scope';
import {TypeCheckableDirectiveMeta} from '../../api';
import {TcbDirectiveMetadata} from '../../api';
import {TcbExpressionTranslator, unwrapWritableSignal} from './expression';
import {ExpressionIdentifier} from '../comments';
import {checkSplitTwoWayBinding} from './bindings';
@@ -59,7 +59,7 @@ export class TcbDirectiveOutputsOp extends TcbOp {
private node: DirectiveOwner,
private inputs: TmplAstBoundAttribute[] | null,
private outputs: TmplAstBoundEvent[],
private dir: TypeCheckableDirectiveMeta,
private dir: TcbDirectiveMetadata,
) {
super();
}

Some files were not shown because too many files have changed in this diff Show More