mirror of
https://github.com/angular/angular.git
synced 2026-09-14 13:54:52 +08:00
Compare commits
26 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e7593653be | |||
| 21b1c3b2ee | |||
| 6c73aaca30 | |||
| c98eab794c | |||
| d45fced21b | |||
| ed48c41f65 | |||
| 75135586d6 | |||
| ff697707ba | |||
| 7d76103999 | |||
| 575f3023c1 | |||
| 4c86ed382d | |||
| 224e60ecb1 | |||
| 492e7560e6 | |||
| 09638ec7c3 | |||
| ab35383285 | |||
| 934e2732b3 | |||
| c20dabda2a | |||
| 62a97f7e4b | |||
| 106cf4ee90 | |||
| 024e307ab0 | |||
| 77b035eca6 | |||
| 4a9b715b3a | |||
| 420aa725ae | |||
| c499c578c9 | |||
| 0588133210 | |||
| 6416a31c1b |
+4
-4
@@ -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/**/{*,.*}',
|
||||
|
||||
@@ -1,3 +1,14 @@
|
||||
<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
|
||||
|
||||
+2
-2
@@ -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")
|
||||
|
||||
|
||||
Generated
+4
-4
@@ -419,7 +419,7 @@
|
||||
"@@aspect_rules_js+//npm:extensions.bzl%pnpm": {
|
||||
"general": {
|
||||
"bzlTransitiveDigest": "9Zmqluz9ltvCoc6pskOslTkQpkH6CIINjWVkgam9aa4=",
|
||||
"usagesDigest": "k3HnPWCDfdjPprODR4rLNwRc8pEk4QMKpK9YbIwIkkk=",
|
||||
"usagesDigest": "pLuUB7Fmb40xWdK1ynAXIWXeucWkJ0R9x2nDjqKhbq4=",
|
||||
"recordedFileInputs": {},
|
||||
"recordedDirentsInputs": {},
|
||||
"envVariables": {},
|
||||
@@ -428,11 +428,11 @@
|
||||
"repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_rule",
|
||||
"attributes": {
|
||||
"package": "pnpm",
|
||||
"version": "10.30.3",
|
||||
"version": "10.32.0",
|
||||
"root_package": "",
|
||||
"link_workspace": "",
|
||||
"link_packages": {},
|
||||
"integrity": "sha512-yWHR4KLY41TsqlFmuCJRZmi39Ey1vZUSLVkN2Bki9gb1RzttI+xKW+Bef80Y6EiNR9l4u+mBhy8RRdBumnQAFw==",
|
||||
"integrity": "sha512-myY0uz/tVgHDNjPy2SWT9QYnCjljuMUdKy1qgo2mFc5One6++WFMzrvBOsjTwPnJzM61g8achXhDb6R327INcA==",
|
||||
"url": "",
|
||||
"commit": "",
|
||||
"patch_args": [
|
||||
@@ -455,7 +455,7 @@
|
||||
"repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_links",
|
||||
"attributes": {
|
||||
"package": "pnpm",
|
||||
"version": "10.30.3",
|
||||
"version": "10.32.0",
|
||||
"dev": false,
|
||||
"root_package": "",
|
||||
"link_packages": {},
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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'">
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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": {
|
||||
|
||||
+92
-92
@@ -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
@@ -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": {
|
||||
|
||||
+92
-92
@@ -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
@@ -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": {
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
"externalDependencies": ["xhr2"],
|
||||
"browser": "src/main.ts",
|
||||
"tsConfig": "tsconfig.app.json",
|
||||
"polyfills": ["@angular/localize/init"],
|
||||
"assets": [
|
||||
{
|
||||
"glob": "**/*",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -38,5 +38,5 @@
|
||||
"ts-node": "^10.9.1",
|
||||
"typescript": "5.9.3"
|
||||
},
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
Generated
+302
-246
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"
|
||||
}
|
||||
|
||||
+292
-236
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"
|
||||
}
|
||||
|
||||
+292
-236
File diff suppressed because it is too large
Load Diff
@@ -32,5 +32,5 @@
|
||||
"ts-node": "^10.9.1",
|
||||
"typescript": "5.9.3"
|
||||
},
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
+292
-236
File diff suppressed because it is too large
Load Diff
@@ -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",
|
||||
|
||||
+239
-263
File diff suppressed because it is too large
Load Diff
@@ -30,5 +30,5 @@
|
||||
"ts-node": "10.9.2",
|
||||
"typescript": "5.9.3"
|
||||
},
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
Generated
+290
-235
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"
|
||||
}
|
||||
|
||||
+223
-230
File diff suppressed because it is too large
Load Diff
@@ -39,5 +39,5 @@
|
||||
"ts-node": "^10.9.1",
|
||||
"typescript": "5.9.3"
|
||||
},
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
+229
-236
File diff suppressed because it is too large
Load Diff
@@ -27,5 +27,5 @@
|
||||
"@types/node": "^20.14.8",
|
||||
"typescript": "5.9.3"
|
||||
},
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
+220
-227
File diff suppressed because it is too large
Load Diff
@@ -33,5 +33,5 @@
|
||||
"protractor": "protractor e2e/protractor.config.js"
|
||||
},
|
||||
"private": true,
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
Generated
+22
-22
@@ -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: {}
|
||||
|
||||
|
||||
@@ -21,5 +21,5 @@
|
||||
"typescript": "5.9.3",
|
||||
"zone.js": "0.16.0"
|
||||
},
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
@@ -13,5 +13,5 @@
|
||||
"scripts": {
|
||||
"test": "node ./test.mjs"
|
||||
},
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
+293
-236
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"
|
||||
}
|
||||
|
||||
+296
-239
File diff suppressed because it is too large
Load Diff
@@ -47,5 +47,5 @@
|
||||
"ts-node": "^10.9.1",
|
||||
"typescript": "5.9.3"
|
||||
},
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
+296
-239
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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
Generated
+5
-5
@@ -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"
|
||||
}
|
||||
|
||||
+292
-236
File diff suppressed because it is too large
Load Diff
@@ -14,5 +14,5 @@
|
||||
"typescript": "5.9.3",
|
||||
"zone.js": "0.16.0"
|
||||
},
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
@@ -45,5 +45,5 @@
|
||||
"ts-node": "^10.9.1",
|
||||
"typescript": "5.9.3"
|
||||
},
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
Generated
+309
-269
File diff suppressed because it is too large
Load Diff
@@ -26,5 +26,5 @@
|
||||
"scripts": {
|
||||
"test": "tsc"
|
||||
},
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
+4
-4
@@ -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
|
||||
|
||||
|
||||
@@ -26,5 +26,5 @@
|
||||
"scripts": {
|
||||
"test": "tsc"
|
||||
},
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
@@ -26,5 +26,5 @@
|
||||
"scripts": {
|
||||
"test": "tsc"
|
||||
},
|
||||
"packageManager": "pnpm@10.30.3"
|
||||
"packageManager": "pnpm@10.32.0"
|
||||
}
|
||||
|
||||
+3
-3
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"name": "angular-srcs",
|
||||
"version": "21.2.2",
|
||||
"version": "21.2.3",
|
||||
"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",
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
+46
@@ -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();
|
||||
}
|
||||
|
||||
@@ -204,9 +204,7 @@ export class TcbExpressionTranslator {
|
||||
pipe = new TcbExpr('(0 as any)');
|
||||
} else {
|
||||
// Use a variable declared as the pipe's type.
|
||||
pipe = this.tcb.env.pipeInst(
|
||||
pipeMeta.ref as Reference<ClassDeclaration<ts.ClassDeclaration>>,
|
||||
);
|
||||
pipe = this.tcb.env.pipeInst(pipeMeta);
|
||||
}
|
||||
const args = ast.args.map((arg) => this.translate(arg).print());
|
||||
let methodAccess = new TcbExpr(`${pipe.print()}.transform`).addParseSpanInfo(ast.nameSpan);
|
||||
|
||||
@@ -20,7 +20,7 @@ import {
|
||||
import ts from 'typescript';
|
||||
import type {Context} from './context';
|
||||
import type {Scope} from './scope';
|
||||
import {TypeCheckableDirectiveMeta} from '../../api';
|
||||
import {TcbDirectiveMetadata} from '../../api';
|
||||
import {TcbOp} from './base';
|
||||
import {declareVariable, quoteAndEscape, TcbExpr, tempPrint} from './codegen';
|
||||
import {BindingPropertyName, ClassPropertyName} from '../../../metadata';
|
||||
@@ -59,7 +59,7 @@ export class TcbDirectiveInputsOp extends TcbOp {
|
||||
private tcb: Context,
|
||||
private scope: Scope,
|
||||
private node: TmplAstTemplate | TmplAstElement | TmplAstComponent | TmplAstDirective,
|
||||
private dir: TypeCheckableDirectiveMeta,
|
||||
private dir: TcbDirectiveMetadata,
|
||||
private isFormControl: boolean = false,
|
||||
private customFormControlType: CustomFormControlType | null,
|
||||
) {
|
||||
@@ -118,22 +118,17 @@ export class TcbDirectiveInputsOp extends TcbOp {
|
||||
if (this.dir.coercedInputFields.has(fieldName)) {
|
||||
let type: TcbExpr;
|
||||
|
||||
if (transformType !== null) {
|
||||
const tsType = this.tcb.env.referenceTransplantedType(
|
||||
new TransplantedType(transformType),
|
||||
);
|
||||
type = new TcbExpr(tempPrint(tsType, transformType.node.getSourceFile()));
|
||||
if (transformType !== undefined) {
|
||||
type = new TcbExpr(transformType);
|
||||
} else {
|
||||
// The input has a coercion declaration which should be used instead of assigning the
|
||||
// expression into the input field directly. To achieve this, a variable is declared
|
||||
// with a type of `typeof Directive.ngAcceptInputType_fieldName` which is then used as
|
||||
// target of the assignment.
|
||||
const dirTypeRef: ts.TypeNode = this.tcb.env.referenceType(this.dir.ref);
|
||||
const dirTypeRef: ts.TypeNode = this.tcb.env.referenceTcbType(this.dir.ref);
|
||||
|
||||
if (!ts.isTypeReferenceNode(dirTypeRef)) {
|
||||
throw new Error(
|
||||
`Expected TypeReferenceNode from reference to ${this.dir.ref.debugName}`,
|
||||
);
|
||||
throw new Error(`Expected TypeReferenceNode from reference to ${this.dir.ref.name}`);
|
||||
}
|
||||
|
||||
const typeName = ts.isIdentifier(dirTypeRef.typeName)
|
||||
@@ -165,11 +160,9 @@ export class TcbDirectiveInputsOp extends TcbOp {
|
||||
}
|
||||
|
||||
const id = new TcbExpr(this.tcb.allocateId());
|
||||
const dirTypeRef = this.tcb.env.referenceType(this.dir.ref);
|
||||
const dirTypeRef = this.tcb.env.referenceTcbType(this.dir.ref);
|
||||
if (!ts.isTypeReferenceNode(dirTypeRef)) {
|
||||
throw new Error(
|
||||
`Expected TypeReferenceNode from reference to ${this.dir.ref.debugName}`,
|
||||
);
|
||||
throw new Error(`Expected TypeReferenceNode from reference to ${this.dir.ref.name}`);
|
||||
}
|
||||
const type = new TcbExpr(`(typeof ${dirId.print()})[${quoteAndEscape(fieldName)}]`);
|
||||
const temp = declareVariable(id, type);
|
||||
|
||||
@@ -20,7 +20,7 @@ import {TcbOp} from './base';
|
||||
import {TcbExpr} from './codegen';
|
||||
import type {Context} from './context';
|
||||
import type {Scope} from './scope';
|
||||
import {TypeCheckableDirectiveMeta} from '../../api';
|
||||
import {TcbDirectiveMetadata} from '../../api';
|
||||
|
||||
/** Types that can referenced locally in a template. */
|
||||
export type LocalSymbol =
|
||||
@@ -59,7 +59,7 @@ export class TcbReferenceOp extends TcbOp {
|
||||
private readonly scope: Scope,
|
||||
private readonly node: TmplAstReference,
|
||||
private readonly host: TmplAstElement | TmplAstTemplate | TmplAstComponent | TmplAstDirective,
|
||||
private readonly target: TypeCheckableDirectiveMeta | TmplAstTemplate | TmplAstElement,
|
||||
private readonly target: TcbDirectiveMetadata | TmplAstTemplate | TmplAstElement,
|
||||
) {
|
||||
super();
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
import {
|
||||
DirectiveOwner,
|
||||
ExternalExpr,
|
||||
TmplAstBoundAttribute,
|
||||
TmplAstBoundEvent,
|
||||
TmplAstBoundText,
|
||||
@@ -36,7 +37,7 @@ import {
|
||||
import ts from 'typescript';
|
||||
import {TcbOp} from './base';
|
||||
import {TcbExpr} from './codegen';
|
||||
import {TypeCheckableDirectiveMeta} from '../../api';
|
||||
import {TcbDirectiveMetadata} from '../../api';
|
||||
import {Context} from './context';
|
||||
import {TcbTemplateBodyOp, TcbTemplateContextOp} from './template';
|
||||
import {TcbElementOp} from './element';
|
||||
@@ -59,7 +60,7 @@ import {
|
||||
TcbNativeFieldOp,
|
||||
TcbNativeRadioButtonFieldOp,
|
||||
} from './signal_forms';
|
||||
import {Reference} from '../../../imports';
|
||||
import {ImportFlags, Reference, ReferenceEmitKind} from '../../../imports';
|
||||
import {ClassDeclaration} from '../../../reflection';
|
||||
import {
|
||||
TcbGenericDirectiveTypeWithAnyParamsOp,
|
||||
@@ -120,7 +121,7 @@ export class Scope {
|
||||
* A map of maps which tracks the index of `TcbDirectiveCtorOp`s in the `opQueue` for each
|
||||
* directive on a `TmplAstElement` or `TmplAstTemplate` node.
|
||||
*/
|
||||
private directiveOpMap = new Map<DirectiveOwner, Map<TypeCheckableDirectiveMeta, number>>();
|
||||
private directiveOpMap = new Map<DirectiveOwner, Map<TcbDirectiveMetadata, number>>();
|
||||
|
||||
/**
|
||||
* A map of `TmplAstReference`s to the index of their `TcbReferenceOp` in the `opQueue`
|
||||
@@ -299,7 +300,7 @@ export class Scope {
|
||||
* @param directive if present, a directive type on a `TmplAstElement` or `TmplAstTemplate` to
|
||||
* look up instead of the default for an element or template node.
|
||||
*/
|
||||
resolve(node: LocalSymbol, directive?: TypeCheckableDirectiveMeta): TcbExpr {
|
||||
resolve(node: LocalSymbol, directive?: TcbDirectiveMetadata): TcbExpr {
|
||||
// Attempt to resolve the operation locally.
|
||||
const res = this.resolveLocal(node, directive);
|
||||
if (res !== null) {
|
||||
@@ -395,7 +396,7 @@ export class Scope {
|
||||
return Scope.forNodes(this.tcb, parentScope, scopedNode, children, guard);
|
||||
}
|
||||
|
||||
private resolveLocal(ref: LocalSymbol, directive?: TypeCheckableDirectiveMeta): TcbExpr | null {
|
||||
private resolveLocal(ref: LocalSymbol, directive?: TcbDirectiveMetadata): TcbExpr | null {
|
||||
if (ref instanceof TmplAstReference && this.referenceOpMap.has(ref)) {
|
||||
return this.resolveOp(this.referenceOpMap.get(ref)!);
|
||||
} else if (ref instanceof TmplAstLetDeclaration && this.letDeclOpMap.has(ref.name)) {
|
||||
@@ -593,7 +594,7 @@ export class Scope {
|
||||
}
|
||||
}
|
||||
|
||||
const dirMap = new Map<TypeCheckableDirectiveMeta, number>();
|
||||
const dirMap = new Map<TcbDirectiveMetadata, number>();
|
||||
for (const dir of directives) {
|
||||
this.appendDirectiveInputs(dir, node, dirMap, directives);
|
||||
}
|
||||
@@ -670,7 +671,7 @@ export class Scope {
|
||||
const claimedInputs = new Set<string>();
|
||||
|
||||
if (directives !== null && directives.length > 0) {
|
||||
const dirMap = new Map<TypeCheckableDirectiveMeta, number>();
|
||||
const dirMap = new Map<TcbDirectiveMetadata, number>();
|
||||
for (const dir of directives) {
|
||||
this.appendDirectiveInputs(dir, node, dirMap, directives);
|
||||
|
||||
@@ -735,10 +736,10 @@ export class Scope {
|
||||
}
|
||||
|
||||
private appendDirectiveInputs(
|
||||
dir: TypeCheckableDirectiveMeta,
|
||||
dir: TcbDirectiveMetadata,
|
||||
node: TmplAstElement | TmplAstTemplate | TmplAstComponent | TmplAstDirective,
|
||||
dirMap: Map<TypeCheckableDirectiveMeta, number>,
|
||||
allDirectiveMatches: TypeCheckableDirectiveMeta[],
|
||||
dirMap: Map<TcbDirectiveMetadata, number>,
|
||||
allDirectiveMatches: TcbDirectiveMetadata[],
|
||||
): void {
|
||||
const nodeIsFormControl = isFormControl(allDirectiveMatches);
|
||||
const customFormControlType = nodeIsFormControl ? getCustomFieldDirectiveType(dir) : null;
|
||||
@@ -765,20 +766,15 @@ export class Scope {
|
||||
}
|
||||
|
||||
private getDirectiveOp(
|
||||
dir: TypeCheckableDirectiveMeta,
|
||||
dir: TcbDirectiveMetadata,
|
||||
node: DirectiveOwner,
|
||||
customFieldType: CustomFormControlType | null,
|
||||
): TcbOp {
|
||||
const dirRef = dir.ref as Reference<ClassDeclaration<ts.ClassDeclaration>>;
|
||||
|
||||
if (!dir.isGeneric) {
|
||||
// The most common case is that when a directive is not generic, we use the normal
|
||||
// `TcbNonDirectiveTypeOp`.
|
||||
return new TcbNonGenericDirectiveTypeOp(this.tcb, this, node, dir);
|
||||
} else if (
|
||||
!requiresInlineTypeCtor(dirRef.node, this.tcb.env.reflector, this.tcb.env) ||
|
||||
this.tcb.env.config.useInlineTypeConstructors
|
||||
) {
|
||||
} else if (!dir.hasRequiresInlineTypeCtor || this.tcb.env.config.useInlineTypeConstructors) {
|
||||
// For generic directives, we use a type constructor to infer types. If a directive requires
|
||||
// an inline type constructor, then inlining must be available to use the
|
||||
// `TcbDirectiveCtorOp`. If not we, we fallback to using `any` – see below.
|
||||
@@ -967,7 +963,7 @@ export class Scope {
|
||||
const directives = this.tcb.boundTarget.getDirectivesOfNode(node);
|
||||
|
||||
if (directives !== null && directives.length > 0) {
|
||||
const directiveOpMap = new Map<TypeCheckableDirectiveMeta, number>();
|
||||
const directiveOpMap = new Map<TcbDirectiveMetadata, number>();
|
||||
|
||||
for (const directive of directives) {
|
||||
const directiveOp = this.getDirectiveOp(directive, node, null);
|
||||
|
||||
@@ -22,7 +22,7 @@ import {
|
||||
TmplAstTemplate,
|
||||
} from '@angular/compiler';
|
||||
import ts from 'typescript';
|
||||
import {TypeCheckableDirectiveMeta} from '../../api';
|
||||
import {TcbDirectiveMetadata} from '../../api';
|
||||
import {TcbOp} from './base';
|
||||
import {declareVariable, TcbExpr} from './codegen';
|
||||
import {TcbBoundAttribute} from './bindings';
|
||||
@@ -206,7 +206,7 @@ export class TcbNativeRadioButtonFieldOp extends TcbNativeFieldOp {
|
||||
|
||||
/** Expands the set of bound inputs with the ones from custom field directives. */
|
||||
export function expandBoundAttributesForField(
|
||||
directive: TypeCheckableDirectiveMeta,
|
||||
directive: TcbDirectiveMetadata,
|
||||
node: TmplAstTemplate | TmplAstElement | TmplAstComponent | TmplAstDirective,
|
||||
customFormControlType: CustomFormControlType | null,
|
||||
): TcbBoundAttribute[] | null {
|
||||
@@ -264,31 +264,22 @@ export function expandBoundAttributesForField(
|
||||
return boundInputs;
|
||||
}
|
||||
|
||||
export function isFieldDirective(meta: TypeCheckableDirectiveMeta): boolean {
|
||||
export function isFieldDirective(meta: TcbDirectiveMetadata): boolean {
|
||||
if (meta.name !== 'FormField') {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Fast path, relevant for all external users.
|
||||
if (meta.ref.bestGuessOwningModule?.specifier === '@angular/forms/signals') {
|
||||
if (meta.ref.moduleName === '@angular/forms/signals') {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Slightly slower, but more accurate path.
|
||||
return (
|
||||
ts.isClassDeclaration(meta.ref.node) &&
|
||||
meta.ref.node.members.some(
|
||||
(member) =>
|
||||
ts.isPropertyDeclaration(member) &&
|
||||
ts.isComputedPropertyName(member.name) &&
|
||||
ts.isIdentifier(member.name.expression) &&
|
||||
member.name.expression.text === 'ɵNgFieldDirective',
|
||||
)
|
||||
);
|
||||
// Slightly slower, but more accurate path. Fallback for internal / local compilation where we don't have the exact module.
|
||||
return meta.hasNgFieldDirective;
|
||||
}
|
||||
|
||||
function getSyntheticFieldBoundInput(
|
||||
dir: TypeCheckableDirectiveMeta,
|
||||
dir: TcbDirectiveMetadata,
|
||||
inputName: string,
|
||||
fieldPropertyName: string,
|
||||
fieldBinding: TmplAstBoundAttribute,
|
||||
@@ -325,7 +316,7 @@ function getSyntheticFieldBoundInput(
|
||||
inputs: inputs.map((input) => ({
|
||||
fieldName: input.classPropertyName,
|
||||
required: input.required,
|
||||
transformType: input.transform?.type || null,
|
||||
transformType: input.transformType,
|
||||
isSignal: input.isSignal,
|
||||
isTwoWayBinding,
|
||||
})),
|
||||
@@ -334,7 +325,7 @@ function getSyntheticFieldBoundInput(
|
||||
|
||||
/** Determines if a directive is a custom field and its type. */
|
||||
export function getCustomFieldDirectiveType(
|
||||
meta: TypeCheckableDirectiveMeta,
|
||||
meta: TcbDirectiveMetadata,
|
||||
): CustomFormControlType | null {
|
||||
if (hasModelInput('value', meta)) {
|
||||
return 'value';
|
||||
@@ -346,9 +337,9 @@ export function getCustomFieldDirectiveType(
|
||||
|
||||
/** Determines if a directive usage is on a native field. */
|
||||
export function isNativeField(
|
||||
dir: TypeCheckableDirectiveMeta,
|
||||
dir: TcbDirectiveMetadata,
|
||||
node: TmplAstNode,
|
||||
allDirectiveMatches: TypeCheckableDirectiveMeta[],
|
||||
allDirectiveMatches: TcbDirectiveMetadata[],
|
||||
): node is TmplAstElement & {name: 'input' | 'select' | 'textarea'} {
|
||||
// Only applies to the `FormField` directive.
|
||||
if (!isFieldDirective(dir)) {
|
||||
@@ -373,7 +364,7 @@ export function isNativeField(
|
||||
* Determines if a directive is shaped like a `ControlValueAccessor`. Note that this isn't
|
||||
* 100% reliable, because we don't know if the directive was actually provided at runtime.
|
||||
*/
|
||||
function isControlValueAccessorLike(meta: TypeCheckableDirectiveMeta): boolean {
|
||||
function isControlValueAccessorLike(meta: TcbDirectiveMetadata): boolean {
|
||||
return (
|
||||
meta.publicMethods.has('writeValue') &&
|
||||
meta.publicMethods.has('registerOnChange') &&
|
||||
@@ -426,7 +417,7 @@ function extractFieldValue(expression: AST, tcb: Context, scope: Scope): TcbExpr
|
||||
}
|
||||
|
||||
/** Checks whether a directive has a model-like input with a specific name. */
|
||||
function hasModelInput(name: string, meta: TypeCheckableDirectiveMeta): boolean {
|
||||
function hasModelInput(name: string, meta: TcbDirectiveMetadata): boolean {
|
||||
return (
|
||||
meta.inputs.hasBindingPropertyName(name) && meta.outputs.hasBindingPropertyName(name + 'Change')
|
||||
);
|
||||
@@ -438,7 +429,7 @@ function hasModelInput(name: string, meta: TypeCheckableDirectiveMeta): boolean
|
||||
* A node is a form control if it has a matching `FormField` directive, and no other directives match
|
||||
* the `field` input.
|
||||
*/
|
||||
export function isFormControl(allDirectiveMatches: TypeCheckableDirectiveMeta[]): boolean {
|
||||
export function isFormControl(allDirectiveMatches: TcbDirectiveMetadata[]): boolean {
|
||||
let result = false;
|
||||
for (const match of allDirectiveMatches) {
|
||||
if (match.inputs.hasBindingPropertyName('formField')) {
|
||||
|
||||
@@ -11,7 +11,7 @@ import {TcbOp} from './base';
|
||||
import {declareVariable, getStatementsBlock, TcbExpr} from './codegen';
|
||||
import type {Context} from './context';
|
||||
import type {Scope} from './scope';
|
||||
import {TypeCheckableDirectiveMeta} from '../../api';
|
||||
import {TcbDirectiveMetadata} from '../../api';
|
||||
import {Reference} from '../../../imports';
|
||||
import {ClassDeclaration} from '../../../reflection';
|
||||
import {tcbExpression} from './expression';
|
||||
@@ -135,7 +135,7 @@ export class TcbTemplateBodyOp extends TcbOp {
|
||||
private addDirectiveGuards(
|
||||
guards: TcbExpr[],
|
||||
hostNode: TmplAstTemplate | TmplAstDirective,
|
||||
directives: TypeCheckableDirectiveMeta[] | null,
|
||||
directives: TcbDirectiveMetadata[] | null,
|
||||
) {
|
||||
if (directives === null || directives.length === 0) {
|
||||
return;
|
||||
@@ -145,9 +145,7 @@ export class TcbTemplateBodyOp extends TcbOp {
|
||||
|
||||
for (const dir of directives) {
|
||||
const dirInstId = this.scope.resolve(hostNode, dir);
|
||||
const dirId = this.tcb.env.reference(
|
||||
dir.ref as Reference<ClassDeclaration<ts.ClassDeclaration>>,
|
||||
);
|
||||
const dirId = this.tcb.env.referenceTcbValue(dir.ref);
|
||||
|
||||
// There are two kinds of guards. Template guards (ngTemplateGuards) allow type narrowing of
|
||||
// the expression passed to an @Input of the directive. Scan the directive to see if it has
|
||||
|
||||
@@ -15,6 +15,7 @@ import {
|
||||
} from '@angular/compiler';
|
||||
import ts from 'typescript';
|
||||
|
||||
import {ErrorCode, FatalDiagnosticError, makeDiagnosticChain} from '../../diagnostics';
|
||||
import {
|
||||
assertSuccessfulReferenceEmit,
|
||||
ImportFlags,
|
||||
@@ -24,6 +25,7 @@ import {
|
||||
} from '../../imports';
|
||||
import {ReflectionHost} from '../../reflection';
|
||||
import {ImportManager, translateType} from '../../translator';
|
||||
import {TcbReferenceMetadata} from '../api';
|
||||
import {TcbExpr} from './ops/codegen';
|
||||
|
||||
/**
|
||||
@@ -35,7 +37,7 @@ import {TcbExpr} from './ops/codegen';
|
||||
export class ReferenceEmitEnvironment {
|
||||
constructor(
|
||||
readonly importManager: ImportManager,
|
||||
protected refEmitter: ReferenceEmitter,
|
||||
public refEmitter: ReferenceEmitter,
|
||||
readonly reflector: ReflectionHost,
|
||||
public contextFile: ts.SourceFile,
|
||||
) {}
|
||||
@@ -75,6 +77,52 @@ export class ReferenceEmitEnvironment {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a `ts.TypeNode` from a `TcbReferenceMetadata` object.
|
||||
* This is used by the TCB operations which do not hold on to the original `ts.Declaration`.
|
||||
*
|
||||
* Note: It's important that we do not try to evaluate the `typeParameters` here and pad them
|
||||
* out with `any` type arguments. If we supply `any` to a generic pipe (e.g. `var _pipe1: MyPipe<any>;`),
|
||||
* it destroys the generic constraints and degrades the `transform` signature. When they are omitted
|
||||
* entirely, TypeScript implicitly flags an error, which the Angular compiler filters out, and
|
||||
* crucially recovers by falling back to constraint inference (e.g. `var _pipe1: MyPipe;` infers
|
||||
* bounds safely).
|
||||
*/
|
||||
referenceTcbType(ref: TcbReferenceMetadata): ts.TypeNode {
|
||||
if (ref.unexportedDiagnostic !== null || ref.isLocal || ref.moduleName === null) {
|
||||
if (ref.unexportedDiagnostic !== null) {
|
||||
throw new FatalDiagnosticError(
|
||||
ErrorCode.IMPORT_GENERATION_FAILURE,
|
||||
this.contextFile, // Using context file as fallback origin for external file since we lack exact node
|
||||
makeDiagnosticChain(`Unable to import symbol ${ref.name}.`, [
|
||||
makeDiagnosticChain(ref.unexportedDiagnostic),
|
||||
]),
|
||||
);
|
||||
}
|
||||
return ts.factory.createTypeReferenceNode(ref.name);
|
||||
}
|
||||
return this.referenceExternalType(ref.moduleName, ref.name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a `TcbExpr` from a `TcbReferenceMetadata` object.
|
||||
*/
|
||||
referenceTcbValue(ref: TcbReferenceMetadata): TcbExpr {
|
||||
if (ref.unexportedDiagnostic !== null || ref.isLocal || ref.moduleName === null) {
|
||||
if (ref.unexportedDiagnostic !== null) {
|
||||
throw new FatalDiagnosticError(
|
||||
ErrorCode.IMPORT_GENERATION_FAILURE,
|
||||
this.contextFile,
|
||||
makeDiagnosticChain(`Unable to import symbol ${ref.name}.`, [
|
||||
makeDiagnosticChain(ref.unexportedDiagnostic),
|
||||
]),
|
||||
);
|
||||
}
|
||||
return new TcbExpr(ref.name);
|
||||
}
|
||||
return this.referenceExternalSymbol(ref.moduleName, ref.name);
|
||||
}
|
||||
|
||||
referenceExternalSymbol(moduleName: string, name: string): TcbExpr {
|
||||
const importResult = this.importManager.addImport({
|
||||
exportModuleSpecifier: moduleName,
|
||||
|
||||
@@ -0,0 +1,283 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright Google LLC All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by an MIT-style license that can be
|
||||
* found in the LICENSE file at https://angular.dev/license
|
||||
*/
|
||||
|
||||
import {
|
||||
TypeCheckBlockMetadata,
|
||||
TcbTypeCheckBlockMetadata,
|
||||
TcbComponentMetadata,
|
||||
TcbDirectiveMetadata,
|
||||
TcbReferenceMetadata,
|
||||
TcbInputMapping,
|
||||
TcbPipeMetadata,
|
||||
TypeCheckableDirectiveMeta,
|
||||
TcbTypeParameter,
|
||||
} from '../api';
|
||||
import {Environment} from './environment';
|
||||
import {ImportFlags, ReferenceEmitKind, Reference} from '../../imports';
|
||||
import {
|
||||
AbsoluteSourceSpan,
|
||||
ExternalExpr,
|
||||
TransplantedType,
|
||||
BoundTarget,
|
||||
DirectiveOwner,
|
||||
ReferenceTarget,
|
||||
TmplAstReference,
|
||||
TmplAstElement,
|
||||
TmplAstTemplate,
|
||||
WrappedNodeExpr,
|
||||
} from '@angular/compiler';
|
||||
import {ClassPropertyMapping, InputMapping} from '../../metadata';
|
||||
import {requiresInlineTypeCtor} from './type_constructor';
|
||||
import {tempPrint} from './ops/codegen';
|
||||
import {generateTcbTypeParameters} from './tcb_util';
|
||||
import {TypeParameterEmitter} from './type_parameter_emitter';
|
||||
import {ClassDeclaration} from '../../reflection';
|
||||
import ts from 'typescript';
|
||||
|
||||
/**
|
||||
* Adapts the compiler's `TypeCheckBlockMetadata` (which includes full TS AST nodes)
|
||||
* into a purely detached `TcbTypeCheckBlockMetadata` that can be mapped to JSON.
|
||||
*/
|
||||
export function adaptTypeCheckBlockMetadata(
|
||||
ref: Reference<ClassDeclaration<ts.ClassDeclaration>>,
|
||||
meta: TypeCheckBlockMetadata,
|
||||
env: Environment,
|
||||
): {tcbMeta: TcbTypeCheckBlockMetadata; component: TcbComponentMetadata} {
|
||||
const refCache = new Map<Reference<ClassDeclaration>, TcbReferenceMetadata>();
|
||||
const extractRef = (ref: Reference<ClassDeclaration>) => {
|
||||
if (refCache.has(ref)) {
|
||||
return refCache.get(ref)!;
|
||||
}
|
||||
const result = extractReferenceMetadata(ref, env);
|
||||
refCache.set(ref, result);
|
||||
return result;
|
||||
};
|
||||
|
||||
const dirCache = new Map<TypeCheckableDirectiveMeta, TcbDirectiveMetadata>();
|
||||
|
||||
const convertDir = (dir: TypeCheckableDirectiveMeta): TcbDirectiveMetadata => {
|
||||
if (dirCache.has(dir)) return dirCache.get(dir)!;
|
||||
|
||||
const tcbDir: TcbDirectiveMetadata = {
|
||||
isComponent: dir.isComponent,
|
||||
name: dir.name,
|
||||
selector: dir.selector,
|
||||
exportAs: dir.exportAs,
|
||||
inputs: ClassPropertyMapping.fromMappedObject<TcbInputMapping>(
|
||||
dir.inputs.toJointMappedObject((input: InputMapping) => {
|
||||
return {
|
||||
classPropertyName: input.classPropertyName,
|
||||
bindingPropertyName: input.bindingPropertyName,
|
||||
required: input.required,
|
||||
isSignal: input.isSignal,
|
||||
transformType: (() => {
|
||||
if (input.transform != null) {
|
||||
const node = env.referenceTransplantedType(
|
||||
new TransplantedType(input.transform.type),
|
||||
);
|
||||
return tempPrint(node, env.contextFile);
|
||||
}
|
||||
return undefined;
|
||||
})(),
|
||||
};
|
||||
}),
|
||||
),
|
||||
outputs: dir.outputs,
|
||||
isStructural: dir.isStructural,
|
||||
isStandalone: dir.isStandalone,
|
||||
isExplicitlyDeferred: dir.isExplicitlyDeferred,
|
||||
preserveWhitespaces: dir.preserveWhitespaces,
|
||||
ngContentSelectors: dir.ngContentSelectors,
|
||||
animationTriggerNames: dir.animationTriggerNames,
|
||||
ngTemplateGuards: dir.ngTemplateGuards,
|
||||
hasNgTemplateContextGuard: dir.hasNgTemplateContextGuard,
|
||||
hasNgFieldDirective:
|
||||
ts.isClassDeclaration(dir.ref.node) &&
|
||||
dir.ref.node.members.some(
|
||||
(member: ts.Node) =>
|
||||
ts.isPropertyDeclaration(member) &&
|
||||
ts.isComputedPropertyName(member.name) &&
|
||||
ts.isIdentifier(member.name.expression) &&
|
||||
member.name.expression.text === 'ɵNgFieldDirective',
|
||||
),
|
||||
coercedInputFields: dir.coercedInputFields,
|
||||
restrictedInputFields: dir.restrictedInputFields,
|
||||
stringLiteralInputFields: dir.stringLiteralInputFields,
|
||||
undeclaredInputFields: dir.undeclaredInputFields,
|
||||
publicMethods: dir.publicMethods,
|
||||
|
||||
ref: extractRef(dir.ref as Reference<ClassDeclaration>),
|
||||
isGeneric: dir.isGeneric,
|
||||
|
||||
typeParameters: (() => {
|
||||
const node = dir.ref.node as ClassDeclaration<ts.ClassDeclaration>;
|
||||
if (!node.typeParameters) {
|
||||
return null;
|
||||
}
|
||||
const emitter = new TypeParameterEmitter(node.typeParameters, env.reflector);
|
||||
let emitted: ts.TypeParameterDeclaration[] | undefined;
|
||||
if (!emitter.canEmit((ref) => env.canReferenceType(ref))) {
|
||||
emitted = [...node.typeParameters] as ts.TypeParameterDeclaration[];
|
||||
} else {
|
||||
emitted = emitter.emit((ref) => env.referenceType(ref));
|
||||
}
|
||||
return generateTcbTypeParameters(emitted || [], env.contextFile);
|
||||
})(),
|
||||
hasRequiresInlineTypeCtor: requiresInlineTypeCtor(
|
||||
dir.ref.node as ClassDeclaration<ts.ClassDeclaration>,
|
||||
env.reflector,
|
||||
env,
|
||||
),
|
||||
};
|
||||
|
||||
dirCache.set(dir, tcbDir);
|
||||
return tcbDir;
|
||||
};
|
||||
|
||||
const adaptedBoundTarget: BoundTarget<TcbDirectiveMetadata> = {
|
||||
target: (() => {
|
||||
const originalTarget = meta.boundTarget.target;
|
||||
return {
|
||||
template: originalTarget.template,
|
||||
host: originalTarget.host
|
||||
? {
|
||||
node: originalTarget.host.node,
|
||||
directives: originalTarget.host.directives.map(convertDir),
|
||||
}
|
||||
: undefined,
|
||||
};
|
||||
})(),
|
||||
getUsedDirectives: () => meta.boundTarget.getUsedDirectives().map(convertDir),
|
||||
getEagerlyUsedDirectives: () => meta.boundTarget.getEagerlyUsedDirectives().map(convertDir),
|
||||
getUsedPipes: () => meta.boundTarget.getUsedPipes(),
|
||||
getDirectivesOfNode: (node) => {
|
||||
const dirs = meta.boundTarget.getDirectivesOfNode(node);
|
||||
return dirs ? dirs.map(convertDir) : null;
|
||||
},
|
||||
getReferenceTarget: (ref) => {
|
||||
const target = meta.boundTarget.getReferenceTarget(ref);
|
||||
if (target && 'directive' in target) {
|
||||
return {
|
||||
directive: convertDir(target.directive as TypeCheckableDirectiveMeta),
|
||||
node: target.node,
|
||||
};
|
||||
}
|
||||
return target as ReferenceTarget<TcbDirectiveMetadata>;
|
||||
},
|
||||
getDeferredTriggerTarget: (b, t) => meta.boundTarget.getDeferredTriggerTarget(b, t),
|
||||
isDeferred: (node) => meta.boundTarget.isDeferred(node),
|
||||
referencedDirectiveExists: (name) => meta.boundTarget.referencedDirectiveExists(name),
|
||||
getConsumerOfBinding: (binding) => {
|
||||
const consumer = meta.boundTarget.getConsumerOfBinding(binding);
|
||||
if (consumer && (consumer as TypeCheckableDirectiveMeta).isComponent !== undefined) {
|
||||
return convertDir(consumer as TypeCheckableDirectiveMeta);
|
||||
}
|
||||
return consumer as TmplAstElement | TmplAstTemplate | null;
|
||||
},
|
||||
getExpressionTarget: (expr) => meta.boundTarget.getExpressionTarget(expr),
|
||||
getDefinitionNodeOfSymbol: (sym) => meta.boundTarget.getDefinitionNodeOfSymbol(sym),
|
||||
getNestingLevel: (node) => meta.boundTarget.getNestingLevel(node),
|
||||
getEntitiesInScope: (node) => meta.boundTarget.getEntitiesInScope(node),
|
||||
getEagerlyUsedPipes: () => meta.boundTarget.getEagerlyUsedPipes(),
|
||||
getDeferBlocks: () => meta.boundTarget.getDeferBlocks(),
|
||||
};
|
||||
|
||||
const pipes = new Map<string, TcbPipeMetadata>();
|
||||
if (meta.pipes !== null) {
|
||||
for (const pipeName of meta.boundTarget.getUsedPipes()) {
|
||||
if (!meta.pipes.has(pipeName) || pipes.has(pipeName)) {
|
||||
continue;
|
||||
}
|
||||
const pipe = meta.pipes.get(pipeName)!;
|
||||
pipes.set(pipeName, {
|
||||
name: pipe.name!,
|
||||
ref: extractRef(pipe.ref as Reference<ClassDeclaration>),
|
||||
isExplicitlyDeferred: pipe.isExplicitlyDeferred,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
tcbMeta: {
|
||||
id: meta.id,
|
||||
boundTarget: adaptedBoundTarget,
|
||||
pipes,
|
||||
schemas: meta.schemas,
|
||||
isStandalone: meta.isStandalone,
|
||||
preserveWhitespaces: meta.preserveWhitespaces,
|
||||
},
|
||||
component: (() => {
|
||||
return {
|
||||
ref: extractRef(ref as Reference<ClassDeclaration>),
|
||||
typeParameters: (() => {
|
||||
if (!ref.node.typeParameters) return null;
|
||||
const emitter = new TypeParameterEmitter(ref.node.typeParameters, env.reflector);
|
||||
let emitted: ts.TypeParameterDeclaration[] | undefined;
|
||||
if (!emitter.canEmit((r) => env.canReferenceType(r))) {
|
||||
emitted = [...ref.node.typeParameters] as ts.TypeParameterDeclaration[];
|
||||
} else {
|
||||
emitted = emitter.emit((r) => env.referenceType(r));
|
||||
}
|
||||
return generateTcbTypeParameters(emitted || [], env.contextFile);
|
||||
})(),
|
||||
};
|
||||
})(),
|
||||
};
|
||||
}
|
||||
|
||||
function extractReferenceMetadata(
|
||||
ref: Reference<ClassDeclaration>,
|
||||
env: Environment,
|
||||
): TcbReferenceMetadata {
|
||||
let name = ref.debugName || ref.node.name!.text;
|
||||
let moduleName = ref.ownedByModuleGuess;
|
||||
let unexportedDiagnostic: string | null = null;
|
||||
let isLocal = true;
|
||||
|
||||
const emitted = env.refEmitter.emit(ref, env.contextFile, ImportFlags.NoAliasing);
|
||||
if (emitted.kind === ReferenceEmitKind.Success) {
|
||||
if (emitted.expression instanceof ExternalExpr) {
|
||||
name = emitted.expression.value.name!;
|
||||
moduleName = emitted.expression.value.moduleName;
|
||||
isLocal = false;
|
||||
} else if (emitted.expression instanceof WrappedNodeExpr) {
|
||||
const node = emitted.expression.node;
|
||||
const extractedName = extractNameFromExpr(node);
|
||||
if (extractedName !== null) {
|
||||
name = extractedName;
|
||||
}
|
||||
}
|
||||
} else if (emitted.kind === ReferenceEmitKind.Failed) {
|
||||
unexportedDiagnostic = emitted.reason;
|
||||
isLocal = false;
|
||||
}
|
||||
|
||||
const refMeta: TcbReferenceMetadata = {
|
||||
name,
|
||||
moduleName,
|
||||
isLocal,
|
||||
unexportedDiagnostic,
|
||||
};
|
||||
const nodeName = ref.node?.name;
|
||||
if (nodeName) {
|
||||
refMeta.nodeNameSpan = new AbsoluteSourceSpan(nodeName.getStart(), nodeName.getEnd());
|
||||
refMeta.nodeFilePath = nodeName.getSourceFile().fileName;
|
||||
}
|
||||
|
||||
return refMeta;
|
||||
}
|
||||
|
||||
function extractNameFromExpr(node: ts.Node): string | null {
|
||||
if (ts.isIdentifier(node)) {
|
||||
return node.text;
|
||||
} else if (ts.isPropertyAccessExpression(node)) {
|
||||
const receiver = extractNameFromExpr(node.expression);
|
||||
return receiver !== null ? `${receiver}.${node.name.text}` : null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -12,12 +12,19 @@ import ts from 'typescript';
|
||||
import {ClassDeclaration, ReflectionHost} from '../../../../src/ngtsc/reflection';
|
||||
import {Reference} from '../../imports';
|
||||
import {getTokenAtPosition} from '../../util/src/typescript';
|
||||
import {FullSourceMapping, SourceLocation, TypeCheckId, SourceMapping} from '../api';
|
||||
import {
|
||||
FullSourceMapping,
|
||||
SourceLocation,
|
||||
TypeCheckId,
|
||||
SourceMapping,
|
||||
TcbTypeParameter,
|
||||
} from '../api';
|
||||
|
||||
import {hasIgnoreForDiagnosticsMarker, readSpanComment} from './comments';
|
||||
import {ReferenceEmitEnvironment} from './reference_emit_environment';
|
||||
import {TypeParameterEmitter} from './type_parameter_emitter';
|
||||
import {isHostBindingsBlockGuard} from './host_bindings';
|
||||
import {tempPrint} from './ops/codegen';
|
||||
|
||||
/**
|
||||
* External modules/identifiers that always should exist for type check
|
||||
@@ -296,3 +303,17 @@ export function findNodeInFile(
|
||||
};
|
||||
return ts.forEachChild(file, visit) ?? null;
|
||||
}
|
||||
|
||||
export function generateTcbTypeParameters(
|
||||
typeParameters: ReadonlyArray<ts.TypeParameterDeclaration>,
|
||||
sourceFile: ts.SourceFile,
|
||||
): TcbTypeParameter[] {
|
||||
return typeParameters.map((p) => {
|
||||
const representation = tempPrint(p, sourceFile);
|
||||
return {
|
||||
name: p.name.text,
|
||||
representation,
|
||||
representationWithDefault: p.default ? representation : `${representation} = any`,
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@@ -340,7 +340,9 @@ export class SymbolBuilder {
|
||||
return null;
|
||||
}
|
||||
|
||||
const directive = directives.find((m) => m.ref.node === directiveDeclaration);
|
||||
const directive = directives.find((m) =>
|
||||
isSameDirectiveDeclaration(m.ref.node, directiveDeclaration),
|
||||
);
|
||||
if (directive) {
|
||||
return directive;
|
||||
}
|
||||
@@ -361,7 +363,10 @@ export class SymbolBuilder {
|
||||
// If we find one, we look for it in the directives array
|
||||
const classWithSameName = findMatchingDirective(originalFile, directiveDeclaration);
|
||||
if (classWithSameName !== null) {
|
||||
return directives.find((m) => m.ref.node === classWithSameName) ?? null;
|
||||
return (
|
||||
directives.find((m) => isSameDirectiveDeclaration(m.ref.node, classWithSameName)) ??
|
||||
null
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -951,6 +956,30 @@ function unwrapSignalInputWriteTAccessor(expr: ts.LeftHandSideExpression): null
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether two directive declarations are the same.
|
||||
*
|
||||
* This function accounts for the fact that TypeScript might return different `ClassDeclaration`
|
||||
* instances for the same file, such as when resolving `ExternalExpr` imports from `tcb_adapter`s
|
||||
* `NoAliasing` emit flag.
|
||||
*/
|
||||
function isSameDirectiveDeclaration(
|
||||
a: ts.ClassDeclaration | ClassDeclaration,
|
||||
b: ts.ClassDeclaration | ClassDeclaration,
|
||||
): boolean {
|
||||
if (a === b) {
|
||||
return true;
|
||||
}
|
||||
const aName = a.name?.text;
|
||||
const bName = b.name?.text;
|
||||
return (
|
||||
aName !== undefined &&
|
||||
bName !== undefined &&
|
||||
aName === bName &&
|
||||
a.getSourceFile().fileName === b.getSourceFile().fileName
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Looks for a class declaration in the original source file that matches a given directive
|
||||
* from the type check source file.
|
||||
|
||||
@@ -8,14 +8,16 @@
|
||||
|
||||
import ts from 'typescript';
|
||||
|
||||
import {Reference} from '../../imports';
|
||||
import {ClassDeclaration} from '../../reflection';
|
||||
import {TypeCheckBlockMetadata} from '../api';
|
||||
import {
|
||||
TcbComponentMetadata,
|
||||
TcbTypeCheckBlockMetadata,
|
||||
TcbTypeParameter,
|
||||
TypeCheckId,
|
||||
} from '../api';
|
||||
|
||||
import {DomSchemaChecker} from './dom';
|
||||
import {Environment} from './environment';
|
||||
import {OutOfBandDiagnosticRecorder} from './oob';
|
||||
import {TypeParameterEmitter} from './type_parameter_emitter';
|
||||
import {createHostBindingsBlockGuard} from './host_bindings';
|
||||
import {Context, TcbGenericContextBehavior} from './ops/context';
|
||||
import {Scope} from './ops/scope';
|
||||
@@ -47,9 +49,9 @@ import {getStatementsBlock, tempPrint} from './ops/codegen';
|
||||
*/
|
||||
export function generateTypeCheckBlock(
|
||||
env: Environment,
|
||||
ref: Reference<ClassDeclaration<ts.ClassDeclaration>>,
|
||||
component: TcbComponentMetadata,
|
||||
name: ts.Identifier,
|
||||
meta: TypeCheckBlockMetadata,
|
||||
meta: TcbTypeCheckBlockMetadata,
|
||||
domSchemaChecker: DomSchemaChecker,
|
||||
oobRecorder: OutOfBandDiagnosticRecorder,
|
||||
genericContextBehavior: TcbGenericContextBehavior,
|
||||
@@ -65,17 +67,17 @@ export function generateTypeCheckBlock(
|
||||
meta.isStandalone,
|
||||
meta.preserveWhitespaces,
|
||||
);
|
||||
const ctxRawType = env.referenceType(ref);
|
||||
const ctxRawType = env.referenceTcbType(component.ref);
|
||||
if (!ts.isTypeReferenceNode(ctxRawType)) {
|
||||
throw new Error(
|
||||
`Expected TypeReferenceNode when referencing the ctx param for ${ref.debugName}`,
|
||||
`Expected TypeReferenceNode when referencing the ctx param for ${component.ref.name}`,
|
||||
);
|
||||
}
|
||||
|
||||
let typeParameters: ts.TypeParameterDeclaration[] | undefined = undefined;
|
||||
let typeArguments: ts.TypeNode[] | undefined = undefined;
|
||||
let typeParameters: TcbTypeParameter[] | undefined = undefined;
|
||||
let typeArguments: string[] | undefined = undefined;
|
||||
|
||||
if (ref.node.typeParameters !== undefined) {
|
||||
if (component.typeParameters !== undefined) {
|
||||
if (!env.config.useContextGenericType) {
|
||||
genericContextBehavior = TcbGenericContextBehavior.FallbackToAny;
|
||||
}
|
||||
@@ -83,22 +85,18 @@ export function generateTypeCheckBlock(
|
||||
switch (genericContextBehavior) {
|
||||
case TcbGenericContextBehavior.UseEmitter:
|
||||
// Guaranteed to emit type parameters since we checked that the class has them above.
|
||||
typeParameters = new TypeParameterEmitter(ref.node.typeParameters, env.reflector).emit(
|
||||
(typeRef) => env.referenceType(typeRef),
|
||||
)!;
|
||||
typeArguments = typeParameters.map((param) =>
|
||||
ts.factory.createTypeReferenceNode(param.name),
|
||||
);
|
||||
const emittedParams = component.typeParameters || [];
|
||||
typeParameters = emittedParams;
|
||||
typeArguments = typeParameters!.map((param) => param.name);
|
||||
break;
|
||||
case TcbGenericContextBehavior.CopyClassNodes:
|
||||
typeParameters = [...ref.node.typeParameters];
|
||||
typeArguments = typeParameters.map((param) =>
|
||||
ts.factory.createTypeReferenceNode(param.name),
|
||||
);
|
||||
const copiedParams = component.typeParameters ? [...component.typeParameters] : [];
|
||||
typeParameters = copiedParams;
|
||||
typeArguments = typeParameters!.map((param) => param.name);
|
||||
break;
|
||||
case TcbGenericContextBehavior.FallbackToAny:
|
||||
typeArguments = ref.node.typeParameters.map(() =>
|
||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),
|
||||
typeArguments = Array.from({length: component.typeParameters?.length ?? 0}).map(
|
||||
() => 'any',
|
||||
);
|
||||
break;
|
||||
}
|
||||
@@ -108,11 +106,11 @@ export function generateTypeCheckBlock(
|
||||
const typeParamsStr =
|
||||
typeParameters === undefined || typeParameters.length === 0
|
||||
? ''
|
||||
: `<${typeParameters.map((p) => tempPrint(p, sourceFile)).join(', ')}>`;
|
||||
: `<${typeParameters.map((p) => p.representation).join(', ')}>`;
|
||||
const typeArgsStr =
|
||||
typeArguments === undefined || typeArguments.length === 0
|
||||
? ''
|
||||
: `<${typeArguments.map((p) => tempPrint(p, sourceFile)).join(', ')}>`;
|
||||
: `<${typeArguments.join(', ')}>`;
|
||||
const typeRef = ts.isIdentifier(ctxRawType.typeName)
|
||||
? ctxRawType.typeName.text
|
||||
: tempPrint(ctxRawType.typeName, sourceFile);
|
||||
|
||||
@@ -18,6 +18,7 @@ import {Environment} from './environment';
|
||||
import {OutOfBandDiagnosticRecorder} from './oob';
|
||||
import {ensureTypeCheckFilePreparationImports} from './tcb_util';
|
||||
import {generateTypeCheckBlock} from './type_check_block';
|
||||
import {adaptTypeCheckBlockMetadata} from './tcb_adapter';
|
||||
import {TcbGenericContextBehavior} from './ops/context';
|
||||
import {getStatementsBlock, TcbExpr} from './ops/codegen';
|
||||
|
||||
@@ -30,6 +31,7 @@ import {getStatementsBlock, TcbExpr} from './ops/codegen';
|
||||
* hoists them to the top of the generated `ts.SourceFile`.
|
||||
*/
|
||||
export class TypeCheckFile extends Environment {
|
||||
readonly isTypeCheckFile = true;
|
||||
private nextTcbId = 1;
|
||||
private tcbStatements: string[] = [];
|
||||
|
||||
@@ -68,11 +70,12 @@ export class TypeCheckFile extends Environment {
|
||||
genericContextBehavior: TcbGenericContextBehavior,
|
||||
): void {
|
||||
const fnId = ts.factory.createIdentifier(`_tcb${this.nextTcbId++}`);
|
||||
const {tcbMeta, component} = adaptTypeCheckBlockMetadata(ref, meta, this);
|
||||
const fn = generateTypeCheckBlock(
|
||||
this,
|
||||
ref,
|
||||
component,
|
||||
fnId,
|
||||
meta,
|
||||
tcbMeta,
|
||||
domSchemaChecker,
|
||||
oobRecorder,
|
||||
genericContextBehavior,
|
||||
|
||||
@@ -10,30 +10,24 @@ import {R3Identifiers} from '@angular/compiler';
|
||||
import ts from 'typescript';
|
||||
|
||||
import {ClassDeclaration, ReflectionHost} from '../../reflection';
|
||||
import {TypeCtorMetadata} from '../api';
|
||||
import {TypeCtorMetadata, TcbTypeParameter} from '../api';
|
||||
|
||||
import {ReferenceEmitEnvironment} from './reference_emit_environment';
|
||||
import {checkIfGenericTypeBoundsCanBeEmitted} from './tcb_util';
|
||||
import {checkIfGenericTypeBoundsCanBeEmitted, generateTcbTypeParameters} from './tcb_util';
|
||||
import {quoteAndEscape, TcbExpr, tempPrint} from './ops/codegen';
|
||||
|
||||
export function generateTypeCtorDeclarationFn(
|
||||
env: ReferenceEmitEnvironment,
|
||||
meta: TypeCtorMetadata,
|
||||
nodeTypeRef: ts.EntityName,
|
||||
typeParams: ts.TypeParameterDeclaration[] | undefined,
|
||||
typeParams: TcbTypeParameter[] | undefined,
|
||||
): TcbExpr {
|
||||
const typeArgs = generateGenericArgs(typeParams);
|
||||
const typeRef = ts.isIdentifier(nodeTypeRef)
|
||||
? nodeTypeRef.text
|
||||
: tempPrint(nodeTypeRef, nodeTypeRef.getSourceFile());
|
||||
const typeRefWithGenerics = `${typeRef}${typeArgs}`;
|
||||
const initParam = constructTypeCtorParameter(
|
||||
env,
|
||||
meta,
|
||||
nodeTypeRef.getSourceFile(),
|
||||
typeRef,
|
||||
typeRefWithGenerics,
|
||||
);
|
||||
const initParam = constructTypeCtorParameter(env, meta, typeRef, typeRefWithGenerics);
|
||||
const typeParameters = typeParametersWithDefaultTypes(typeParams);
|
||||
let source: string;
|
||||
|
||||
@@ -91,20 +85,20 @@ export function generateInlineTypeCtor(
|
||||
// the definition without any type bounds. For example, if the class is
|
||||
// `FooDirective<T extends Bar>`, its rawType would be `FooDirective<T>`.
|
||||
const typeRef = node.name.text;
|
||||
const typeRefWithGenerics = `${typeRef}${generateGenericArgs(node.typeParameters)}`;
|
||||
const initParam = constructTypeCtorParameter(
|
||||
env,
|
||||
meta,
|
||||
node.getSourceFile(),
|
||||
typeRef,
|
||||
typeRefWithGenerics,
|
||||
);
|
||||
const sourceFile = node.getSourceFile();
|
||||
const tcbTypeParams =
|
||||
node.typeParameters && node.typeParameters.length > 0
|
||||
? generateTcbTypeParameters(node.typeParameters, sourceFile)
|
||||
: undefined;
|
||||
|
||||
const typeRefWithGenerics = `${typeRef}${generateGenericArgs(tcbTypeParams)}`;
|
||||
const initParam = constructTypeCtorParameter(env, meta, typeRef, typeRefWithGenerics);
|
||||
|
||||
// If this constructor is being generated into a .ts file, then it needs a fake body. The body
|
||||
// is set to a return of `null!`. If the type constructor is being generated into a .d.ts file,
|
||||
// it needs no body.
|
||||
const body = `{ return null!; }`;
|
||||
const typeParams = typeParametersWithDefaultTypes(node.typeParameters);
|
||||
const typeParams = typeParametersWithDefaultTypes(tcbTypeParams);
|
||||
|
||||
// Create the type constructor method declaration.
|
||||
return `static ${meta.fnName}${typeParams}(${initParam}): ${typeRefWithGenerics} ${body}`;
|
||||
@@ -113,7 +107,6 @@ export function generateInlineTypeCtor(
|
||||
function constructTypeCtorParameter(
|
||||
env: ReferenceEmitEnvironment,
|
||||
meta: TypeCtorMetadata,
|
||||
sourceFile: ts.SourceFile,
|
||||
typeRef: string,
|
||||
typeRefWithGenerics: string,
|
||||
): string {
|
||||
@@ -132,15 +125,15 @@ function constructTypeCtorParameter(
|
||||
const coercedKeys: string[] = [];
|
||||
const signalInputKeys: string[] = [];
|
||||
|
||||
for (const {classPropertyName, transform, isSignal} of meta.fields.inputs) {
|
||||
for (const {classPropertyName, transformType, isSignal} of meta.fields.inputs) {
|
||||
if (isSignal) {
|
||||
signalInputKeys.push(quoteAndEscape(classPropertyName));
|
||||
} else if (!meta.coercedInputFields.has(classPropertyName)) {
|
||||
plainKeys.push(quoteAndEscape(classPropertyName));
|
||||
} else {
|
||||
const coercionType =
|
||||
transform != null
|
||||
? tempPrint(transform.type.node, sourceFile)
|
||||
transformType !== undefined
|
||||
? transformType
|
||||
: `typeof ${typeRef}.ngAcceptInputType_${classPropertyName}`;
|
||||
|
||||
coercedKeys.push(`${classPropertyName}: ${coercionType}`);
|
||||
@@ -180,14 +173,12 @@ function constructTypeCtorParameter(
|
||||
return `init: ${initType}`;
|
||||
}
|
||||
|
||||
function generateGenericArgs(
|
||||
typeParameters: ReadonlyArray<ts.TypeParameterDeclaration> | undefined,
|
||||
): string {
|
||||
function generateGenericArgs(typeParameters: ReadonlyArray<TcbTypeParameter> | undefined): string {
|
||||
if (typeParameters === undefined || typeParameters.length === 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return `<${typeParameters.map((param) => param.name.text).join(', ')}>`;
|
||||
return `<${typeParameters.map((param) => param.name).join(', ')}>`;
|
||||
}
|
||||
|
||||
export function requiresInlineTypeCtor(
|
||||
@@ -245,22 +236,11 @@ export function requiresInlineTypeCtor(
|
||||
* This correctly infers `T` as `any`, and therefore `_t3` as `NgFor<any>`.
|
||||
*/
|
||||
function typeParametersWithDefaultTypes(
|
||||
params: ReadonlyArray<ts.TypeParameterDeclaration> | undefined,
|
||||
params: ReadonlyArray<TcbTypeParameter> | undefined,
|
||||
): string {
|
||||
if (params === undefined || params.length === 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const paramStrings = params.map((param) => {
|
||||
const constraint = param.constraint
|
||||
? ` extends ${tempPrint(param.constraint, param.getSourceFile())}`
|
||||
: '';
|
||||
const defaultValue = ` = ${
|
||||
param.default ? tempPrint(param.default, param.getSourceFile()) : 'any'
|
||||
}`;
|
||||
|
||||
return `${param.name.text}${constraint}${defaultValue}`;
|
||||
});
|
||||
|
||||
return `<${paramStrings.join(', ')}>`;
|
||||
return `<${params.map((param) => param.representationWithDefault).join(', ')}>`;
|
||||
}
|
||||
|
||||
@@ -247,6 +247,30 @@ runInEachFileSystem(() => {
|
||||
]);
|
||||
});
|
||||
|
||||
it('infers generic pipe return types correctly and avoids expanding to strict undefined errors', () => {
|
||||
const messages = diagnose(
|
||||
`<div>{{ person?.name | pipe:person?.age }}</div>`,
|
||||
`
|
||||
class Pipe<T> {
|
||||
transform(value: T, a: number | undefined): T { return value; }
|
||||
}
|
||||
class TestComponent {
|
||||
person?: {
|
||||
name: string;
|
||||
age: number;
|
||||
};
|
||||
}`,
|
||||
[{type: 'pipe', name: 'Pipe', pipeName: 'pipe', isGeneric: true}],
|
||||
);
|
||||
|
||||
// If the pipe was instantiated with explicit \`any\` generic bounds (e.g. \`var _pipe1 = null! as i0.Pipe<any>\`),
|
||||
// the \`transform\` method evaluates the \`value: T\` parameter as \`value: any\`. This would break strict null
|
||||
// checking against the optional chaining \`person?.name\` -> \`string | undefined\`.
|
||||
// Instead, by dropping the generic arguments, TS evaluates the \`transform\` bound lazily, allowing the pipe to
|
||||
// successfully extract \`string | undefined\` out of the first argument without union conflicts.
|
||||
expect(messages).toEqual([]);
|
||||
});
|
||||
|
||||
it('does not repeat diagnostics for missing pipes in directive inputs', () => {
|
||||
// The directive here is structured so that a type constructor is used, which results in each
|
||||
// input binding being processed twice. This results in the 'uppercase' pipe being resolved
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user